发现IAR的怪事,同一代码不同电脑生成的烧录文件不同。

2019-12-14 13:11发布

    由于要接收另一家公司为我们开发的产品源代码,为了保证源代码与已生产的产品源代码一致,在接收对方源码时,只要编译出来的烧录文件与已生产的产品的烧录文件一致就接受,否则不接收,然后怪事出现了,经测试发现,用同一个版本的IAR,完全相同的操作系统(同一个系统装两台电脑),只是电脑的硬件不同,同一个源代码工程,两台电脑生成的烧录文件居然会不一样,致使无法接收源代码,而用keil完全没有这种事,真是见鬼了,肯定有与我遇到相同困惑的朋友,这是什么情况?原因是什么?怎么解决的?? 使用的版本为IAR Embedded Workbench for ARM 6.30.1。如有和我相同需求的朋友,一定注意了,一定不能用IAR。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
46条回答
funnynypd
1楼-- · 2019-12-19 08:03
It is almost impossible, something must be going on.
cnxh
2楼-- · 2019-12-19 12:54
zj2003 发表于 2015-10-20 00:04
没有时间,日期之类的代码。

同台电脑更改日期时间编译2次,排除时间,日期之类的代码
huangqi412
3楼-- · 2019-12-19 18:30
tim4146 发表于 2018-12-7 11:22
请问楼主,这个问题后来怎么解决的啊。
我现在用和谐版本的IAR7.6,同一台电脑,不同路径下完全一样的工程 ...

不一样地方多么
tim4146
4楼-- · 2019-12-19 22:17
huangqi412 发表于 2018-12-8 21:50
不一样地方多么

已经查到问题了
首先路径不一样的情况下编译同一个工程生成的烧录文件大小不一样是因为:工程代码中存在assert断言部分的__FILE___   这个宏定义(我只说我的工程代码哈),很多库函数一般都会对参数进行相关的检查,就是用的assert。尽管实际代码的参数都是正确的,但是__FILE___一旦被编译了就会把路径信息带到烧录文件里面(猜测)
解决以上问题的办法是查看assert先关代码,一般都是条件编译的,比如我这边是
#ifdef  NDEBUG
#define assert 啥都不干
#else assert  干活

那就在代码合适位置或者在IAR的工程配置里面增加NDEBUG这个宏定义就行了

其次顺便解释一下不同时间编译出来的烧录文件内容存在不一致
这个原因主要是代码中存在__DATE__   __TIME__宏定义,所以生成的烧录程序会把时间编译进去,但是这个只是影响很少几个字节内容,特别是不会对长度有影响(领导评审代码的时候一般都市rebuild all一下看看烧录程序的大小是不是一致的)

一周热门 更多>