0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性

IAR爱亚系统 来源:IAR爱亚系统 作者:IAR爱亚系统 2022-11-18 14:28 次阅读

保证代码的完整性是嵌入式软件开发中非常重要的一项任务。代码的完整性检查主要可以用于以下场合:

1. 在产线生产的时候,通过读取相关软件代码版本号和相应的校验码来保证烧录到MCU中的软件是正确的;

2. 在通过Bootloader升级Application的时候,可以计算Application对应的校验码并和之前存取的Application的校验码进行比较,保证Application升级的正确性;

3. 在运行过程中,可以计算Application对应的校验码并和之前存取的Application校验码进行比较,保证Application在没有损坏的情况下运行。(注意:根据需求的不同,在运行过程中可以分为上电检查一次和运行过程中周期性地检查)。

代码的完整性检查一般是通过计算对应代码区域的校验码,并和之前存储的校验码进行比较,若二者一致,说明对应代码区域的完整性是好的,否则说明对应代码区域数据被损坏。当然,完整性检查准确率跟校验码有很大的关系,业界比较常用的是CRC。(注意:本文不对CRC原理进行详细说明,想了解更多关于CRC的内容,请参考相关文献。) IAR Embedded Workbench中内嵌了ielftool,可以在Link的时候生成对应代码区域的校验码并存储在指定的地址。 目前越来越多的MCU中内嵌了CRC硬件模块,可以用于快速计算对应代码区域的校验码。(本文以STM32 MCU为例介绍,方法同样适用于其它带CRC硬件模块的MCU。)

本文主要介绍如何在IAR Embedded Workbench中生成对应代码区域的校验码并存储在指定的地址,然后利用MCU中内嵌的CRC硬件模块计算对应代码区域的校验码,并和之前存储的校验码进行比较来检查代码的完整性。

在IAR Embedded Workbench中生成对应代码区域的校验码并存储在指定的地址

下面的选项使用CRC-32/MPEG-2为例生成对应代码区域的校验码: 在IAR Embedded Workbench工程选项(Options)里面Linker选项里面生成Checksum 1. 勾选“Fill unused code memory”, Fill pattern里面填充相应的值(关于填充值请参考往期文章:“填充没有使用的ROM来提高系统的健壮性”) 2. Start address和End address输入对应代码区域的地址(注意:不能包括存放Checksum的地址区域。比如,Checksum存放与0x080FFFFC ~ 0x080FFFFF, End address需要输入0x080FFFFB)

3. 勾选“Generate Checksum”:

· Checksum Size: 选择 “4 bytes”,

· Alignment: 输入 “4”,

· Algorithm: 选择 “CRC32”

· Complement: 选择 “As is”,

· Initial value: 输入“0xFFFFFFFF”,不要勾选“Use as input”

· Bit order: 选择 “MSB first”

· 不要勾选 “Reverse byte order within word”

· Checksum unit size: 选择 “32-bit”

6013ae84-6659-11ed-8abf-dac502259ad0.png

在ICF文件中输入相应命令将Checksum放置指定的地址(这里是将checksum放置到Flash的最后):

place at end of FLASH_region { section .checksum };
构建(Build)并查看相关Log信息和map文件

构建(Build)成功之后,在Build窗口会显示对应代码区域的Checksum相关信息(Build窗口中的Filter Level要为All):

6042478a-6659-11ed-8abf-dac502259ad0.png 查看生成的map文件:

__checksum:存放于地址0x80f'fffc ~ 0x80f'ffff (Size: 4 bytes)

__checksum_begin: Checksum计算的起始地址:0x800'0000

__checksum_end: Checksum计算的结束地址:0x80f'fffb

60637752-6659-11ed-8abf-dac502259ad0.png

在代码中调用CRC硬件模块计算对应代码区域的校验码并和之前存储的校验码进行比较

首先需要在代码中声明Checksum相关的变量:

/* Linker generated symbols */
extern uint32_t const __checksum;
extern uint32_t __checksum_begin;
extern uint32_t __checksum_end;

然后在代码中计算对应代码区域的校验码并和之前存储的校验码进行比较(注意:每次重新计算之前需要Reset CRC模块):

/* Resets the CRC calculation unit                                    */
CRC->CR = 0x01;
 
/* Calculate the code flash using CRC calculation unit                */
CrcValue = HAL_CRC_Accumulate(&hcrc, (uint32_t *)&__checksum_begin,
   (((uint32_t)&__checksum_end - (uint32_t)&__checksum_begin + 1u)/4u)); 
       
/* Compare the calculated CRC with the previously stored CRC          */
if(__checksum == CrcValue)
{
    RomTst_Result = true;
}
else
{
    RomTst_Result = false;
}

调试

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

60819dd6-6659-11ed-8abf-dac502259ad0.png

