分享一种栈溢出检查机制(硬件),适用于所有cm3芯片,只需对现有工程作四步修改
分享一种栈溢出检查机制(硬件),适用于所有cm3芯片,只需对现有工程作四步修改
一.需求
1.造成主栈(MSP)溢出的原因有很多,如过多的定义局部变量,递归调用,中断嵌套等都有可能会导致主栈溢出。
2.主栈溢出后会对其他内存空间做恶意修改,导致不可预料的后果
3.stm32不具备MPU,没有对内存进行保护的硬件机制
4.软件检测栈溢出有其局限性
二.实现原理
1.将主栈的栈底定位在0x20000000处,当主栈溢出时将导致数据被push到低于0x20000000的非法区域,从而触发HardFault异常
2.由于进入HardFault_Handler后栈有可能已经溢出了,C语言的运行环境可能已不存在,故HardFault_Handler需要改用汇编来实现,在HardFault_Handler
中先根据LR的值判断当前使用的栈是主MSP还是PSP,然后检查BFSR==0x00000092 MMAR==0x1FFFFFFC SP<0x20000000
这三个条件是否同时满足,如果同时满足则可判断主栈确实溢出了,否则可判断出不是因为栈溢出而触发的HardFault异常可以调用C语言实现的
HardFaultShow函数,打印出相关的寄存器的值以及其每个含义位的值帮助我们分析产生HardFault的其他原因
三.添加步骤
1.将STM32F10x.s中的
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
改为
AREA |.ARM.__AT_0x20000000|, DATA, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
2.在STM32F10x.s中增加一个RO段
AREA STKV, DATA, READONLY
STK_OV_MSG DCB "MAIN STACK OVERFLOW!",0
3.将STM32F10x.s中的
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
改为
BFSR EQU 0xE000ED29
MMAR EQU 0xE000ED34
STKVBFSR EQU 0x00000092
STKVMMAR EQU 0x1FFFFFFC