打印

高手救命呀!!!

[复制链接]
1829|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] 需要很大的堆栈区,估计你的堆栈溢出了。

建议最好不要定义很大的局部变量。

使用特权

评论回复
5
haha01|  楼主 | 2011-6-10 16:56 | 只看该作者
补充下:就是我在单步调试的时候,跑到了一个函数里,函数中定义了FLOAT P[4][32] = {0};  FLOAT py[4][4] = {0}; ,然后发现一个全局数组(假如说A)的值被修改了,修改的顺序为:从A[10] 到 A[1],随着变量的定义,依次被修改,改成0了。请问有人遇到过这个问题吗?

使用特权

评论回复
6
haha01|  楼主 | 2011-6-10 17:48 | 只看该作者
我试了一下,如果将FLOAT P[4][32] = {0};放在函数外面,就是变成全局变量,那么函数的值都也被改写了。郁闷呀。

使用特权

评论回复
7
sinadz| | 2011-6-10 20:07 | 只看该作者
估计是堆栈溢出了

使用特权

评论回复
8
hgjinwei| | 2011-6-11 15:30 | 只看该作者
全局变量的地址是:0X20000D14,
局部变量的地址是:0X20000CC4,
MDK 中堆栈是向下生长的,局部变量跑到全局变量下,所以绝对是堆栈溢出了。
“如果将FLOAT P[4][32] = {0};放在函数外面,就是变成全局变量,那么函数的值都也被改写了。”这句不懂,什么叫“函数的值都也被改写了”?

使用特权

评论回复
9
关聿| | 2011-6-11 20:23 | 只看该作者
估计是堆栈溢出了,你使用芯片的RAM是多大的,若是比较大的,建议把define symbol __ICFEDIT_size_cstack__   = 0x400;   改大一些。

使用特权

评论回复
10
haha01|  楼主 | 2011-6-13 09:27 | 只看该作者
函数的值都也被改写了,就是函数计算的结果完全不对。全局变量P[4][32]还是被改写了。

使用特权

评论回复
11
haha01|  楼主 | 2011-6-13 10:03 | 只看该作者
请问在Keil中如何修正堆栈溢出呢?

使用特权

评论回复
12
haha01|  楼主 | 2011-6-13 15:40 | 只看该作者
果然是栈溢出,多谢各位!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

1

粉丝