尝试在 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
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
放在正确的位置 时,它应该与 ielftool 中的 m
做同样的事情
-crc32_b_e
是算法。 (我不确定我是否需要大端 _b_e
或小端 _l_e
)
0x081ffffc
是内存中放置 CRC 的位置
-CCITT
初始种子(ielftool
中的起始值)都是一位(这是默认值,但我想我会把它扔在那里)
有没有人知道如何复制 ielftool 的 CRC?还是我只是徒劳?
我是 CRC 的新手,除了基础知识外我知道的不多。如果我有完全相同的算法,这有什么关系吗?当我把代码放在板上时,CRC 是否仍然有效?
注:我目前正在使用ielftool 10.8.3.1326
和srec_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
这样我就知道了变量的位置和长度,因此可以告诉 ielftool
和 srec_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
和 srec_cat
的相同 CRC。
因此,在将代码放在微控制器上之前,我试图找出一种使用 srec_cat
计算 CRC 的方法。现在,我的 post-build 脚本使用 IAR 中的 ielftool
进行计算并将其插入 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_Reverse
放在正确的位置 时,它应该与 ielftool 中的 -crc32_b_e
是算法。 (我不确定我是否需要大端_b_e
或小端_l_e
)0x081ffffc
是内存中放置 CRC 的位置
-CCITT
初始种子(ielftool
中的起始值)都是一位(这是默认值,但我想我会把它扔在那里)
m
做同样的事情
有没有人知道如何复制 ielftool 的 CRC?还是我只是徒劳?
我是 CRC 的新手,除了基础知识外我知道的不多。如果我有完全相同的算法,这有什么关系吗?当我把代码放在板上时,CRC 是否仍然有效?
注:我目前正在使用ielftool 10.8.3.1326
和srec_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
这样我就知道了变量的位置和长度,因此可以告诉 ielftool
和 srec_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
和 srec_cat
的相同 CRC。