wochai 发表于 2023-6-14 11:28:10

Keil V4.00a遇到一个奇怪问题,变量名称导致的异常。

本帖最后由 wochai 于 2023-6-14 11:42 编辑

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

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

tcm123 发表于 2023-6-14 11:44:58

对比下生成的BIN或者HEX是否一样

wochai 发表于 2023-6-14 11:56:32

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

应该是不一样吧,要不然就成了鬼故事了!

wochai 发表于 2023-6-14 13:59:26

做了个测试,得到的结论是:
似乎变量名称中带 _ADC_ 或 _adc_ 编译出来的代码和正常的就会有差异。

tang_qianfeng 发表于 2023-6-14 15:44:12

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

名字怎么会影响生成的代码呢?

t3486784401 发表于 2023-6-14 16:05:52

不要看 hex 或 bin,看 map 文件确定这些差异。 不同编译下的 map 文件,放在 uc 比较一下

wochai 发表于 2023-6-14 16:25:48

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:04

tang_qianfeng 发表于 2023-6-14 15:44
名字怎么会影响生成的代码呢?
(引用自5楼)

奇怪吧,目前的测试是:定义在idada区的变量名称带不带下划线,编译完成结果就不一样。

xmcsl 发表于 2023-6-14 17:53:04

是很奇怪,用keil很多年了,没碰到过这种事,

autolog 发表于 2023-6-14 18:29:45

用keil5试试?看看是不是历史bug

ehengio 发表于 2023-6-15 16:02:59

变量位置不同,导致堆栈溢出时影响的变量不同

lb0857 发表于 2023-6-15 20:09:45

还是很奇
期待lz解密

lindabell 发表于 2023-6-15 22:14:19

一直没有用过idata,只用过data,xdata

Rabbitoose 发表于 2023-6-16 08:38:48

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

为什么这个_ADC_给我一种被预编译搞了的感觉。假设变量名长度不变,只把ADC改成别的试试看,如ADD、ADE之类的,问题还会不会存在?

ackyee 发表于 2023-6-16 08:50:32

你试试把idata 换成 xdata 看看我怀疑你 变量区域溢出了

之前碰到过这样的情况改了名字就好了换了名字就不行了最后发现是堆栈满了

lb0857 发表于 2023-6-16 09:02:56

ackyee 发表于 2023-6-16 08:50
你试试把idata 换成 xdata 看看我怀疑你 变量区域溢出了

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

那么是不是推测某些系统使用到的内部资源名称:ADC   DC   PWM    USART   等等关键字会进行优化处理?
期待高人解密

ackyee 发表于 2023-6-16 10:03:08

lb0857 发表于 2023-6-16 09:02
那么是不是推测某些系统使用到的内部资源名称:ADC   DC   PWM    USART   等等关键字会进行优化处 ...
(引用自16楼)

还有个问题 就是 你 计算的时候   涉及到类型转换的地方增加强制转换符   可能能解决你神学的问题

wochai 发表于 2023-6-16 16:28:59

ackyee 发表于 2023-6-16 08:50
你试试把idata 换成 xdata 看看我怀疑你 变量区域溢出了

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

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

ackyee 发表于 2023-6-16 16:55:29

本帖最后由 ackyee 于 2023-6-16 16:58 编辑

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

{:lol:}   你碰到的问题几乎和我碰到的一模一样

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


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

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





页: [1]
查看完整版本: Keil V4.00a遇到一个奇怪问题,变量名称导致的异常。