遇到的問題,項目中主控程序運行一段時間後,時間有時長有時短便會進入HardFault,通過調試發現進入HardFault的原因是程序進入了OSStartHang異常,網上大部分貼子的介紹如下:
1、因爲STM32本身的異常中斷PendSV_Handler替代了UCOS的異常中斷OSPendSV,使其不能正常執行。這樣我們就需要更改PendSV_Handler爲OSPendSV以讓中斷正常。
方法如下:
—startup_stm32f10x_cl.s中定義了中斷向量表(中斷函數的入口地址)
—stm32f10x_it.c 中斷服務函數的C語言代碼。
在startup_stm32f10x_cl.s中有兩段代碼如下:
DCD PendSV_Handler
DCD SysTick_Handler
在stm32f10x_it.c中的服務函數如下
void PendSV_Handler(void)
void SysTick_Handler(void)
1:ucos系統中斷函數更名爲PendSV_Handler,註釋掉stm32f10x_it.c文件中void PendSV_Handler(void)函數。
2:在void SysTick_Handler(void)函數中添加如下代碼:
void SysTick_Handler(void)
{
OS_EXIT_CRITICAL();
OSTimeTick(); // Call uC/OS-II’s OSTimeTick()
OSIntExit(); // Tell uC/OS-II that we are leaving the ISR
}
2、如果你是連JTAG調試時偶爾出現的這種情況,不連JTAG板子自己跑時沒問題,那麼你可以忽略這個問題,因爲CONTEX-M3的內核用JTAG調試時偶爾會這樣,具體原因不詳,可能是JTAG鏈不夠健壯吧。