stm32 - STM32链接固件最终二进制的crc值
问题描述
我正在尝试为自定义 STM32F401RE 板编写引导加载程序 + 应用程序,但我有一些问题。
目前,我的 booloader 位于 0x08000000,应用程序位于 0x08020000。这个想法是让引导加载程序在跳转到应用程序之前执行 CRC 检查。
我使用链接器脚本创建了一个名为.fw_crc
right after.isr_vector
和 before的部分.text
。在应用程序代码中,我可以直接将其写入闪存中的此地址。但这就是我卡住的地方。
如果我理解正确的话,我应该...
- 在应用程序中将 CRC 值默认为 0。
- 构建二进制文件。
- 生成此二进制文件的 CRC。
- 使用一些十六进制工具用计算的 CRC 值覆盖此部分。
- 再次重新生成二进制文件以进行最终闪烁。
上述假设是否正确?使用更新的 CRC 值第二次重新生成二进制文件是否最终会改变最终二进制文件的结果 CRC?
另外,在引导加载程序中,我是否从application_address
to开始执行 CRC 检查application_address + binary_size
?
解决方案
上述假设是否正确?使用更新的 CRC 值第二次重新生成二进制文件不会最终改变最终二进制文件的结果 CRC 吗?
CRC 的默认值可以设置为您喜欢的任何值。无论如何,它将被您的后期构建过程覆盖。
在您的构建后步骤中,您必须计算除 之外的整个应用程序二进制文件
.fw_crc
的 CRC,并将 CRC 结果写入该特定内存区域。但是,由于在和区域.fw_crc
之间定义了,因此您应该考虑分别计算这两个部分的 CRC 并将它们组合起来。一个建议是重新安排你的记忆区域,使其位于开始处。为此,您必须使用必要的偏移量重新定位闪存中的 ISR 向量表。然后您将能够更轻松地计算应用程序二进制 CRC。.isr_vector
.text
.fw_crc
另外,在引导加载程序中,我是否从
application_address
to开始执行 CRC 检查application_address + binary_size
?
如前所述,根据您当前的内存安排,您必须计算两个内存区域的 CRC,即.isr_vector
和.text
. 当然,您需要在引导加载程序中执行相同的 CRC 计算和比较,以验证您的应用程序 binray 的有效性。
推荐阅读
- angular - 如何将 HTML 中的 {{value}} 传递给 component.ts
- android - 如何创建具有活动和其他第三方依赖项的 android 库
- scala - Scala - 高阶函数中的完美数字使用 - 有什么问题吗?
- python - 将数据从数据框附加到 JSON
- asynchronous - 使用c ++的Grpc异步双向客户端
- asp.net - 如何在 Asp.net 中隐藏错误请求 400 的响应标头
- python-3.x - 格式化电脑后出现编译问题
- php - 如何在 CodeIgniter 中使用 JWPlayer?
- docusaurus - 使侧边栏不可折叠并始终在 docusaurus V2 经典预设中展开
- python - Visual Studio Code:在没有相应 .py 文件的情况下使用 .pyd 文件时可以使用 Intellisense /“转到定义”吗?(pywin32)