一个奇怪的问题?

[复制链接]
4103|25
 楼主| jlgcumt 发表于 2012-10-19 10:32 | 显示全部楼层 |阅读模式
定义了两个全局变量,这两个变量是挨着定义的,编译器用的keil
static uint8 a;
static uint8 b;
在程序的某处给a赋值,发现b的值也跟着改变,比如
a = 3;
我接着下一句就打印b的值,中间没有任何打断,发现b跟着变为3了,有谁碰到过这种情况?
ayb_ice 发表于 2012-10-19 10:46 | 显示全部楼层
无图无真相
打印出了问题吧
直接查看变量的值,肯定没有问题
 楼主| jlgcumt 发表于 2012-10-19 10:54 | 显示全部楼层
2# ayb_ice 不是,打印没有问题,都检查过了,一直想不明白
 楼主| jlgcumt 发表于 2012-10-19 10:57 | 显示全部楼层
2# ayb_ice 跟编译器有关系吗,正版和盗版的?
yuliang33 发表于 2012-10-19 11:04 | 显示全部楼层
可以在 混合模式下 看下编译器把这两条编译成了什么汇编
ayb_ice 发表于 2012-10-19 11:53 | 显示全部楼层
都说了直接在变量窗口查看值,我几乎敢肯定是没有问题的,如果有问题请在赋值前关掉中断再试
mcu5i51 发表于 2012-10-19 13:36 | 显示全部楼层
还是贴测试代码吧,如果两个变量没有有效引用的话会合并也挺正常的;
 楼主| jlgcumt 发表于 2012-10-19 16:17 | 显示全部楼层
7# mcu5i51

什么情况下会出现你说的这种情况呢!
 楼主| jlgcumt 发表于 2012-10-19 16:18 | 显示全部楼层
本帖最后由 jlgcumt 于 2012-10-19 16:35 编辑

我打开内存窗口的分别改变两个变量值的时候,就不会相互影响
 楼主| jlgcumt 发表于 2012-10-19 16:20 | 显示全部楼层
6# ayb_ice 在变量窗口查看一样,我试过了,关掉所有中断都不行,不过没看过汇编代码。
另外我把其中的一个变量改为16位的就好了.
ayb_ice 发表于 2012-10-19 17:06 | 显示全部楼层
6# ayb_ice 在变量窗口查看一样,我试过了,关掉所有中断都不行,不过没看过汇编代码。
另外我把其中的一个变量改为16位的就好了.
jlgcumt 发表于 2012-10-19 16:20

上图,上原代码
那还真出鬼了
 楼主| jlgcumt 发表于 2012-10-19 17:18 | 显示全部楼层
源代码比较大,是Canopen协议栈用到的两个变量,但是定义方式就跟我说的那样,挨着定义两个变量,然后在某个函数里改变其中一个变量(a)的值,另一个变量(b)就会跟着变,但改变另一个变量(b)的值就不会影响(a的值)。
我看了一下map文件,两个变量分配的地址是不一样的。
快乐小小鱼 发表于 2012-10-20 10:42 | 显示全部楼层
看看哪里让这两个变量发生关联了吧!或者是代码被优化掉了!
沈老 发表于 2012-10-20 10:59 | 显示全部楼层
Keil中变量是被覆盖的(复用的),注意各个函数如何使用变量。
amwrdfe 发表于 2012-10-20 11:05 | 显示全部楼层
是不是优化过猛了
大道至简 发表于 2012-10-20 11:23 | 显示全部楼层
估计被编译器优化了,二者共享一个地址
 楼主| jlgcumt 发表于 2012-10-20 12:24 | 显示全部楼层
14# 沈老 我把优化级别设置到最低,试了也不行!
天风立马 发表于 2012-10-20 23:27 | 显示全部楼层
看看你的b哪地方是不是也是指向a的。
 楼主| jlgcumt 发表于 2012-10-30 18:32 | 显示全部楼层
18# 天风立马
顶一个!
duhemayi 发表于 2012-10-31 08:24 | 显示全部楼层
估计被编译器优化了,二者共享一个地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善攻者,动于九天之上,善守者,藏于九地之下!

183

主题

733

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部