总结

本文主要介绍了如何在IAR Embedded Workbench中配置在Link时生成对应代码区域的校验码并存储于指定地址,然后在运行过程中使用MCU内嵌的CRC硬件模块计算对应代码区域的校验码,并和之前存储的校验码进行比较来检查对应代码区域的完整性。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16006

    浏览量

    343504
  • 嵌入式
    +关注

    关注

    4981

    文章

    18269

    浏览量

    288244
  • IAR
    IAR
    +关注

    关注

    5

    文章

    319

    浏览量

    36281
  • Embedded
    +关注

    关注

    0

    文章

    41

    浏览量

    22100

原文标题:使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性

文章出处:【微信号:IAR爱亚系统,微信公众号:IAR爱亚系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何为STM32编程节省代码空间?在IAR中配置CRC参数有窍门

    基于STM32芯片IAR环境下的CRC配置。STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间。
    的头像 发表于 09-06 17:38 1.3w次阅读

    如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验码

    在“使用IAR Embedded WorkbenchMCUCRC模块
    的头像 发表于 10-27 11:49 862次阅读
    如何在<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>中配置生成对应<b class='flag-5'>代码</b>区域的<b class='flag-5'>CRC</b>校验码

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

    在前面的文章“使用IAR Embedded WorkbenchMCUCRC模块
    的头像 发表于 01-05 12:33 649次阅读
    在<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>中计算多个地址区间的Checksum

    IAR Systems支持NXP S32K3 MCU系列下一代汽车应用

     IAR Systems®提供的完整开发工具链IAR Embedded Workbench® for Arm®已经支持NXP®半导体的最新汽
    发表于 11-24 09:07 1614次阅读
    <b class='flag-5'>IAR</b> Systems支持NXP S32K3 <b class='flag-5'>MCU</b>系列下一代汽车应用

    【武汉芯源】IAR Embedded Workbench®集成开发环境已全面支持武汉芯源CW32 MCU系列

    Embedded Workbench for Armversion 9.30.1版本现已提供对武汉芯源CW32系列Arm MCU的支持,这代表着我们的用户可以使用IAR
    发表于 06-14 14:54

    使用SEGGER Linker的完整性检查功能

    linker CRC和STM32 CRC是匹配的。 通过SEGGER linker支持固件(firmware)完整性检查,无需外部工具,所有工作都可以在
    发表于 05-18 13:50

    IAR Embedded Workbench中进行ARM+RISC-V多核调试

    不同的程序,调试时每个核都会开启独立的IAR Embedded Workbench IDE,可以通过View > Cores可以打开对应的Cores窗口查看和操作对应Core的
    发表于 06-14 16:55

    如何使用NUC1262 CRC代码完整性进行验证

    应用:本示例代码使用 NUC1262 CRC代码完整性进行自我验证。 BSP 版本: NUC1262_Series_BSP_CMSIS_V3.00.001 硬件
    发表于 08-29 06:49

    IAR Systems发布 IAR Embedded Wor

    IAR Systems发布 IAR Embedded Workbench for ARM新版本  IAR Systems发布
    发表于 02-11 09:14 1247次阅读

    IAR_embedded_Workbench用户指南介绍

    IAR embedded Workbench for ARM 是 IAR Systems 公司为 ARM 微处理器开发的一 个集成开发环境(下面简称
    发表于 11-09 18:08 89次下载

    IAR Embedded Workbench®集成开发环境已全面支持航顺芯片HK32MCU系列

    IAR Systems®日前宣布:其最新发布的IAR Embedded Workbench for Arm® version 9.20已全面支持航顺芯片HK32
    发表于 12-23 14:08 1604次阅读

    全新 IAR Embedded Workbench for RISC-V 支持 Andes CoDense™扩展

    ™ 扩展,以帮助嵌入式开发人员缩减代码尺寸、提高应用性能 今日,嵌入式开发软件和服务的全球领导者 IAR Systems® 宣布其最新版本的 IAR Embedded
    的头像 发表于 11-17 17:20 540次阅读

    全新IAR Embedded Workbench for RISC-V 支持 Andes CoDense扩展

    全新 IAR Embedded Workbench for RISC-V 支持 Andes CoDense™扩展 IAR Embedded
    发表于 11-18 12:29 529次阅读

    YRDKRX62N 快速入门指南(IAR Embedded Workbench)

    YRDKRX62N 快速入门指南 (IAR Embedded Workbench)
    发表于 04-12 19:14 0次下载
    YRDKRX62N 快速入门指南(<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>)

    YRDKRX62N 快速入门指南(IAR Embedded Workbench)

    YRDKRX62N 快速入门指南 (IAR Embedded Workbench)
    发表于 08-04 18:30 0次下载
    YRDKRX62N 快速入门指南(<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>)