尝试在 srec_cat 中复制使用 ielftool 生成的 CRC

Trying to replicate a CRC made with ielftool in srec_cat

因此,在将代码放在微控制器上之前,我试图找出一种使用 srec_cat 计算 CRC 的方法。现在,我的 post-build 脚本使用 IAR 中的 ielftool 进行计算并将其插入 hex 文件中的正确位置。

我想知道如何使用 srec_cat 生成相同的 CRC,当然是使用相同的十六进制文件。

这是生成我要复制的 CRC32 的 ielftool 命令:

--checksum APP_SYS_ApplicationCrc:4,crc32:1mi,0xffffffff;0x08060000-0x081fffff

我已经尝试了很多东西,但我认为这是迄今为止我使用 srec_cat:

获得的最接近相同命令的方法

-crop 0x08060000 0x081ffffc -Bit_Reverse -crc32_b_e 0x081ffffc -CCITT -Bit_Reverse

有没有人知道如何复制 ielftool 的 CRC?还是我只是徒劳?

我是 CRC 的新手,除了基础知识外我知道的不多。如果我有完全相同的算法,这有什么关系吗?当我把代码放在板上时,CRC 是否仍然有效?

注:我目前正在使用ielftool 10.8.3.1326srec_cat 1.63

经过许多天的尝试找出如何从每个工具中获取匹配的 CRC(并确保我为两个工具提供相同的数据),我终于找到了解决方案。

根据上面 Mark Adler 的评论,我试图弄清楚如何获取少量数据(例如 unsigned int)的 CRC。今天早上我终于灵光一现,我意识到我只需要在我已经在处理的项目的代码中放置一个 uint32_t 和值 123456789。然后我会使用以下方法将变量放在内存中的特定位置:

#pragma location=0x08060188
__root const uint32_t CRC_Data_Test = 123456789; //IAR specific pragma and keyword

这样我就知道了变量的位置和长度,因此可以告诉 ielftoolsrec_cat 只计算内存中该变量区域的 CRC。

然后我从编译的项目中取出 elf 文件并创建了一个 intel hex 文件,这样我就可以更轻松地查看并确保正确的变量数据位于正确的地址。

接下来,我使用以下命令通过 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 文件转换为 hex 文件并比较两个 hex 文件后,我发现 CRC 非常相似。唯一的区别是字节顺序。将 -crc32_b_e 更改为 -crc32_l_e 得到了两个工具给我 9E 6C DF 18 作为 CRC。

然后我将用于 CRC 计算的内存地址范围更改为原来的范围(参见问题),我再次获得了 ielftoolsrec_cat 的相同 CRC。