我正在尝试为自定义 STM32F401RE 板编写引导加载程序 + 应用程序,但我有一些问题。
目前,我的 booloader 位于 0x08000000,应用程序位于 0x08020000。这个想法是让引导加载程序在跳转到应用程序之前执行 CRC 检查。
我使用链接器脚本在
.fw_crc
之后和 .isr_vector
之前创建了一个名为 .text
的部分。在应用程序代码中,我可以直接写入闪存中的该地址。但这就是我陷入困境的地方。
如果我理解正确的话,我应该...
上述假设正确吗?使用更新的 CRC 值第二次重新生成二进制文件最终不会改变最终二进制文件的 CRC 结果吗?
另外,在引导加载程序内,我是否从
application_address
开始到application_address + binary_size
执行CRC检查?
上述假设正确吗?使用更新的 CRC 值第二次重新生成二进制文件最终不会改变最终二进制文件的 CRC 结果吗?
CRC 的默认值可以设置为您喜欢的任何值。无论如何,它都会被您的构建后过程覆盖。
在构建后步骤中,您必须计算除
.fw_crc
之外的整个应用程序二进制文件的 CRC,并将 CRC 结果写入该特定内存区域。但是,由于 .fw_crc
定义在 .isr_vector
和 .text
区域之间,因此您应该考虑分别计算这两个部分的 CRC 并将它们组合起来。建议重新排列您的记忆区域,使 .fw_crc
位于开头。为此,您必须使用必要的偏移量重新定位闪存中的 ISR 向量表。然后您将能够更轻松地计算应用程序二进制 CRC。
另外,在引导加载程序内,我是否从
开始到application_address
执行CRC检查?application_address + binary_size
如前所述,根据您当前的内存安排,您将必须计算两个内存区域的 CRC,即
.isr_vector
和 .text
。当然,您需要在引导加载程序内执行相同的 CRC 计算和比较,以验证您的应用程序 binray 的有效性。
它把一件非常简单的事情变得过于复杂。就在中断向量放置图像的长度之后(链接器脚本 - 简单地添加 FLASH 部分的长度)。
在构建后操作中计算 CRC 并将其附加到 bin 图像中。当您刷新图像时,只需对整个图像进行 CRC(包括末尾附加的 CRC)。结果应该是 0。
如何在固件中间插入固件的CRC
(不排除计算区域)
.isr_begin
...
.isr_end
.fw_crc (uint32) = 0
.fw_crc_add (uint32) = 0
.text_begin
...
.text_end
CRC_Before 已知 >>> ???fw_crc_add??? <<< CRC_After 已知
另请参阅