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