• 資料介紹
    • 1、簡介
    • 2、功能安全 Flash 自檢原理
    • 3、使用 Linker 自定義符號變量計算 ROM 大小
    • 4、小結(jié)
  • 資料預(yù)覽
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

LAT1471 Flash全片自檢過程中巧用Linker自定義變量

03/06 14:44
479
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

LAT1471 Flash全片自檢過程中巧用Linker自定義變量

452.59 KB

1、簡介

Flash 自檢是功能安全應(yīng)用 ClassB 或者 SIL 必不可少的測試項(xiàng)目,自檢包含啟動時自檢和運(yùn)行時自檢,通常情況下,啟動時自檢要求對 Flash 全片 ROM 進(jìn)行自檢,在 Flash 全片自檢過程中,需要知道 ROM 實(shí)際占用的 Flash 大小,如果配置的參數(shù)與 ROM 實(shí)際大小不一致,那么自檢就會失敗??蛻粼儐枌?shí)際開發(fā)過程中是否有較好的方法獲取實(shí)際的 ROM 大小進(jìn)行 Flash 全片自檢配置,針對客戶的疑問,本文介紹功能安全應(yīng)用中 Flash 自檢的原理以及在 KEIL 編譯環(huán)境下如何使用鏈接器自定義變量計算實(shí)際的 ROM 大小。

2、功能安全 Flash 自檢原理

STM32 提供了針對功能安全應(yīng)用的自檢庫,我們以 ClassB 4.0 為例,自檢庫實(shí)現(xiàn)了Flash 自檢功能,F(xiàn)lash 自檢采用 CRC 算法對 ROM 區(qū)進(jìn)行校驗(yàn),主要分為 CRC 預(yù)計算和CRC 比較兩個步驟,下面分別描述兩個步驟的主要內(nèi)容。

  • CRC 預(yù)計算,針對編譯生成的可執(zhí)行文件生成 CRC 并插入 CRC 到可執(zhí)行文件中,其生成 CRC 的過程要符合如下要求。
  1. Flash 空間劃分為 CRC 區(qū)域和程序區(qū),其中 CRC 區(qū)域的起始地址與 Flash 大小相關(guān),其計算的公式如下:CRC 區(qū)域起始地址=Flash 結(jié)束地址-4*(Flash 大小/1024),如果Flash 大小為 2M 字節(jié),起始地址為 0x08000000,那么 CRC 區(qū)域的起始地址為0x08200000-4*(0x200000/1024)=0x81E0000。
  1. 程序區(qū)從 Flash 起始地址開始,分為連續(xù)的 Section,每個 Section 的大小為 1024 字節(jié),實(shí)際程序能夠使用的 Flash 空間最大為 Flash 大小-CRC 區(qū)域大小,也就是 FlashSize-4*(Flash Size/1024),對于 2M 空間的 Flash,其程序空間最大為 0x1E0000。
  1. 編譯生成的可執(zhí)行文件 ROM 包含了 Code 段,RO 段以及 RW 段,使用STM32_Programmer_CLI 工具預(yù)計算 CRC 的過程,只對實(shí)際產(chǎn)生的 ROM 段進(jìn)行計算,ROM 段必須保證 4 字節(jié)對齊,ROM 按照 1024 字節(jié)為單位劃分為多個

Section,通常最后一個 Section 不足 1024 字節(jié),但是也記作一個 Section。假設(shè)可執(zhí)行文件的 ROM 大小為 81928,那么其一共劃分為 81 個 Section,其中最后一個Section 占用 8 字節(jié)空間,STM32_Programmer_CLI 工具針對這個 ROM 生成 81 個CRC 值,其中前 80 個 CRC 值為 1024 字節(jié)的校驗(yàn)碼,最后一個 CRC 值為 8 字節(jié)的校驗(yàn)碼。這 80 個 CRC 值按照順序存放在 CRC 區(qū)域空間。

  1. 燒錄程序的過程中,可執(zhí)行程序二進(jìn)制代碼和工具生成從 CRC 分別燒錄到 Flash 的程序空間和 CRC 空間。
  • CRC 比較,程序運(yùn)行階段,用戶程序調(diào)用功能安全庫提供的自檢 API 進(jìn)行檢測,用戶需要正確配置 ROM 檢測的范圍,功能安全庫提供了標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu)供用戶配置自檢范圍。

用戶程序通過上述兩個數(shù)據(jù)結(jié)構(gòu)配置 Flash 自檢的區(qū)域,待測試的 Flash 區(qū)域通過STL_MemSubSet_t 結(jié)構(gòu)體指定,用戶可以定義一個或多個 MemSubSet,對于 Flash全片測試,只需要定義一個 MemSubSet,其中 StartAddr 為 ROM 起始地址,EndAddr 為 ROM 的結(jié)束地址,正確的 ROM 結(jié)束地址是確保自檢通過的必備條件。

3、使用 Linker 自定義符號變量計算 ROM 大小

因?yàn)樵?Flash 自檢中,需要正確地配置 ROM 的大小,最簡單的辦法就是代碼編譯完成,查看編譯的結(jié)果得到 ROM 的大小,再把這個值填上去。這種方法存在的問題就是每次修改代碼可能會導(dǎo)致 ROM 大小發(fā)生變化,這意味著每次都要修改參數(shù),否則自檢就會出錯。實(shí)際上,在代碼編譯過程中,KEIL 編譯器已經(jīng)定義了一些變量,用戶程序可以直接引用,這些變量包含了可執(zhí)行文件的各個段的長度信息,如果用戶代碼需要計算 ROM 大小,直接使用這些變量即可。從 KEIL 的幫助文檔中,可以找到這些變量的定義以及如何在用戶代碼中使用這些變量。

4、小結(jié)

本文介紹了功能安全應(yīng)用中,F(xiàn)lash 自檢原理以及對 Flash 進(jìn)行全片自檢過程中如何使用Linker 自定義變量計算實(shí)際 ROM 大小的方法。

資料預(yù)覽

相關(guān)推薦