6626清零栈区参考方法

arnold · 85次点击 · 1个月前

一 上电后未清零的RAM栈空间

  以下图为例,工程配置栈大小0x800;查询map文件,栈顶地址0x20002960;

  为查看上电后的栈区状态,防止应用代码过多使用栈区空间,进入main后即执行while(1)死循环。

  栈空间0x20003160~20002960,一共2k字节,可以看到都是随机数据。如果此时发生死机,很难从ram栈区内容直观看到堆栈是否异常。

image.png

二 C代码方式清零栈

    原理是在执行main前,会执行SystemInit函数,可以在SystemInit函数中根据栈顶地址和栈大小,使用memset清零除栈。

    

    image.png

   可以通过map文件查看栈顶地址,根据栈配置的大小确认栈底地址。

    image.png

   效果:

    #define STACK_SIZE         0x800
    #define STACK_BOTTOM_ADDR  0x20002960
    uint32_t *p  = (volatile uint32_t *)(STACK_BOTTOM_ADDR);
    memset(p, 0, 0x800);

image.png

三、汇编方式清零栈,这种方法需要修改启动文件

/** 汇编清除关键代码,水平有限仅供参考 */
#if (STACK_CLEAR)        
Startstack_Zeroinit:
MOV r0,#0    /* clear r0 */
LDR r1, =__INITIAL_SP /* stack top addr */
MOV r2, #Stack_Size_For_Clear
B    zero_loop

zero_loop:
str  r0,[r1]
SUBS r1,r1,#4
SUBS r2,r2,#4

CMP  r2,r0
BNE  zero_loop
STR  r0,[r1]   /* last stack top clear */
B  Lable_test
#endif

    image.png

附件是增加了栈区清零操作的启动文件,需要在启动文件中同步 Stack_Size_For_Clear宏,与SCT链接脚本文件中定义的栈区大小一致。

startup-202407196032.S
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站