STM32進入HardFault_Handler調試
背景
工程要移植RTOS,以做業務改進。
移植了FreeRTOS,發現沒有執行程序;在線仿真的時候,發現PC走到SystemInit
,第一條語句還沒執行完就進入了HardFault_Handler
。
分析
1、檢查了startup_stm32xxx.s
,有對SVC_Handler
等入口進行處理。而且程序是還沒走到vTaskStartScheduler
就出問題的。
仔細查閱了網上的資料,STM32出現HardFault_Handler故障的原因主要有兩個方面:
- 內存溢出或者訪問越界。
- 堆棧溢出,增加堆棧的大小。
2、用keil的仿真,根據PC與MSP、PSP的值找對應的錯誤現場。但由於是一執行C語句就異常的,所以這個方法沒用。
3、回顧自己的操作記錄。
想起自己在移植的時候,因為出現了Error: L6406E: No space in execution regions with .ANY selector matching xx.o(.bss).
,於是改大了IARM1
的size為0xF0000
。超出了可訪問的范圍。改回原來的0xFF00
以后程序又編譯不過。
想起FreeRTOSConfig.h
中有對於棧大小的配置,於是將configTOTAL_HEAP_SIZE
改小為( ( size_t ) ( 5 * 1024 ) )
問題解決,順利跑起來。
start_task
start_task
start_task