0

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

我想知道如何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_Reversem当放置在正确的位置时,应该做与 ielftool相同的事情
  • -crc32_b_e是算法。(我还不确定我需要大端_b_e还是小端_l_e
  • 0x081ffffc是内存中放置 CRC 的位置
  • -CCITT初始种子( 中的起始值ielftool)都是一位(这是默认值,但我想我会把它扔在那里)

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

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

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

4

1 回答 1

2

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

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

#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 计算的内存地址范围更改为原来的值(请参阅问题),我再次得到了与ielftool和相同的 CRC srec_cat

于 2021-09-23T09:16:25.477 回答