amobbs.com 阿莫电子技术论坛

标题: Keil V4.00a遇到一个奇怪问题,变量名称导致的异常。 [打印本页]

作者: wochai    时间: 2023-6-14 11:28
标题: Keil V4.00a遇到一个奇怪问题,变量名称导致的异常。
本帖最后由 wochai 于 2023-6-14 11:42 编辑

如题。
程序中有个定义:       
        unsigned long idata Pre_ADC_Speed [FIFO_NUM];
改成
        unsigned long idata PreADC_Speed [FIFO_NUM];//Pre后面去掉‘_’字符
就正常了。
编译下载都是正常的,好程序和坏程序编译后的代码长度也一样。
坏程序在没有触发INT0中断时也是正常的,INT0中断触发后MCU大概率重启。

而且同样位置还定义了:
        unsigned int idata Pre_Time_Speed[FIFO_NUM]={0,0,0,0,0};
名称长度更长,却没有问题。


作者: tcm123    时间: 2023-6-14 11:44
对比下生成的BIN或者HEX是否一样
作者: wochai    时间: 2023-6-14 11:56
tcm123 发表于 2023-6-14 11:44
对比下生成的BIN或者HEX是否一样
(引用自2楼)

应该是不一样吧,要不然就成了鬼故事了!
作者: wochai    时间: 2023-6-14 13:59
做了个测试,得到的结论是:
似乎变量名称中带 _ADC_ 或 _adc_ 编译出来的代码和正常的就会有差异。

作者: tang_qianfeng    时间: 2023-6-14 15:44
wochai 发表于 2023-6-14 13:59
做了个测试,得到的结论是:
似乎变量名称中带 _ADC_ 或 _adc_ 编译出来的代码和正常的就会有差异。
...
(引用自4楼)

名字怎么会影响生成的代码呢?
作者: t3486784401    时间: 2023-6-14 16:05
不要看 hex 或 bin,看 map 文件确定这些差异。 不同编译下的 map 文件,放在 uc 比较一下
作者: wochai    时间: 2023-6-14 16:25
t3486784401 发表于 2023-6-14 16:05
不要看 hex 或 bin,看 map 文件确定这些差异。 不同编译下的 map 文件,放在 uc 比较一下 ...
(引用自6楼)

变量使用下划线就会出问题,生成的MAP文件的确不同。
而且是定义到 idata 区的变量会出问题。例如
unsigned char idata BatLife; 和 unsigned char idata Bat_Life; 编译的结果就不同
但是从MAP文件来看,只是变量的位置不同,执行一般不会出现问题,但是像我定义的 _ADC_ 变量名就会出问题。

不在idada区的变量没变化,例如
unsigned char BatLife; 和 unsigned char Bat_Life; 编译的结果就是相同的。
作者: wochai    时间: 2023-6-14 16:27
tang_qianfeng 发表于 2023-6-14 15:44
名字怎么会影响生成的代码呢?
(引用自5楼)

奇怪吧,目前的测试是:定义在idada区的变量名称带不带下划线,编译完成结果就不一样。
作者: xmcsl    时间: 2023-6-14 17:53
是很奇怪,用keil很多年了,没碰到过这种事,
作者: autolog    时间: 2023-6-14 18:29
用keil5试试?看看是不是历史bug
作者: ehengio    时间: 2023-6-15 16:02
变量位置不同,导致堆栈溢出时影响的变量不同
作者: lb0857    时间: 2023-6-15 20:09
还是很奇
期待lz解密
作者: lindabell    时间: 2023-6-15 22:14
一直没有用过idata,只用过data,xdata
作者: Rabbitoose    时间: 2023-6-16 08:38
wochai 发表于 2023-6-14 13:59
做了个测试,得到的结论是:
似乎变量名称中带 _ADC_ 或 _adc_ 编译出来的代码和正常的就会有差异。
...

(引用自4楼)

为什么这个_ADC_给我一种被预编译搞了的感觉。假设变量名长度不变,只把ADC改成别的试试看,如ADD、ADE之类的,问题还会不会存在?
作者: ackyee    时间: 2023-6-16 08:50
你试试把idata 换成 xdata 看看  我怀疑你 变量区域  溢出了

之前碰到过这样的情况  改了名字就好了  换了名字就不行了  最后发现是堆栈满了
作者: lb0857    时间: 2023-6-16 09:02
ackyee 发表于 2023-6-16 08:50
你试试把idata 换成 xdata 看看  我怀疑你 变量区域  溢出了

之前碰到过这样的情况  改了名字就好了  换 ...
(引用自15楼)

那么  是不是推测  某些系统使用到的内部资源名称:ADC     DC   PWM    USART   等等关键字会进行优化处理?
期待高人解密
作者: ackyee    时间: 2023-6-16 10:03
lb0857 发表于 2023-6-16 09:02
那么  是不是推测  某些系统使用到的内部资源名称:ADC     DC   PWM    USART   等等关键字会进行优化处 ...
(引用自16楼)

还有个问题 就是 你 计算的时候   涉及到  类型转换的地方  增加强制转换符   可能能解决你神学的问题
作者: wochai    时间: 2023-6-16 16:28
ackyee 发表于 2023-6-16 08:50
你试试把idata 换成 xdata 看看  我怀疑你 变量区域  溢出了

之前碰到过这样的情况  改了名字就好了  换 ...
(引用自15楼)

是idata区域的问题,但是编译结果显示只使用了147字节,理论上没超标。
换成Xdata没问题,见我7/8楼。

作者: ackyee    时间: 2023-6-16 16:55
本帖最后由 ackyee 于 2023-6-16 16:58 编辑
wochai 发表于 2023-6-16 16:28
是idata区域的问题,但是编译结果显示只使用了147字节,理论上没超标。
换成Xdata没问题,见我7/8楼。
...
(引用自18楼)


   你碰到的问题几乎和我碰到的一模一样

不一定是堆栈超出了,检查下你所有关于这个变量的加减乘除 ,所有的运算 前面都加一个类型强制转换符


我甚至跟你提过几乎相同的问题  (注意 这里所有的怀疑都是错误的)
https://www.amobbs.com/thread-5774855-1-1.html

最终发现问题点了
请参考下面的帖子
https://www.amobbs.com/thread-5775531-1-1.html










欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4