之前的文章使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性介绍了如何填充整个Flash地址空间,然后计算整个Flash地址空间的checksum,并把对应checksum放到Flash地址空间的最后面。
本文主要介绍如何使用IAR工具链计算使用了的Flash的checksum并把对应checksum放到使用了的Flash的地址后面。
由于对应Linker > Checksum中的地址需要输入固定的值,对应选项不要勾选:

首先需要在代码中定义__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:

下面命令中整个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地址空间):


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

总结
本文主要介绍了如何使用IAR工具链计算使用了的Flash的checksum并把对应checksum放到使用了的Flash的地址后面。
参考文献:
- https://github.com/iarsystems/cmake-tutorial/wiki/Appending-a-checksum-for-application-self-checking
- 使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性
- https://docs.iar.com/ewarm/9.7x/en/iar-c-c---development/iar-utilities/the-iar-elf-tool-ielftool.html
- https://docs.iar.com/ewarm/9.7x/en/iar-c-c---development/the-linker-configuration-file/section-handling/define-block-directive.html (fixed order)