本帖最后由 sedatefire 于 2013-7-6 14:33 编辑
本文描述一个keil uvision4在链接环节的重大隐患,会导致栈溢出,覆盖了用户全局变量空间。Cortex M3和M0系列这几年迅猛发展,相信使用M3和M0的工程师也不少了,诸位如果遇到系统变量莫名被修改的话,不妨来看看是否这个原因。
以STM32F103xx的一个scat档为例,keil默认的链接写法如下
。。。。
本文提纲如下
一.keil默认scat档分析
1.指出其栈空间的分配,紧挨在系统变量区域后面。
scat文件如下
map部分内容如下
2.栈如果分配不够,编译器是不会报警的,这不像c51那样是静态分析。
一个栈溢出的编译结果
c51的静态分析
3.栈的地址是压栈递减的,很容易就“溢出”覆盖系统变量区域的。
栈递减的测试代码如下,证明...
悄悄覆盖系统变量的代码如下,看map分析
二、提出DIY的scat档写法,将栈的空间放到芯片型号ram空间的最后面即可。
把栈隔开
三、keil编译器为何这样做的原因猜想。
为了通用,因为每一个M3的mcu的RAM空间大小都是不同的,无法做到面面俱到。
PS:未接贴,一直提醒,赶快过来重新编辑下
其实就是一句话,M3的官方程序在跳转之前,对栈指针进行了初始化。
这个初始化的值,填得不妥,会导致系统崩溃。
因为跳转的时候,还执行了pop指令。
在满足xxx的条件下,就会出现指针地址溢出,非法,导致总线错误,系统当机。
为了解释这个事情,我得交代好多基础知识给新手啊。
|