一 上电后未清零的RAM栈空间 以下图为例,工程配置栈大小0x800;查询map文件,栈顶地址0x20002960; 为查看上电后的栈区状态,防止应用代码过多使用栈区空间,进入main后即执行while(1)死循环。 栈空间0x20003160~20002960,一共2k字节,可以看到都是随机数据。如果此时发生死机,很难从ram栈区内容直观看到堆栈是否异常。 二 C代码方式清零栈 原理是在执行main前,会执行SystemInit函数,可以在SystemInit函数中根据栈顶地址和栈大小,使用memset清零除栈。
可以通过map文件查看栈顶地址,根据栈配置的大小确认栈底地址。
效果: #define STACK_SIZE 0x800 三、汇编方式清零栈,这种方法需要修改启动文件 /** 汇编清除关键代码,水平有限仅供参考 */
附件是增加了栈区清零操作的启动文件,需要在启动文件中同步 Stack_Size_For_Clear宏,与SCT链接脚本文件中定义的栈区大小一致。 |