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



所以我试图找出一种方法来计算srec_cat的CRC之前把代码放在微控制器上。现在,我的构建后脚本使用IAR中的ielftool进行计算,并将其插入十六进制文件中的正确位置。

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

下面是生成我想要复制的CRC32的ielftool命令:

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

  • APP_SYS_ApplactionCrc是校验和将被存储的符号,并添加4字节偏移
  • crc32为算法
  • 1指定补码
  • m反转输入字节和最终校验和
  • i用起始值
  • 初始化校验和值
  • 0xffffffff为起始值
  • 最后,0x08060000-0x081fffff是计算校验和的内存范围

我已经尝试了很多东西,但这个,我认为,是最接近我得到的相同的命令与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.1326srec_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

这样我就知道了变量的位置和长度,这样就可以告诉ielftoolsrec_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计算的内存地址范围更改为它们原来的位置(参见问题),并且我再次获得了ielftoolsrec_cat的相同CRC。

最新更新