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 11:12
没有关系,编译器自动分配
也不全是,可以用分散加载文件干预一下 和使用不当有关,没关系。 xyz549040622 发表于 2018-9-14 11:22
和使用不当有关,没关系。
嗯 您说的对肯定是自己有地方用得不好... 程序比较大用到 BootLoader用到了lwip用了外扩内存,然后全局变量有点多为了便于管理把大部分的全局变量放到了 global.c但有的时候 为了减小耦合,又需要定义静态变量,对外只暴露函数接口,问题就出在这... 看看map中变量的位置变了以后是不是在 栈指针附近,如果是这样,可能你的栈溢出了,或者看看是不是在数组的附近,也可能是数组溢出。正常情况下,全局变量放在什么位置,是没影响的。 blc220 发表于 2018-9-15 12:29
看看map中变量的位置变了以后是不是在 栈指针附近,如果是这样,可能你的栈溢出了,或者看看是不是在数组的 ...
谢谢 blc220 这位老师。不过我是用最笨的办法找到问题的,一个个地方打日志,看是调用那个函数以后,静态变量值被修改的,发现是 IAP Read device serial number command 时传入的第二个参数 只传了3个32-bit , 用户手册上写明结果集参数要传入 4个32-bit。 结果集参数也是一个全局变量,被破坏的静态变量确实就在这个结果集参数后面。 你肯定没有外部引用,加extern 引用一下就好了, 申小林一号 发表于 2018-9-17 18:35
你肯定没有外部引用,加extern 引用一下就好了,
并不是 原因我已经说了 就是数组越界 本帖最后由 smtqt 于 2018-9-19 00:32 编辑
这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声明下,如果不声明,还用同一个变量名,用再定义的方式出现在B文件里,那就是两个变量,分配不同的地址。。。。
我好像理解错了,你是定义代码的位置从A文件移到B文件,阅读不仔细,惭愧惭愧。。。
smtqt 发表于 2018-9-19 00:28
这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声 ...
嗯 不是你说的问题
页:
[1]