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

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

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

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

452.59 KB

1、簡介

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

2、功能安全 Flash 自檢原理

STM32 提供了針對功能安全應(yīng)用的自檢庫,我們以 ClassB 4.0 為例,自檢庫實現(xiàn)了Flash 自檢功能,F(xiàn)lash 自檢采用 CRC 算法對 ROM 區(qū)進行校驗,主要分為 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é),實際程序能夠使用的 Flash 空間最大為 Flash 大小-CRC 區(qū)域大小,也就是 FlashSize-4*(Flash Size/1024),對于 2M 空間的 Flash,其程序空間最大為 0x1E0000。
  1. 編譯生成的可執(zhí)行文件 ROM 包含了 Code 段,RO 段以及 RW 段,使用STM32_Programmer_CLI 工具預(yù)計算 CRC 的過程,只對實際產(chǎn)生的 ROM 段進行計算,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é)的校驗碼,最后一個 CRC 值為 8 字節(jié)的校驗碼。這 80 個 CRC 值按照順序存放在 CRC 區(qū)域空間。

  1. 燒錄程序的過程中,可執(zhí)行程序二進制代碼和工具生成從 CRC 分別燒錄到 Flash 的程序空間和 CRC 空間。
  • CRC 比較,程序運行階段,用戶程序調(diào)用功能安全庫提供的自檢 API 進行檢測,用戶需要正確配置 ROM 檢測的范圍,功能安全庫提供了標準的數(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 大小

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

4、小結(jié)

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

資料預(yù)覽

相關(guān)推薦