yayagepei 发表于 2018-9-7 21:47:04

全局变量与局部变量在SRAM中的地址分配冲突该如何解决?

最近在排一个AVR 128单片机程序故障时发现,全局变量与局部变量在SRAM中的地址分配冲突,全局变量是已经分配好的,而局部变量是执行时临时分配的,没想到现在竟然冲突了,之前从未遇到过,不知道该怎么解决了,不知坛里的大神们是否也遇到过,有什么解决办法没?忘不吝赐教!非常感谢!

浮华一生 发表于 2018-9-7 21:57:32

汇编么。。。。 C的话,这不是编译器干的活啊。

chendaon 发表于 2018-9-7 22:05:36

编译器有bug?多弄成全局

zouzhichao 发表于 2018-9-7 22:14:41

栈溢出了?

zouzhichao 发表于 2018-9-7 22:15:14

在函数里定义了大数组吧?

Jacky.Qiu 发表于 2018-9-7 22:44:18

你的Link配置文件是否可以定义Stack的大小?可能设置为0,就放到全局RAM里面了。

bolizhicheng204 发表于 2018-9-7 22:47:18

明显是栈空间溢出了

wye11083 发表于 2018-9-8 07:00:29

Jacky.Qiu 发表于 2018-9-7 22:44
你的Link配置文件是否可以定义Stack的大小?可能设置为0,就放到全局RAM里面了。 ...

stack本来就在ram里面啊。否则执行个毛线。

saccapanna 发表于 2018-9-8 07:51:01

全局变量,地址是编译器连接时分配的。局部变量,我理解为函数里面非静态存储的变量,这个变量是在栈空间分配的。栈空间大小是可以自己定义的,在栈溢出的情况下,地址不会一样。最好贴代码看看,还有你看到地址相同的调试记录抓屏。

asj1989 发表于 2018-9-8 09:13:32

这种情况一般都是数组溢出了,或者局部变量定义的太大,栈溢出了,你吧局部变量都定义成全局变量就行了。

lingdianhao 发表于 2018-9-8 09:19:04

函数里面有大数组,或栈空间设置太小导致栈溢出,编译器并不会检测你栈用了多少,因为栈是动态的,可能你每次进函数得到的局部变量地址都不一样的。
典型的代码设计缺陷,可以将栈适当加大,或者把局部变量的数组换成全局变量,统一分配地址,如果空间不够编译器会报警的。

john78 发表于 2018-9-8 09:44:51

堆栈溢出?LZ什么编译器? 全局变量怎么分配的?汇编?C? BASIC...

xzhiwei 发表于 2018-9-8 09:47:18

楼主怎么确定是地址冲突?

yayagepei 发表于 2018-9-8 20:45:25

john78 发表于 2018-9-8 09:44
堆栈溢出?LZ什么编译器? 全局变量怎么分配的?汇编?C? BASIC...

CVAVR编译器,用的是C语言

yayagepei 发表于 2018-9-8 20:49:45

asj1989 发表于 2018-9-8 09:13
这种情况一般都是数组溢出了,或者局部变量定义的太大,栈溢出了,你吧局部变量都定义成全局变量就行了。 ...

嗯嗯,明天我试试哈,先谢谢了{:handshake:}

yayagepei 发表于 2018-9-8 20:50:24

xzhiwei 发表于 2018-9-8 09:47
楼主怎么确定是地址冲突?

在调试的时候,把变量到窗口里面看的

yayagepei 发表于 2018-9-8 20:51:14

lingdianhao 发表于 2018-9-8 09:19
函数里面有大数组,或栈空间设置太小导致栈溢出,编译器并不会检测你栈用了多少,因为栈是动态的,可能你每 ...

好的,我试试
页: [1]
查看完整版本: 全局变量与局部变量在SRAM中的地址分配冲突该如何解决?