发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[LPC]

LPC1788全局变量不能随便放置

[复制链接]
1853|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stardust2018|  楼主 | 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

相关帖子

沙发
ayb_ice| | 2018-9-14 10:59 | 只看该作者
有关系吗

使用特权

评论回复
板凳
stardust2018|  楼主 | 2018-9-14 11:04 | 只看该作者

就是不知道有什么关系

使用特权

评论回复
地板
ayb_ice| | 2018-9-14 11:12 | 只看该作者
stardust2018 发表于 2018-9-14 11:04
就是不知道有什么关系

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

使用特权

评论回复
5
stardust2018|  楼主 | 2018-9-14 11:17 | 只看该作者
ayb_ice 发表于 2018-9-14 11:12
没有关系,编译器自动分配

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

使用特权

评论回复
6
xyz549040622| | 2018-9-14 11:22 | 只看该作者
和使用不当有关,没关系。

使用特权

评论回复
7
stardust2018|  楼主 | 2018-9-14 11:25 | 只看该作者
xyz549040622 发表于 2018-9-14 11:22
和使用不当有关,没关系。

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

使用特权

评论回复
8
stardust2018|  楼主 | 2018-9-14 11:34 | 只看该作者
程序比较大  用到 BootLoader  用到了lwip  用了外扩内存,  然后全局变量有点多  为了便于管理  把大部分的全局变量放到了 global.c  但有的时候 为了减小耦合,又需要定义静态变量,对外只暴露函数接口,问题就出在这...

使用特权

评论回复
9
blc220| | 2018-9-15 12:29 | 只看该作者
看看map中变量的位置变了以后是不是在 栈指针附近,如果是这样,可能你的栈溢出了,或者看看是不是在数组的附近,也可能是数组溢出。正常情况下,全局变量放在什么位置,是没影响的。

使用特权

评论回复

打赏榜单

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

评分
参与人数 1威望 +1 收起 理由
stardust2018 + 1 赞一个!
10
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。 结果集参数也是一个全局变量,被破坏的静态变量确实就在这个结果集参数后面。

使用特权

评论回复
11
申小林一号| | 2018-9-17 18:35 | 只看该作者
你肯定没有外部引用,加extern 引用一下就好了,

使用特权

评论回复
12
stardust2018|  楼主 | 2018-9-18 08:35 | 只看该作者
申小林一号 发表于 2018-9-17 18:35
你肯定没有外部引用,加extern 引用一下就好了,

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

使用特权

评论回复
13
smtqt| | 2018-9-19 00:28 | 只看该作者
本帖最后由 smtqt 于 2018-9-19 00:32 编辑

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

使用特权

评论回复
14
stardust2018|  楼主 | 2018-9-19 21:25 | 只看该作者
smtqt 发表于 2018-9-19 00:28
这是因为变量作用域的问题,A文件的全局变量,只有在A文件的函数里可以用,B文件想用,就必须要进行exten声 ...

嗯 不是你说的问题

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