迅维网

标题: STM32堆栈溢出会出现的问题及溢出原因分析和解决方法 [打印本页]

作者: バ幸福De右岸    时间: 2016-12-9 15:07
标题: STM32堆栈溢出会出现的问题及溢出原因分析和解决方法
在开发过程中,我们有时候可能会遇到数据错误的情况,而这个情况发生多数是由于堆栈溢出导致,这里我们将详细讲解复现堆栈溢出会导致的问题及提供相应的解决方法。

1 .建立一个测试工程

                               
登录/注册后看高清大图
定义主函数

                               
登录/注册后看高清大图
定义堆栈地址大小,分别都定义为0x00000200

                               
登录/注册后看高清大图
编译后查看生成的.map文件,可以看到栈起始地址为0x20000d50,大小为512byte

2. 理论计算分析
程序定义了全局变量大小为32位(对应4字节)的700个数据,所以全局变量占用RAM空间计算:
G=0x20000000 + 4*700 = 0x20000AF0

由于栈地址是向下生长方式,我们定义了局部变量数据大小为50032位的数,所以实际运行时局部变量占用RAM的起始地址为:
L=0x20000D50 + 512 – 4*500 = 0x20000780
所以局部变量占用RAM的地址范围为:0x20000780 --- 0x20000F50

由上计算可知,局部变量部分地址空间与全局变量使用的地址空间有冲突,这将导致程序运行过程全局变量数值被局部变量替换掉。

3. 测试论证
程序运行测试如下图所示:

                               
登录/注册后看高清大图

                               
登录/注册后看高清大图
全局变量初始化完成

                               
登录/注册后看高清大图
初始化局部变量,由上图可看出原来全局变量的数值已被局部变量替换

4. 解决方法
4.1 理论计算
由之前可以算出局部变量使用了2000byte的RAM地址空间,由于堆栈地址设置要求是0x0100的整数倍,所以这里可以将大小设置为0x0800,即2048个字节数据。

4.2 设置栈空间大小
改大栈空间大小,如下图所示:

                               
登录/注册后看高清大图
修改栈空间大小后查看生成的.map文件,如下图所示:

                               
登录/注册后看高清大图

4.3 修改后测试验证

                               
登录/注册后看高清大图
由上图测试可以知道,局部变量存储地址已经从0x20000D80开始,与全局变量存储地址不冲突,至此可以解决遇到的堆栈溢出问题。






欢迎光临 迅维网 (https://www.chinafix.com/) Powered by Discuz! X3.4