stm32 栈溢检测c语言,栈溢出检查机制

分享一种栈溢出检查机制(硬件),适用于所有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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值