高手救命呀!!!

[复制链接]
2725|11
 楼主| haha01 发表于 2011-6-10 15:27 | 显示全部楼层

局部变量 修改了 全局变量???

我在STM32中发现了这样一个问题:一个函数的局部变量在定义的时候,比如说 FLOAT P[4][32] = {0};                                         
FLOAT py[4][4] = {0}; 然后发现全局变量数组的值被改变了,谁知道这是怎么回事呀? code = 24468,RO-data=356,ZI-data=4772,我用的编译器是Keil uV3,我发现全局变量的地址是:0X20000D14,局部变量的地址是:0X20000CC4,是不是我的内存不够了?请教高手呀,多谢多谢!
 楼主| haha01 发表于 2011-6-10 15:32 | 显示全部楼层 |阅读模式
我在STM32中发现了这样一个问题:一个函数的局部变量在定义的时候,比如说 FLOAT P[4][32] = {0};  FLOAT py[4][4] = {0}; 然后发现全局变量数组的值被改变了,谁知道这是怎么回事呀? code = 24468,RO-data=356,ZI-data=4772,我用的编译器是Keil uV3,我发现全局变量的地址是:0X20000D14,局部变量的地址是:0X20000CC4,是不是我的内存不够了?请教高手呀,多谢多谢!
huangqi412 发表于 2011-6-10 16:26 | 显示全部楼层
没看太明白。。
一个函数的局部变量在定义的时候,比如说 FLOAT P[4][32] = {0};  FLOAT py[4][4] = {0}; 然后发现全局变量数组的值被改变了,
香水城 发表于 2011-6-10 16:54 | 显示全部楼层
一般局部变量都是被分配到堆栈中,FLOAT P[4][32] 需要很大的堆栈区,估计你的堆栈溢出了。

建议最好不要定义很大的局部变量。
 楼主| haha01 发表于 2011-6-10 16:56 | 显示全部楼层
补充下:就是我在单步调试的时候,跑到了一个函数里,函数中定义了FLOAT P[4][32] = {0};  FLOAT py[4][4] = {0}; ,然后发现一个全局数组(假如说A)的值被修改了,修改的顺序为:从A[10] 到 A[1],随着变量的定义,依次被修改,改成0了。请问有人遇到过这个问题吗?
 楼主| haha01 发表于 2011-6-10 17:48 | 显示全部楼层
我试了一下,如果将FLOAT P[4][32] = {0};放在函数外面,就是变成全局变量,那么函数的值都也被改写了。郁闷呀。
sinadz 发表于 2011-6-10 20:07 | 显示全部楼层
估计是堆栈溢出了
hgjinwei 发表于 2011-6-11 15:30 | 显示全部楼层
全局变量的地址是:0X20000D14,
局部变量的地址是:0X20000CC4,
MDK 中堆栈是向下生长的,局部变量跑到全局变量下,所以绝对是堆栈溢出了。
“如果将FLOAT P[4][32] = {0};放在函数外面,就是变成全局变量,那么函数的值都也被改写了。”这句不懂,什么叫“函数的值都也被改写了”?
关聿 发表于 2011-6-11 20:23 | 显示全部楼层
估计是堆栈溢出了,你使用芯片的RAM是多大的,若是比较大的,建议把define symbol __ICFEDIT_size_cstack__   = 0x400;   改大一些。
 楼主| haha01 发表于 2011-6-13 09:27 | 显示全部楼层
函数的值都也被改写了,就是函数计算的结果完全不对。全局变量P[4][32]还是被改写了。
 楼主| haha01 发表于 2011-6-13 10:03 | 显示全部楼层
请问在Keil中如何修正堆栈溢出呢?
 楼主| haha01 发表于 2011-6-13 15:40 | 显示全部楼层
果然是栈溢出,多谢各位!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部