stardust2018 发表于 2018-9-14 10:57

LPC1788全局变量不能随便放置

IDE用的keil5,在LPC1788上开发的时候,定义了一个全局变量,放到A文件,编译下载能正常运行,放到B文件,编译下载就不能正常运行。看了一下map文件,全局变量放到不同文件时,map里面的变量地址确实不一样,但是不知道为什么会出现这种情况。

Program Size: Code=104872 RO-data=4148 RW-data=277136 ZI-data=80632

ayb_ice 发表于 2018-9-14 10:59

有关系吗

stardust2018 发表于 2018-9-14 11:04

ayb_ice 发表于 2018-9-14 10:59
有关系吗

就是不知道有什么关系

ayb_ice 发表于 2018-9-14 11:12

stardust2018 发表于 2018-9-14 11:04
就是不知道有什么关系

没有关系,编译器自动分配

stardust2018 发表于 2018-9-14 11:17

ayb_ice 发表于 2018-9-14 11:12
没有关系,编译器自动分配

也不全是,可以用分散加载文件干预一下

xyz549040622 发表于 2018-9-14 11:22

和使用不当有关,没关系。

stardust2018 发表于 2018-9-14 11:25

xyz549040622 发表于 2018-9-14 11:22
和使用不当有关,没关系。

嗯 您说的对肯定是自己有地方用得不好...

stardust2018 发表于 2018-9-14 11:34

程序比较大用到 BootLoader用到了lwip用了外扩内存,然后全局变量有点多为了便于管理把大部分的全局变量放到了 global.c但有的时候 为了减小耦合,又需要定义静态变量,对外只暴露函数接口,问题就出在这...

blc220 发表于 2018-9-15 12:29

看看map中变量的位置变了以后是不是在 栈指针附近,如果是这样,可能你的栈溢出了,或者看看是不是在数组的附近,也可能是数组溢出。正常情况下,全局变量放在什么位置,是没影响的。

stardust2018 发表于 2018-9-17 17:46

blc220 发表于 2018-9-15 12:29
看看map中变量的位置变了以后是不是在 栈指针附近,如果是这样,可能你的栈溢出了,或者看看是不是在数组的 ...

谢谢 blc220 这位老师。不过我是用最笨的办法找到问题的,一个个地方打日志,看是调用那个函数以后,静态变量值被修改的,发现是 IAP Read device serial number command 时传入的第二个参数 只传了3个32-bit , 用户手册上写明结果集参数要传入 4个32-bit。 结果集参数也是一个全局变量,被破坏的静态变量确实就在这个结果集参数后面。

申小林一号 发表于 2018-9-17 18:35

你肯定没有外部引用,加extern 引用一下就好了,

stardust2018 发表于 2018-9-18 08:35

申小林一号 发表于 2018-9-17 18:35
你肯定没有外部引用,加extern 引用一下就好了,

并不是 原因我已经说了 就是数组越界

smtqt 发表于 2018-9-19 00:28

本帖最后由 smtqt 于 2018-9-19 00:32 编辑

这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声明下,如果不声明,还用同一个变量名,用再定义的方式出现在B文件里,那就是两个变量,分配不同的地址。。。。
我好像理解错了,你是定义代码的位置从A文件移到B文件,阅读不仔细,惭愧惭愧。。。

stardust2018 发表于 2018-9-19 21:25

smtqt 发表于 2018-9-19 00:28
这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声 ...

嗯 不是你说的问题
页: [1]
查看完整版本: LPC1788全局变量不能随便放置