所以我试图找出一种方法来计算srec_cat
的CRC之前把代码放在微控制器上。现在,我的构建后脚本使用IAR中的ielftool
进行计算,并将其插入十六进制文件中的正确位置。
我想知道如何与srec_cat
产生相同的CRC,当然使用相同的十六进制文件。
下面是生成我想要复制的CRC32的ielftool命令:
--checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060000-0x081fffff
APP_SYS_ApplactionCrc
是校验和将被存储的符号,并添加4字节偏移1
指定补码m
反转输入字节和最终校验和i
用起始值 初始化校验和值0xffffffff
为起始值- 最后,
0x08060000-0x081fffff
是计算校验和的内存范围
crc32
为算法我已经尝试了很多东西,但这个,我认为,是最接近我得到的相同的命令与srec_cat
:
-crop 0x08060000 0x081ffffc -Bit_Reverse -crc32_b_e 0x081ffffc -CCITT -Bit_Reverse
-crop 0x08060000 0x081ffffc
在某种程度上指定将计算CRC的内存范围-Bit_Reverse
应该做同样的事情作为m
在ielftool当放在正确的位置-crc32_b_e
为算法。(我还不确定我是否需要大端序_b_e
或小端序_l_e
)0x081ffffc
是存放CRC 的内存位置。-CCITT
初始种子(ielftool
中的起始值)都是一个比特(这是默认值,但我想我会把它扔在那里)
有人知道如何复制ielftool的CRC吗?还是说我只是徒劳?
我是CRCs的新手,除了基本知识之外,我知道的不多。如果我有完全相同的算法,这有什么关系吗?当我把代码放在板上时,CRC仍然不会工作吗?
注意:我目前使用ielftool 10.8.3.1326
和srec_cat 1.63
经过许多天的尝试找出如何从每个工具得到crc匹配(并确保我给两个工具相同的数据),我终于找到了一个解决方案。
基于上面的Mark Adler的评论,我试图找出如何获得少量数据的CRC,如unsigned int。今天早上我终于有了一个灯泡时刻,我意识到我只需要在我已经在做的项目的代码中添加一个uint32_t值123456789
。然后我将变量放置在内存中的特定位置,使用:
#pragma location=0x08060188
__root const uint32_t CRC_Data_Test = 123456789; //IAR specific pragma and keyword
这样我就知道了变量的位置和长度,这样就可以告诉ielftool
和srec_cat
只计算该变量在内存中面积的CRC。
然后我从编译的项目中取出elf文件并创建一个intel十六进制文件,这样我可以更容易地查看并确保正确的变量数据位于正确的地址。
接下来,我使用以下命令通过ielftool
发送elf文件:
ielftool proj.elf --checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060188-0x0806018b proj.elf
我用以下命令通过srec_cat
发送十六进制文件:
srec_cat proj.hex -intel -crop 0x08060188 0x0806018c -crc32_b_e 0x081ffffc -o proj_srec.hex -intel
在将带有CRC的elf转换为十六进制文件并比较两个十六进制文件后,我看到CRC非常相似。唯一的区别是顺序。将-crc32_b_e
更改为-crc32_l_e
,这两个工具都给我9E 6C DF 18
作为CRC。
然后,我将CRC计算的内存地址范围更改为它们原来的位置(参见问题),并且我再次获得了ielftool
和srec_cat
的相同CRC。