1069|1

227

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

使用SEGGER Linker的完整性检查功能 [复制链接]

在嵌入式产品应用中,为了保证系统数据在存储或者传输过程中的完整性,固件映像中通常包含完整性检查(integrity checks),以检测映像是否损坏。例如,bootloader可以基于完整性检查验证一个更新的固件映像是否可信。或者固件基于完整性检查可以自我验证,检查Flash是否损坏。

SEGGER Embedded Studio从v5.10版本(Linker v3.00及以上版本)开始提供完整性检查功能,支持多种CRC和消息摘要算法(例如MD5和SHA)。

 

01

使用方法

 

使用Linker提供的完整性检查功能,首先需要将执行检查的区域定义为一个region,并为放置计算结果的区域定义一个region。

我们可以为整个Flash区域上创建一个CRC,并将结果放在Flash的末尾 。

此外,我们还可以定义计算CRC的区域的填充值。如:

  • define region FLASH = [0x80000000 size 512k];
  • define region CRC = [end(FLASH)-4, size 4];
  • define region APPLICATION = FLASH - CRC;
  • fill APPLICATION with 0xFF;

 

将应用段放到APPLICATION 域。

使用选择的算法如CRC-32计算CRC。

  • place in CRC {
  • integrity check of APPLICATION with algorithm="CRC-32" fill=0xFF
  • };

 

  • place in CRC {  integrity check of APPLICATION with algorithm="CRC-32" fill=0xFF};

现在,APPLICATION域的CRC-32计算结果将保存在CRC域中。

 

02

实现

我们使用ST STM32F4_Discovery开发板,基于SEGGER Embedded Studio V7.10 提供的package manager创建STM32F4示例工程。

关于SES的使用,可以参考文章:EEWORLDLINKTK0

修改链接脚本

首先,我们需要在链接定位文件STM32F4xx_Flash_CCM.icf中定义应用程序和计算出的CRC值放置的区域:

  • define region CRC = [end(FLASH)-4 size 4];
  • define region APPLICATION = FLASH - CRC;

 

 

将应用段放置在APPLICATION区域之后,执行完整性检查,并将结果将被放置在CRC区域:

  • place in CRC {
  • integrity check of APPLICATION with algorithm="CRC-32/STM32" fill=0xFF
  • };
  • fill APPLICATION with 0xFF;

 

最后一行是可选的,确保Flash的所有空白区域使用相同值填充,用于计算CRC。

使用的算法是CRC-32/STM32,与目标处理器使用的算法相同。

 

03

验证CRC结果

STM32系列内置了一个CRC-32硬件计算单元,为了验证生成的CRC,我们将计算结果与STM32 CRC外设的硬件实现进行比较。

在应用程序使用STM32 CRC外设计算应用程序区域上的CRC,然后将其与链接器计算的CRC进行比较。

首先使能CRC外设,基于ST CMSIS文件,操作如下:

  • RCC->AHB1ENR |= RCC_AHB1ENR_CRCEN; // Enable CRC clock
  • CRC->CR |= CRC_CR_RESET; // Reset peripheral

 

为了计算CRC,数据被逐字写入CRC数据寄存器:

  • do {
  • CRC->DR = __REV(*pData); // Calculate CRC
  • pData++;
  • } while (NumItems--);
  • CRCResultHW = CRC->DR; // Save CRC result

 

注意,STM32 CRC外设需要反转一个字中各个字节的顺序。为此,我们只需使用Embedded Studio的内部函数__REV()。

运行该应用程序,在Debug Terminal窗口可以看到SEGGER linker CRC和STM32 CRC是匹配的。

通过SEGGER linker支持固件(firmware)完整性检查,无需外部工具,所有工作都可以在Embedded Studio工具链中本地完成,大大简化了需要完整性检查的设置。

附:

  • File : main.c
  • Purpose : Example application doing a CRC check using the STM32 CRC peripheral
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include "stm32f4xx.h"
  • #define FLASH_IMAGE_START 0x08000000
  • #define FLASH_IMAGE_END 0x080FFFFC
  • #define FLASH_APPLICATION_END (FLASH_IMAGE_END - 0x4)
  • /*********************************************************************
  • *
  • * main()
  • *
  • * Function description
  • * Application entry point.
  • */
  • int main(void) {
  • int i;
  • unsigned int NumItems;
  • unsigned int* pData;
  • unsigned int CRCResultHW;
  • unsigned int CRCResult;
  • unsigned int OldValue;
  • i = 0;
  • NumItems = (FLASH_APPLICATION_END - FLASH_IMAGE_START) / 4;
  • pData = (unsigned int*)FLASH_IMAGE_START; // points to start of Flash
  • CRCResult = *(unsigned int*)FLASH_IMAGE_END; // Saves CRC value calculated by SEGGER Linker
  • //
  • // Config CRC Module
  • //
  • RCC->AHB1ENR |= RCC_AHB1ENR_CRCEN;
  • CRC->CR |= CRC_CR_RESET;
  • //
  • // Calculate CRC with ST CRC unit over complete Flash area
  • //
  • do {
  • CRC->DR = __REV(*pData); // ST algorithm expects words in reversed order
  • pData++;
  • } while (NumItems--);
  • CRCResultHW = CRC->DR;
  • printf("Hardware calculated CRC over Flash is: 0x%X \n", CRCResultHW);
  • printf("SEGGER Linker calculated CRC over Flash is: 0x%X\n", CRCResult);
  • //
  • // Compare with Linker result
  • //
  • if (CRCResult == CRCResultHW) {
  • printf("Both CRC check sums are matching!\n");
  • } else {
  • printf("CRC check sums are not matching. Check parameters.\n");
  • }
  • do {
  • i++;
  • } while (1);
  • }

 

 
查看本帖全部内容,请登录或者注册

最新回复

使用SEGGER Linker的完整性检查功能可以在编译和链接时及时发现代码中的问题和不兼容情况,是一种有效的软件质量保障措施。   详情 回复 发表于 2023-5-18 19:48
点赞 关注
个人签名

欢迎关注“麦克泰技术”

 
 

回复
举报

4828

帖子

3

TA的资源

版主

沙发
 

使用SEGGER Linker的完整性检查功能可以在编译和链接时及时发现代码中的问题和不兼容情况,是一种有效的软件质量保障措施。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】电机开发很复杂?MotorXpert™助您事半功倍!
直播时间:4月8日(周二)上午10:00
直播奖励:京东卡等您拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 7

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表