在嵌入式產(chǎn)品應(yīng)用中,為了保證系統(tǒng)數(shù)據(jù)在存儲(chǔ)或者傳輸過(guò)程中的完整性,固件映像中通常包含完整性檢查(integrity checks),以檢測(cè)映像是否損壞。例如,bootloader可以基于完整性檢查驗(yàn)證一個(gè)更新的固件映像是否可信?;蛘吖碳谕暾詸z查可以自我驗(yàn)證,檢查Flash是否損壞。
SEGGER Embedded Studio從v5.10版本(Linker v3.00及以上版本)開(kāi)始提供完整性檢查功能,支持多種CRC和消息摘要算法(例如MD5和SHA)。
	

01
使用方法
使用Linker提供的完整性檢查功能,首先需要將執(zhí)行檢查的區(qū)域定義為一個(gè)region,并為放置計(jì)算結(jié)果的區(qū)域定義一個(gè)region。
我們可以為整個(gè)Flash區(qū)域上創(chuàng)建一個(gè)CRC,并將結(jié)果放在Flash的末尾 。
此外,我們還可以定義計(jì)算CRC的區(qū)域的填充值。如:
define region FLASH = [0x80000000 size 512k]; define region CRC = [end(FLASH)-4, size 4]; define region APPLICATION = FLASH - CRC; fill APPLICATION with 0xFF;
將應(yīng)用段放到APPLICATION 域。
使用選擇的算法如CRC-32計(jì)算CRC。
place in CRC { integrity check of APPLICATION with algorithm="CRC-32" fill=0xFF };
現(xiàn)在,APPLICATION域的CRC-32計(jì)算結(jié)果將保存在CRC域中。
02
實(shí)現(xiàn)
我們使用ST STM32F4_Discovery開(kāi)發(fā)板,基于SEGGER Embedded Studio V7.10 提供的package manager創(chuàng)建STM32F4示例工程。
修改鏈接腳本
首先,我們需要在鏈接定位文件STM32F4xx_Flash_CCM.icf中定義應(yīng)用程序和計(jì)算出的CRC值放置的區(qū)域:
define region CRC = [end(FLASH)-4 size 4]; define region APPLICATION = FLASH - CRC;
將應(yīng)用段放置在A(yíng)PPLICATION區(qū)域之后,執(zhí)行完整性檢查,并將結(jié)果將被放置在CRC區(qū)域:
place in CRC {
integrity check of APPLICATION with algorithm="CRC-32/STM32" fill=0xFF
};
fill APPLICATION with 0xFF;
最后一行是可選的,確保Flash的所有空白區(qū)域使用相同值填充,用于計(jì)算CRC。
使用的算法是CRC-32/STM32,與目標(biāo)處理器使用的算法相同。
03
驗(yàn)證CRC結(jié)果
STM32系列內(nèi)置了一個(gè)CRC-32硬件計(jì)算單元,為了驗(yàn)證生成的CRC,我們將計(jì)算結(jié)果與STM32 CRC外設(shè)的硬件實(shí)現(xiàn)進(jìn)行比較。
在應(yīng)用程序使用STM32 CRC外設(shè)計(jì)算應(yīng)用程序區(qū)域上的CRC,然后將其與鏈接器計(jì)算的CRC進(jìn)行比較。
首先使能CRC外設(shè),基于ST CMSIS文件,操作如下:
RCC->AHB1ENR |= RCC_AHB1ENR_CRCEN; // Enable CRC clock CRC->CR |= CRC_CR_RESET; // Reset peripheral
為了計(jì)算CRC,數(shù)據(jù)被逐字寫(xiě)入CRC數(shù)據(jù)寄存器:
do {
           CRC->DR = __REV(*pData);  // Calculate CRC
        pData++;
} while (NumItems--);       
CRCResultHW = CRC->DR;      // Save CRC result
注意,STM32 CRC外設(shè)需要反轉(zhuǎn)一個(gè)字中各個(gè)字節(jié)的順序。為此,我們只需使用Embedded Studio的內(nèi)部函數(shù)__REV()。
運(yùn)行該應(yīng)用程序,在Debug Terminal窗口可以看到SEGGER linker CRC和STM32 CRC是匹配的。
	
通過(guò)SEGGER linker支持固件(firmware)完整性檢查,無(wú)需外部工具,所有工作都可以在Embedded Studio工具鏈中本地完成,大大簡(jiǎn)化了需要完整性檢查的設(shè)置。
附:
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
                                +關(guān)注關(guān)注 10文章 1704瀏覽量 154309
- 
                                crc
                                +關(guān)注關(guān)注 0文章 204瀏覽量 30562
- 
                                SHA
                                +關(guān)注關(guān)注 0文章 19瀏覽量 8658
- 
                                STM32F4
                                +關(guān)注關(guān)注 3文章 204瀏覽量 29728
- 
                                SEGGER
                                +關(guān)注關(guān)注 0文章 58瀏覽量 14702
原文標(biāo)題:使用SEGGER Linker的完整性檢查功能
文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
了解信號(hào)完整性的基本原理
 
    
Samtec虎家大咖說(shuō) | 淺談信號(hào)完整性以及電源完整性
 
    
電源完整性基礎(chǔ)知識(shí)
信號(hào)完整性測(cè)試基礎(chǔ)知識(shí)
 
    
電源完整性分析及其應(yīng)用
普源DHO3000系列示波器電源完整性測(cè)試
 
    
技術(shù)資訊 | 信號(hào)完整性測(cè)試基礎(chǔ)知識(shí)
 
    
普源示波器在信號(hào)完整性分析中的應(yīng)用研究
 
    
PCB信號(hào)完整性探討-PPT
 
    
是德示波器在電源完整性分析中的應(yīng)用
 
    
如何解決信號(hào)完整性問(wèn)題
 
    
聽(tīng)懂什么是信號(hào)完整性
 
    
12月20日線(xiàn)上講堂|聽(tīng)懂什么是信號(hào)完整性
 
    
 
           
        
 
         使用SEGGER Linker的完整性檢查功能
使用SEGGER Linker的完整性檢查功能 
                 
  
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評(píng)論