最终二进制文件中固件的STM32链接crc值

问题描述 投票:0回答:3

我正在尝试为自定义 STM32F401RE 板编写引导加载程序 + 应用程序,但我有一些问题。

目前,我的 booloader 位于 0x08000000,应用程序位于 0x08020000。这个想法是让引导加载程序在跳转到应用程序之前执行 CRC 检查。

我使用链接器脚本在

.fw_crc
之后和
.isr_vector
之前创建了一个名为
.text
的部分。在应用程序代码中,我可以直接写入闪存中的该地址。但这就是我陷入困境的地方。

如果我理解正确的话,我应该...

  1. 应用程序中默认 CRC 值为 0。
  2. 构建二进制文件。
  3. 生成该二进制文件的 CRC。
  4. 使用一些十六进制工具用计算出的 CRC 值覆盖此部分。
  5. 再次重新生成二进制文件以进行最终闪烁。

上述假设正确吗?使用更新的 CRC 值第二次重新生成二进制文件最终不会改变最终二进制文件的 CRC 结果吗?

另外,在引导加载程序内,我是否从

application_address
开始到
application_address + binary_size
执行CRC检查?

stm32 bootloader linker-scripts
3个回答
1
投票

上述假设正确吗?使用更新的 CRC 值第二次重新生成二进制文件最终不会改变最终二进制文件的 CRC 结果吗?

  • CRC 的默认值可以设置为您喜欢的任何值。无论如何,它都会被您的构建后过程覆盖。

  • 在构建后步骤中,您必须计算除

    .fw_crc
    之外的整个应用程序二进制文件的 CRC,并将 CRC 结果写入该特定内存区域。但是,由于
    .fw_crc
    定义在
    .isr_vector
    .text
    区域之间,因此您应该考虑分别计算这两个部分的 CRC 并将它们组合起来。建议重新排列您的记忆区域,使
    .fw_crc
    位于开头。为此,您必须使用必要的偏移量重新定位闪存中的 ISR 向量表。然后您将能够更轻松地计算应用程序二进制 CRC。

另外,在引导加载程序内,我是否从

application_address
开始到
application_address + binary_size
执行CRC检查?

如前所述,根据您当前的内存安排,您将必须计算两个内存区域的 CRC,即

.isr_vector
.text
。当然,您需要在引导加载程序内执行相同的 CRC 计算和比较,以验证您的应用程序 binray 的有效性。


1
投票

它把一件非常简单的事情变得过于复杂。就在中断向量放置图像的长度之后(链接器脚本 - 简单地添加 FLASH 部分的长度)。

在构建后操作中计算 CRC 并将其附加到 bin 图像中。当您刷新图像时,只需对整个图像进行 CRC(包括末尾附加的 CRC)。结果应该是 0。


0
投票

如何在固件中间插入固件的CRC

(不排除计算区域)

.isr_begin
 ...
.isr_end

.fw_crc (uint32) = 0
.fw_crc_add (uint32) = 0

.text_begin
 ...
.text_end
  1. .fw_crc.fw_crc_add 设置为 0x00000000U。
  2. 计算所有固件的 CRC32,从 .isr_begin.text_end。它是生成的 CRC32。
  3. 将生成的 CRC32 写入二进制/十六进制文件中的 .fw_crc
  4. 计算从 .isr_begin.fw_crc = CRC_Before 的 CRC32。它是 CRC32 计算的直接顺序中.fw_crc完成时的中间 CRC32 值。
  5. 相反的顺序 = CRC_After 计算从 .text_end.text_begin 的 CRC32。它是 CRC32 计算通常顺序中 .text_begin 开始处的中间 CRC32 值。

CRC_Before 已知 >>> ???fw_crc_add??? <<< CRC_After 已知

  1. 计算必须在.fw_crc_add中插入什么值才能从CRC_Before的值获取CRC_After的值。
  2. fw_crc_add 写入二进制/十六进制文件。
  3. 计算所有文件的 CRC32 以验证其 CRC32 是否等于步骤 2 中的 CRC。

另请参阅

  • github 上的 riuson/crcrevrs
  • sourceforge 上的项目/crcrevrs
© www.soinside.com 2019 - 2024. All rights reserved.