STM32 局部变量压住全局变量地址 原因分析

在做项目的时候,遇到一个情况,我是用的是ucosii系统,从OSTime获取时间,可是OSTime总是莫名其妙突变,比如1,2,3,939528300觉得很奇怪,怎么会突然突变呢。后来在调试模式下排查发现以下几个可疑点:

1.OSTime是个全局变量,地址是0x2400B5A4,长度四个字节

2.断点进入了一个局部变量里,int a, &a=0x2400B5A7 ,正好压住了OSTime的最高字节,导致OSTime跳变。

这是什么问题,典型的栈空间申请过小导致。 

下面科普一下堆栈知识:

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数返回值、局部变量等,其操作方式类似于数据结构中的栈。
(2)堆区(heap):由程序员分配管理,比如malloc。
(3)全局区与静态区:存储全局变量和静态变量,其中初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
(4)文字常量区:常量字符串存放。
(5)程序代码区:存放程序代码。

data段,bss段,heap段,stack段。包含对应上面所说的(1)(2)(3)。constdata(常量),和函数代码,对应上面的(4)(5);

data指的是初始化不为0的全局或静态(static)变量。bss指的是没有初始化,或者初始化为0的全局或静态变量。

看明白了吧,说白了局部变量放在栈里,把heap设置大点就好了

转载于:https://my.oschina.net/u/2252538/blog/3079844

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值