在作项目的时候,遇到一个状况,我是用的是ucosii系统,从OSTime获取时间,但是OSTime老是莫名其妙突变,好比1,2,3,939528300以为很奇怪,怎么会忽然突变呢。后来在调试模式下排查发现如下几个可疑点:程序员
1.OSTime是个全局变量,地址是0x2400B5A4,长度四个字节数据结构
2.断点进入了一个局部变量里,int a, &a=0x2400B5A7 ,正好压住了OSTime的最高字节,致使OSTime跳变。函数
这是什么问题,典型的栈空间申请太小致使。 spa
下面科普一下堆栈知识:调试
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数与返回值、局部变量等,其操做方式相似于数据结构中的栈。
(2)堆区(heap):由程序员分配管理,好比malloc。
(3)全局区与静态区:存储全局变量和静态变量,其中初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域。
(4)文字常量区:常量字符串存放。
(5)程序代码区:存放程序代码。字符串
data段,bss段,heap段,stack段。包含对应上面所说的(1)(2)(3)。constdata(常量),和函数代码,对应上面的(4)(5);编译器
data指的是初始化不为0的全局或静态(static)变量。bss指的是没有初始化,或者初始化为0的全局或静态变量。编译
看明白了吧,说白了局部变量放在栈里,把heap设置大点就行了变量