编程, 调试

使用IAR工具链计算使用了的Flash的checksum

  • IAR
  • 5分钟阅读
<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >使用IAR工具链计算使用了的Flash的checksum</span>

之前的文章使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性介绍了如何填充整个Flash地址空间,然后计算整个Flash地址空间的checksum,并把对应checksum放到Flash地址空间的最后面。

本文主要介绍如何使用IAR工具链计算使用了的Flash的checksum并把对应checksum放到使用了的Flash的地址后面。

由于对应Linker > Checksum中的地址需要输入固定的值,对应选项不要勾选:

china-learn-Calculating-the-Checksum-of-Used-Flash-with-the-IAR-Toolchain-1

首先需要在代码中定义__checksum变量,并把__checksum变量放到指定的.checksum section:

const uint32_t __checksum @ ".checksum";

然后在icf文件中把.checksum section放到readonly的后面:

/* place checksum just after readonly */
define block APP with fixed order {
  readonly,
  section .checksum};

place in FLASH_region { block APP };

最后在Build Actions中调用对应的ielftool命令来生成对应地址空间的checksum:

china-learn-Calculating-the-Checksum-of-Used-Flash-with-the-IAR-Toolchain-2

下面命令中整个Flash地址空间0x8000000-0x800ffff填充0xFF,然后只对使用了的Flash地址空间0x8000000-__checksum计算对应的checksum:

ielftool --fill 0xFF;0x8000000-0x800ffff --checksum __checksum:4,crc32:Li,0xffffffff;0x8000000-__checksum --verbose $TARGET_DIR$\$TARGET_BNAME$.out$TARGET_DIR$\$TARGET_BNAME$.out

构建(Build)并查看相关Log信息和map文件:

计算使用了的Flash地址空间0x8000000-0x80046c7,并把对应checksum放到地址0x80046c8(紧跟使用了的Flash地址空间):

china-learn-Calculating-the-Checksum-of-Used-Flash-with-the-IAR-Toolchain-3

china-learn-Calculating-the-Checksum-of-Used-Flash-with-the-IAR-Toolchain-4

调试发现,通过CRC硬件模块计算出来的checksum和之前存储的checksum是一致的,说明检查代码区域的完整性是好的:

china-learn-Calculating-the-Checksum-of-Used-Flash-with-the-IAR-Toolchain-5

总结

本文主要介绍了如何使用IAR工具链计算使用了的Flash的checksum并把对应checksum放到使用了的Flash的地址后面。

 

参考文献:

  1. https://github.com/iarsystems/cmake-tutorial/wiki/Appending-a-checksum-for-application-self-checking
  2. 使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性
  3. https://docs.iar.com/ewarm/9.7x/en/iar-c-c---development/iar-utilities/the-iar-elf-tool-ielftool.html
  4. https://docs.iar.com/ewarm/9.7x/en/iar-c-c---development/the-linker-configuration-file/section-handling/define-block-directive.html (fixed order)