搜索
bottom↓
回复: 18
打印 上一主题 下一主题

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

[复制链接]

出100入0汤圆

跳转到指定楼层
1
发表于 2023-6-14 11:28:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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};
名称长度更长,却没有问题。

出10入61汤圆

2
发表于 2023-6-14 11:44:58 | 只看该作者
对比下生成的BIN或者HEX是否一样

出100入0汤圆

3
 楼主| 发表于 2023-6-14 11:56:32 | 只看该作者
tcm123 发表于 2023-6-14 11:44
对比下生成的BIN或者HEX是否一样
(引用自2楼)

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

出100入0汤圆

4
 楼主| 发表于 2023-6-14 13:59:26 | 只看该作者
做了个测试,得到的结论是:
似乎变量名称中带 _ADC_ 或 _adc_ 编译出来的代码和正常的就会有差异。

出0入18汤圆

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

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

出200入2554汤圆

6
发表于 2023-6-14 16:05:52 | 只看该作者
不要看 hex 或 bin,看 map 文件确定这些差异。 不同编译下的 map 文件,放在 uc 比较一下

出100入0汤圆

7
 楼主| 发表于 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; 编译的结果就是相同的。

出100入0汤圆

8
 楼主| 发表于 2023-6-14 16:27:04 | 只看该作者
tang_qianfeng 发表于 2023-6-14 15:44
名字怎么会影响生成的代码呢?
(引用自5楼)

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

出0入0汤圆

9
发表于 2023-6-14 17:53:04 | 只看该作者
是很奇怪,用keil很多年了,没碰到过这种事,

出20入67汤圆

10
发表于 2023-6-14 18:29:45 | 只看该作者
用keil5试试?看看是不是历史bug

出0入217汤圆

11
发表于 2023-6-15 16:02:59 | 只看该作者
变量位置不同,导致堆栈溢出时影响的变量不同

出1310入193汤圆

12
发表于 2023-6-15 20:09:45 来自手机 | 只看该作者
还是很奇
期待lz解密

出0入8汤圆

13
发表于 2023-6-15 22:14:19 | 只看该作者
一直没有用过idata,只用过data,xdata

出3670入191汤圆

14
发表于 2023-6-16 08:38:48 来自手机 | 只看该作者
wochai 发表于 2023-6-14 13:59
做了个测试,得到的结论是:
似乎变量名称中带 _ADC_ 或 _adc_ 编译出来的代码和正常的就会有差异。
...

(引用自4楼)

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

出0入91汤圆

15
发表于 2023-6-16 08:50:32 | 只看该作者
你试试把idata 换成 xdata 看看  我怀疑你 变量区域  溢出了

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

出1310入193汤圆

16
发表于 2023-6-16 09:02:56 | 只看该作者
ackyee 发表于 2023-6-16 08:50
你试试把idata 换成 xdata 看看  我怀疑你 变量区域  溢出了

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

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

出0入91汤圆

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

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

出100入0汤圆

18
 楼主| 发表于 2023-6-16 16:28:59 | 只看该作者
ackyee 发表于 2023-6-16 08:50
你试试把idata 换成 xdata 看看  我怀疑你 变量区域  溢出了

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

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

出0入91汤圆

19
发表于 2023-6-16 16:55:29 | 只看该作者
本帖最后由 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





回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-21 00:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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