返回列表 发新帖本帖赏金 10.00元(功能说明)

[LPC] LPC1788全局变量不能随便放置

[复制链接]
432|13
 楼主 | 2018-9-14 10:57 | 显示全部楼层 |阅读模式
IDE用的keil5,在LPC1788上开发的时候,定义了一个全局变量,放到A文件,编译下载能正常运行,放到B文件,编译下载就不能正常运行。看了一下map文件,全局变量放到不同文件时,map里面的变量地址确实不一样,但是不知道为什么会出现这种情况。

Program Size: Code=104872 RO-data=4148 RW-data=277136 ZI-data=80632
| 2018-9-14 10:59 | 显示全部楼层
有关系吗
 楼主 | 2018-9-14 11:04 | 显示全部楼层

就是不知道有什么关系
| 2018-9-14 11:12 | 显示全部楼层
stardust2018 发表于 2018-9-14 11:04
就是不知道有什么关系

没有关系,编译器自动分配
 楼主 | 2018-9-14 11:17 | 显示全部楼层
ayb_ice 发表于 2018-9-14 11:12
没有关系,编译器自动分配

也不全是,可以用分散加载文件干预一下
| 2018-9-14 11:22 | 显示全部楼层
和使用不当有关,没关系。
 楼主 | 2018-9-14 11:25 | 显示全部楼层
xyz549040622 发表于 2018-9-14 11:22
和使用不当有关,没关系。

嗯 您说的对  肯定是自己有地方用得不好...
 楼主 | 2018-9-14 11:34 | 显示全部楼层
程序比较大  用到 BootLoader  用到了lwip  用了外扩内存,  然后全局变量有点多  为了便于管理  把大部分的全局变量放到了 global.c  但有的时候 为了减小耦合,又需要定义静态变量,对外只暴露函数接口,问题就出在这...
| 2018-9-15 12:29 | 显示全部楼层
看看map中变量的位置变了以后是不是在 栈指针附近,如果是这样,可能你的栈溢出了,或者看看是不是在数组的附近,也可能是数组溢出。正常情况下,全局变量放在什么位置,是没影响的。

打赏榜单

stardust2018 打赏了 10.00 元 2018-09-17
理由:谢谢提示!

评分

参与人数 1威望 +1 收起 理由
stardust2018 + 1 赞一个!
 楼主 | 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 引用一下就好了,
 楼主 | 2018-9-18 08:35 | 显示全部楼层
申小林一号 发表于 2018-9-17 18:35
你肯定没有外部引用,加extern 引用一下就好了,

并不是 原因我已经说了 就是数组越界
| 2018-9-19 00:28 | 显示全部楼层
本帖最后由 smtqt 于 2018-9-19 00:32 编辑

这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声明下,如果不声明,还用同一个变量名,用再定义的方式出现在B文件里,那就是两个变量,分配不同的地址。。。。
我好像理解错了,你是定义代码的位置从A文件移到B文件,阅读不仔细,惭愧惭愧。。。
 楼主 | 2018-9-19 21:25 | 显示全部楼层
smtqt 发表于 2018-9-19 00:28
这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声 ...

嗯 不是你说的问题
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /4 下一条

快速回复 返回顶部 返回列表