在嵌入式產品應用中,為了保證系統數據在存儲或者傳輸過程中的完整性,固件映像中通常包含完整性檢查(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 };
現在,APPLICATION域的CRC-32計算結果將保存在CRC域中。
02
實現
我們使用ST STM32F4_Discovery開發板,基于SEGGER Embedded Studio V7.10 提供的package manager創建STM32F4示例工程。
修改鏈接腳本
首先,我們需要在鏈接定位文件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#include #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 ", CRCResultHW); printf("SEGGER Linker calculated CRC over Flash is: 0x%X ", CRCResult); // // Compare with Linker result // if (CRCResult == CRCResultHW) { printf("Both CRC check sums are matching! "); } else { printf("CRC check sums are not matching. Check parameters. "); } do { i++; } while (1); }
審核編輯:劉清
-
FlaSh
+關注
關注
10文章
1623瀏覽量
147781 -
crc
+關注
關注
0文章
199瀏覽量
29439 -
SHA
+關注
關注
0文章
16瀏覽量
8437 -
STM32F4
+關注
關注
3文章
194瀏覽量
28003 -
SEGGER
+關注
關注
0文章
38瀏覽量
14105
原文標題:使用SEGGER Linker的完整性檢查功能
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論