编程, 调试

在IAR Embedded Workbench中计算多个地址区间的Checksum

  • IAR
  • 8分钟阅读
<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 Embedded Workbench中计算多个地址区间的Checksum</span>

在“使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性”一文中介绍了如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验码。但是在IDE里面的Linker > Checksum选项里面只能配置一个地址区间并且只能生成一个Checksum。如果有多个地址空间,那么IDE里面的Linker > Checksum选项没有办法满足需求,需要使用命令行的方式。

本文主要介绍如何在IAR Embedded Workbench中计算多个地址区间的Checksum。

两个地址区间生成两个Checksum

假设对应的两个地址空间分别为0x08000000-0x0801FFFB(对应Checksum放到0x0801FFFC)和0x08030000-0x0803FFFB(对应Checksum放到0x0803FFFC)。

不使能Linker > Checksum选项中的配置:

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-1

在Linker > Extra Options中添加对应的命令

--place_holder __checksum1,4,.checksum1,4

--place_holder __checksum2,4,.checksum2,4

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-2

在ICF文件中添加对应的命令:

define exported symbol __checksum_begin1 =0x08000000;
define exported symbol __checksum_end1   =0x0801FFFB;
define exported symbol __checksum_begin2 =0x08030000;
define exported symbol __checksum_end2   =0x0803FFFB;

place at address mem: 0x0801FFFC { section .checksum1 };
place at address mem: 0x0803FFFC { section .checksum2 };

在Build Actions里面添加对应生成Checksum的命令:

ielftool --fill 0xFF;0x08000000-0x0801FFFB --fill 0xFF;0x08030000-0x0803FFFB --checksum __checksum1:4,crc32:Li,0xffffffff;0x08000000-0x0801FFFB --checksum __checksum2:4,crc32:Li,0xffffffff;0x08030000-0x0803FFFB --verbose "$TARGET_PATH$" "$TARGET_PATH$"         

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-3

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-4

Build并查看对应的Build Log和MAP文件检查Checksum相关的信息:

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-5

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-6

两个地址区间生成一个Checksum

假设对应的两个地址空间分别为0x08000000-0x0801FFFF和0x08030000-0x0803FFFB(对应Checksum放到0x0803FFFC)。

不使能Linker > Checksum选项中的配置:

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-7

在Linker > Extra options中添加对应的命令

--place_holder __checksum,4,.checksum,4

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-8

在ICF文件中添加对应的命令:

define exported symbol __checksum_begin1 =0x08000000;
define exported symbol __checksum_end1   =0x0801FFFF;
define exported symbol __checksum_begin2 =0x08030000;
define exported symbol __checksum_end2   =0x0803FFFB;

place at address mem: 0x0803FFFC { section .checksum };

在Build Actions里面添加对应生成Checksum的命令:

ielftool --fill 0xFF;0x08000000-0x0801FFFF --fill 0xFF;0x08030000-0x0803FFFB --checksum __checksum:4,crc32:Li,0xffffffff;0x08000000-0x0801FFFF;0x08030000-0x0803FFFB --verbose "$TARGET_PATH$" "$TARGET_PATH$"          

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-9

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-10

Build并查看对应的Build Log和MAP文件检查相关Checksum的信息:

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-11

china-learn-computing-checksum-for-multiple-address-ranges-in-iar-embedded-workbench-12

总结

本文通过两个例子介绍了如何在IAR Embedded Workbench中计算多个地址区间的Checksum,包括多个地址区间生成多个Checksum和多个地址区间生成一个Checksum。

 

参考文献:
  1. IAR C/C++ Development Guide (define symbol directive,--place_holder, The IAR ELF Tool—ielftool)