概述
IEC60730的附錄H(H.2.22)中對軟件進行了分類
A類軟件:軟件僅實現(xiàn)產(chǎn)品的功能,不涉及產(chǎn)品的安全控制。B類軟件:軟件的設(shè)計要防止電子設(shè)備的不安全操作。C類軟件:軟件的設(shè)計為了避免某些特殊的危險。本文主要介紹針對其中B類軟件而開發(fā)的CLASSB軟件包,安全庫相關(guān)代碼基本是獨立于芯片外設(shè)IP,軟件包中各型號的example都是基于AT-START開發(fā)板,其余暫未支持型號用戶可自行參考移植。
軟件庫總體架構(gòu)
Class B檢測診斷庫軟件包,基于AT32芯片的V2版本固件庫的文件夾結(jié)構(gòu),刪除了原固件庫中的demo、middlewares、dsp lib等IEC60730不需要的部分,添加集成IEC60730安全檢測相關(guān)代碼。軟件包文件夾總體結(jié)構(gòu)框架如下表:
表1.Class B軟件包文件夾結(jié)構(gòu)STL軟件由芯片外設(shè)驅(qū)動libraries、class b STL和user application組成,其中class b STL分為兩個主要部分:啟動時檢測和運行時周期檢測,架構(gòu)整體框圖如下:表2.軟件架構(gòu)整體框圖
軟件庫設(shè)計
本章節(jié)介紹STL例程通用的基本原理,并對工程結(jié)構(gòu)以及配置和調(diào)試相關(guān)信息進行說明。各個開發(fā)環(huán)境(IAR、Keil、AT32IDE)會有一些差別,也進行了說明。
故障安全處理
當(dāng)自檢程序檢測到故障時,故障安全處理函數(shù)selftest_fail_handle()被調(diào)用。at32_selftest_startup.c文件中定義了該函數(shù)。該程序的目的是提供自定義故障處理接口并允許用戶立即做出反應(yīng)。例程內(nèi)部對該函數(shù)沒有特定處理,只輸出調(diào)試打印信息,然后執(zhí)行系統(tǒng)復(fù)位。該程序的內(nèi)容由用戶根據(jù)實際應(yīng)用自行開發(fā),在該函數(shù)執(zhí)行應(yīng)用必須的操作,以保證應(yīng)用處于安全的狀態(tài)。該函數(shù)從程序的不同故障位置進行調(diào)用,為判斷故障問題的嚴(yán)重程度,用戶可以重新定義該函數(shù),添加一個特定的輸入?yún)?shù)(預(yù)先定義好的簡單常量)用于區(qū)分不同的故障。
程序RAM分布
為便于描述,將IEC60730必須用到的相關(guān)變量命名為Class B變量,用戶應(yīng)用相關(guān)的變量命名為Class A變量。每個Class B變量都使用一對互補值儲存在兩個單獨的RAM區(qū)。正常值和補碼值始終放在不相鄰的內(nèi)存位置。指定具體內(nèi)存地址的變量定義根據(jù)開發(fā)編譯環(huán)境的不同而寫法不同,具體的實現(xiàn)代碼通過宏定義區(qū)分,定義在at32_selftest_startup.c文件。
- IAR通過修改xxx.icf鏈接文件指定固定地址
- Keil通過修改xxx.sct分散加載文件指定固定地址
- AT32 IDE通過修改xxx.ld鏈接文件指定固定地址
每次使用Class B變量數(shù)值前,用戶必須確保比較每一個數(shù)值對(正常值和補碼值)的完整性。如果發(fā)現(xiàn)任何數(shù)值對的完整性被損壞,應(yīng)調(diào)用故障安全處理函數(shù)。如果變量值變化,需要同步更新存儲位置的補碼值以保持正確的數(shù)值對。下圖是STL程序中對于RAM區(qū)域使用情況的分布圖:圖1.RAM分布圖
工具特定集成設(shè)置
目前STL支持IAR、Keil和AT32 IDE三種IDE,對于不用的IDE,以下事項需注意:
- 修改鏈接腳本文件*.icf(IAR)、*.sct(Keil)、*.ld(AT32 IDE),定義RAM區(qū)域的使用分布情況和CRC checksum位置。
- 啟動時的自檢代碼函數(shù)selftest_startup_check(),需要進入主程序前,進行處理調(diào)用。IAR和AT32 IDE編譯器都是通過修改固件庫內(nèi)對應(yīng)的原始啟動文件startup_at32xxx.s,Keil編譯器通過修改$Sub$$main()程序。
- 執(zhí)行完啟動時的自檢程序后,需要跳轉(zhuǎn)進入標(biāo)準(zhǔn)C的main主函數(shù),因為不同編譯器方式不同,所以用宏goto_compiler_startup()進行定義。
- 在Keil中調(diào)用goto_compiler_startup()時,通過ENTER_MAIN_FLAG宏定義的CRC外設(shè)的CDT寄存器值,來判斷是進入啟動自檢程序還是真正的mian主程序。
程序執(zhí)行流程
Class B軟件包程序檢測內(nèi)容分為兩個主要部分:啟動時的自檢和運行時的周期自檢,總體流程框圖如下,圖中藍色框圖是相對于原應(yīng)用程序,執(zhí)行Class B需添加的部分。圖2.程序流程總框圖啟動時的自檢必須在應(yīng)用啟動之前執(zhí)行,調(diào)用函數(shù)selftest_startup_check(),在進入主循環(huán)前先調(diào)用函數(shù)selftest_runtime_init()做周期自檢初始化配置,然后函數(shù)selftest_runtime_check()進行周期自檢。例程中周期性自檢時基是采用1ms的systick中斷,根據(jù)變量time_base_flag判斷是否進行檢測,檢測時間間隔由宏定義SYSTICK_10MS_TB決定,用戶可以根據(jù)自己應(yīng)用進行調(diào)整,例程中是每10ms執(zhí)行一次周期自檢。注意:運行時如果自檢程序耗時太長,會影響正常應(yīng)用程序的進行,可以將自檢流程進行拆分,用systick中斷進行周期性的自檢。理論上,自檢模塊集成添加到應(yīng)用程序中時,用戶需要提供以下步驟:
- 在用戶程序啟動之前,執(zhí)行啟動前的初始檢測
- 在用戶程序執(zhí)行過程中,進行周期性的檢測
- 程序運行時,設(shè)置看門狗并及時喂狗防止復(fù)位
- 對RAM和Flash在初始階段和運行階段的測試,設(shè)置合適的測試區(qū)域
- 對于自檢測試發(fā)生的錯誤,以及其他hardfault等錯誤,需要進行合理的安全處理
注意:當(dāng)在啟動時的測試期間,如果程序啟用了調(diào)試信息,因為一些外設(shè)接口驅(qū)動程序可能會用到一些變量,在進行完內(nèi)存測試后,內(nèi)存中的內(nèi)容可能會丟失,所以需要用戶保證恢復(fù)這些變量。
啟動時檢測流程
啟動時檢測包括:
下圖是執(zhí)行啟動時自檢的流程框圖。圖3.啟動時自檢流程結(jié)構(gòu)
一、CPU啟動時檢測
進行CPU寄存器的相關(guān)檢測,主要檢查內(nèi)核標(biāo)志、寄存器和堆棧指針等是否正確。如果發(fā)生錯誤,就會調(diào)用故障安全處理函數(shù)Selftest_fail_handle()。該部分檢測源代碼是用匯編所寫,在KEIL、IAR以及AT32 IDE等不同的編譯環(huán)境下有差異,另外不同CPU內(nèi)核調(diào)用的指令可能也有差異,具體查看代碼。Cortex-M4內(nèi)核的MCU系列流程框圖如下圖4.cpu啟動時檢測流程
二、看門狗啟動時檢測
驗證看門狗復(fù)位功能是否正常,保證后續(xù)運行中如果因為程序計數(shù)器出現(xiàn)非預(yù)期異常情況導(dǎo)致程序跑飛時可以通過看門狗復(fù)位恢復(fù)。例程中為方便用戶參考,宏定義開啟了wwdt和wdt,實際應(yīng)用中,根據(jù)需求選擇開啟某一個或兩個都開啟。看門狗測試通過判斷復(fù)位狀態(tài)寄存器的復(fù)位標(biāo)識來判斷是否測試成功,測試流程如下:
A. 判斷wdt reset flag和wwdt reset flag是否都沒有置起,如果是則執(zhí)行步驟B開始wdt測試,如果不是則跳轉(zhuǎn)到步驟CB. 配置wdt并使能,然后不喂狗,等待wdt計數(shù)器超時而復(fù)位回到步驟AC. 判斷wdt reset flag是否置起,并且wwdt reset flag沒有置起,如果是則表明wdt測試通過,執(zhí)行步驟D開始wwdt測試,如果不是則跳轉(zhuǎn)到步驟ED. 配置wwdt并使能,然后不喂狗,等待wwdt計數(shù)器超時而復(fù)位回到步驟AE. 判斷wdt reset flag和wwdt reset flag是否都置起,如果是,則表明wdt和wwdt都測試通過,完成整個測試,如果不是則表明測試過程中有未知異常情況,清除所有reset flag,然后執(zhí)行軟件復(fù)位,回到步驟A重新開始測試。注意:為減少啟動階段的測試時長,啟動時的看門狗超時時間配置為最小值,運行時的超時時間需要根據(jù)實際應(yīng)用喂狗間隔時間配置。注意:測試過程中正常情況會有多次系統(tǒng)復(fù)位發(fā)生,測試完成后需清除所有的復(fù)位標(biāo)志位。流程框圖如下圖5.看門狗啟動時檢測流程
三、時鐘啟動時檢測
啟動階段的時鐘檢測通過內(nèi)部低速時鐘源(LICK)和系統(tǒng)時鐘的交叉測量結(jié)果來驗證。系統(tǒng)時鐘頻率作為基準(zhǔn)頻率,采用外部高速時鐘源(HEXT)或者內(nèi)部高速時鐘源(HICK)。啟動階段的時鐘檢測盡量使測試時間短,例程中MCU通常是通過專用的定時器TMR(時鐘源為系統(tǒng)時鐘)的某個通道輸入捕獲LICK邊沿頻率,定時器兩次捕獲時數(shù)據(jù)寄存器計數(shù)值之間的差值進行計算得到LICK實際測量值,與芯片數(shù)據(jù)手冊上列出的LICK規(guī)格的典型值進行比較。如果LICK實際測量值在規(guī)格范圍的最大和最小范圍內(nèi),則測試成功;如果超出了規(guī)格范圍值,則測試失敗。圖6.時鐘啟動時檢測流程四、Flash啟動時檢測Flash自檢是存儲器檢測的一部分,程序中測試范圍內(nèi)的Flash數(shù)據(jù)用CRC外設(shè)的算法計算,將結(jié)果值跟編譯時已存儲在Flash指定位置的預(yù)先計算好的CRC值進行比較。Flash的CRC值需要在調(diào)試或者燒錄階段跟正常應(yīng)用代碼一起下載到芯片F(xiàn)lash,所以需要在集成開發(fā)環(huán)境(IDE)編譯生成的HEX或者BIN檔中進行添加,下面分別介紹Keil、IAR、AT32 IDE,如何增加CRC到已編譯的HEX或者BIN文件中,因為Flash CRC運行時周期檢測是每次128字節(jié),所以該處設(shè)置的CRC地址范圍需128字節(jié)對齊。圖7.Flash啟動時CRC檢測流程
注意:CRC計算的Flash范圍需根據(jù)整個程序的實際情況進行配置,配置方法在各個IDE上有所不同。KEIL:使用雅特力自己的工具AT32_SelfTest_CRC,將Keil生成的hex檔添加CRC值另存為新的hex檔(也支持bin檔),程序代碼中使用硬件CRC進行計算,描述設(shè)置CRC檢測方法如下:1) 將執(zhí)行文件AT32_SelfTest_CRC.exe和參數(shù)文本SelfTest_CRC_Initparam.txt放在keil工程目錄中的同一個文件夾,程序例程是放在crc_tool文件夾中2) 工程中配置選擇對應(yīng)的文件夾路徑調(diào)用AT32_SelfTest_CRC.exe,將KEIL編譯生成的classb_demo.hex文件中的數(shù)據(jù)進行CRC計算,生成CRC chec_sum,合并到新的classb_demo_checked.hex文件中圖8.keil選項中添加AT32_SelfTest_CRC.exe
SelfTest_CRC_Initparam.txt用于配置參數(shù)1) input file:原始hex文件的名稱和地址,地址為hex文件相對Kei工程文件的路徑2) output file:添加CRC的hex文件的名稱和地址,地址為hex文件相對Kei工程文件的路徑3) start addr:計算CRC范圍的開始地址4) end addr:計算CRC范圍結(jié)束,CRC checksum放置地址5) fill blanks:CRC范圍內(nèi)原始hex文件的空白位置填充值,可以設(shè)置0xFF或者0x00圖9.配置文件內(nèi)容
在下載或者調(diào)試中,都需要用最終生成的classb_demo_checked.hex代替原始的classb_demo.hex,所以在Keil配置選項中需添加crc_load.ini文件用于加載新的hex文件
IAR:IAR配置選項支持CRC計算,只需要配置好參數(shù),編譯生成的文件就會自動將CRC check_sum值添加到選定Flash計算范圍后面,Checksum參數(shù)配置是根據(jù)測試MCU型號的硬件CRC外設(shè)模塊來確定,目前雅特力不同型號MCU的硬件CRC外設(shè)都相同,配置參數(shù)如下。圖10.IAP配置CRC
AT32 IDE:使用雅特力自己的工具AT32_SelfTest_CRC,將AT32 IDE生成的hex檔添加CRC值另存為新的hex檔(也支持bin檔),程序代碼中使用硬件CRC進行計算,描述設(shè)置CRC檢測方法如下:1) 將執(zhí)行文件AT32_SelfTest_CRC.exe和參數(shù)文本SelfTest_CRC_Initparam.txt放在AT32 IDE工程目錄中的同一個文件夾,程序例程是放在crc_tool文件夾中2) 工程中配置選擇對應(yīng)的文件夾路徑調(diào)用AT32_SelfTest_CRC.exe,將AT32 IDE編譯生成的classb_demo.hex文件中的數(shù)據(jù)進行CRC計算,生成CRC chec_sum,合并到新的classb_demo_checked.hex文件中SelfTest_CRC_Initparam.txt用于配置參數(shù),具體參數(shù)內(nèi)容參考上文中Keil章節(jié)的介紹。圖11.AT32 IDE選項中添加AT32_SelfTest_CRC.exe
在下載或者調(diào)試中,都需要用最終生成的classb_demo_checked.hex代替原始的classb_demo.hex,所以在AT32 IDE配置選項中需配置加載新的hex文件,采用AT-Link調(diào)試器時配置如下圖圖12.AT32 IDE debug選項加載新的有CRC checksum的hex檔
注意:計算CRC值的Flash范圍根據(jù)應(yīng)用程序的實際大小確定,生成的CRC32 check sum存儲地址需位于Flash空白區(qū),否則可能覆蓋修改到該存儲地址的原始數(shù)據(jù)從而導(dǎo)致異常。
五、RAM啟動時檢測
RAM自檢是存儲器檢測的一部分,支持和不支持硬件SRAM奇偶校驗功能的型號可以采用不同的方式檢測。對于支持硬件SRAM奇偶校驗功能的型號,如果使用硬件RAM檢測的方式,需使能芯片的硬件RAM校驗功能,該功能的開啟推薦在量產(chǎn)階段同代碼燒錄一起完成。前期開發(fā)設(shè)計階段,可以通過ICP等工具配置開啟。支持硬件SRAM奇偶校驗功能的型號硬件SRAM校驗功能開啟后,因為上電SRAM數(shù)據(jù)是隨機值,所以需要在程序啟動階段對SRAM數(shù)據(jù)進行初始化,對于Keil、IAR、AT32 IDE三種IDE,都是修改.s啟動進行SRAM數(shù)據(jù)初始化,代碼寫法可能稍有差異,下圖是Keil的.s啟動文件添加SRAM初始化為全0x00的代碼圖13.Keil啟動文件添加SRAM初始化使用硬件SRAM檢測功能,工程代碼有兩處宏定義修改:1) at32_selftest_param.h文件中開啟宏定義HW_RAM_CHECK2) 工程匯編配置中開啟宏定義HW_RAM_CHECK,下面分別是Keil、IAR、AT32 IDE配置截圖圖14.Keil匯編配置開啟HW_RAM_CHECK
圖15.IAR匯編配置開啟HW_RAM_CHECK
圖16.AT32 IDE匯編配置開啟HW_RAM_CHECK
不支持硬件SRAM奇偶校驗功能的型號采用March C算法,用值0x55555555和0xAAAAAAAA逐字交替填充整個RAM并檢查,基本物理單元是4字,下圖單元格內(nèi)的編號代表測試填充的順序。圖17.RAM基本單元原理
RAM采用March C算法測試時分6個步驟,前3個循環(huán)按照地址遞增執(zhí)行,后3個循環(huán)按照地址遞減執(zhí)行。測試步驟如下,如果采用March X算法則省略步驟3和4:1. 全部范圍寫0x55555555,按照地址遞增順序執(zhí)行2. 檢測是否全部范圍為0x55555555,然后全部范圍寫0xAAAAAAAA,按照地址遞增順序執(zhí)行3. 檢測是否全部范圍為0xAAAAAAAA,然后全部范圍寫0x55555555,按照地址遞增順序執(zhí)行4. 檢測是否全部范圍為0x55555555,然后全部范圍寫0xAAAAAAAA,按照地址遞減順序執(zhí)行5. 檢測是否全部范圍為0xAAAAAAAA,然后全部范圍寫0x55555555,按照地址遞減順序執(zhí)行6. 檢測是否全部范圍為0x55555555,按照地址遞減順序執(zhí)行流程框圖如下:圖18.RAM啟動時檢測流程
六、控制流啟動時檢測
控制流檢測也屬于程序計數(shù)器檢測的一部分,啟動階段控制流檢測主要分為了兩個節(jié)點,因為RAM檢測會導(dǎo)致所有變量被清除,包括定義為控制流檢測相關(guān)的變量也會被清除,所以其中一個檢測節(jié)點是在RAM檢測之前,通過控制流變量值判斷是否前面所有測試項都正確完成,另外一個節(jié)點是在RAM檢測后,主要是運行階段檢測必須操作的流程的配置,比如CRC參考變量初始化、棧溢出pattern設(shè)置。對于控制流檢測,基本上每項檢測模塊都可以定義檢測兩層結(jié)構(gòu),其一是該項檢測模塊流程上是否正確調(diào)用(CALLER),其二是該項檢測模塊是否被正確執(zhí)行(CALLEE),檢測方法概述如下:1. 定義兩個變量指示控制流進度,設(shè)置初始值ctrl_flow_cnt為0x00000000,ctrl_flow_cnt_inv為0xFFFFFFFF,其初始狀態(tài)互為取反的2. 給每項測試模塊定義兩個固定數(shù)值分別表示CALLER和CALLEE,并賦予不同的值3. 調(diào)用一項檢測模塊前,將ctrl_flow_cn增加CALLER的固定值,標(biāo)示該模塊已經(jīng)調(diào)用4. 進入對應(yīng)檢測模塊內(nèi)部,將ctrl_flow_cn增加CALLEE的固定值,標(biāo)示該模塊正在執(zhí)行5. 執(zhí)行完對應(yīng)檢測模塊內(nèi)部,退出前ctrl_flow_cn_inv減少CALLEE的固定值,標(biāo)示該模塊執(zhí)行正確6. 完成對應(yīng)檢測模塊,進入下一項檢測模塊前,將ctrl_flow_cn_inv減少CALLER的固定值,標(biāo)示該模塊調(diào)用正確7. 檢測ctrl_flow_cnt和ctrl_flow_cnt_inv是否仍互為取反的,如果是則表明對應(yīng)檢測模塊流程上被正確調(diào)用,并且該檢測模塊被正確執(zhí)行
運行時周期檢測初始化
如果啟動時的自檢成功通過,并且標(biāo)準(zhǔn)初始化也完成了,運行時的周期自檢必須在進入主循環(huán)之前進行初始化。該部分主要是一些后續(xù)自檢會使用到的變量的初始化、中斷中可能用到的數(shù)據(jù)的同步處理以及看門狗的配置等。
運行時周期檢測流程
運行時的檢測是以systick作為時基,進行周期性的檢測。運行時周期檢測包括:
- 局部CPU內(nèi)核寄存器檢測
- 系統(tǒng)時鐘運行檢測
- Flash CRC分段檢測
- 堆棧邊界溢出檢測
- 控制流檢測
- 局部RAM自檢(在中斷服務(wù)程序中進行)
- 看門狗喂狗
圖19.運行時周期自檢及中斷服務(wù)流程結(jié)構(gòu)
一、CPU運行時檢測
CPU運行時周期自檢跟啟動時的自檢類似,只是不檢測內(nèi)核標(biāo)志和堆棧指針。圖20.CPU運行時檢測流程
二、系統(tǒng)時鐘運行時檢測
運行時系統(tǒng)時鐘的檢測跟啟動時時鐘檢測原理相同。因為運行時的時鐘檢測會一直循環(huán)執(zhí)行,對某些用戶應(yīng)用,如果采用定時器捕獲LICK邊沿的方式,可能中斷頻率太高會有影響,所以也可以采用其他方式進行測試,測試原理不變?nèi)匀皇峭ㄟ^內(nèi)部低速時鐘源(LICK)和系統(tǒng)時鐘的交叉測量結(jié)果來驗證,AT32F403A和AT32F415例程分別采用了兩種不同的測試方法,供用戶參考。
- 在AT32F403A例程中,跟啟動時時鐘檢測方法相同,仍然采用專用的定時器TMR輸入捕獲LICK邊沿頻率的方式進行測試,下圖是采用定時器捕獲LICK測試方式的流程。
圖21.系統(tǒng)時鐘運行時定時器捕獲LICK檢測方式流程
- 在AT32F415的例程中,使用ERTC(時鐘源為LICK)和Systick定時器(時鐘源為系統(tǒng)時鐘)之間交叉測量,ERTC按照數(shù)據(jù)手冊上LICK典型值作為時鐘源配置秒中斷參數(shù),Systick定時器中斷配置為1毫秒,Systick中斷計數(shù)變量tick_cnt_val累加,ERTC秒中斷時獲得Systick的計數(shù)變量數(shù)值,以此計算得到LICK實際測試值,如果在規(guī)格范圍內(nèi)的最大和最小值之間,測試通過。下圖是采用ERTC獲取Systick變量值測試方式的流程圖。
圖22.系統(tǒng)時鐘運行時ERTC獲取Systick值檢測方式流程
三、Flash CRC運行時檢測
運行時進行Flash CRC的自檢,因為檢測范圍不同耗時不同,如果一次計算檢測全部范圍CRC可能耗時過長,影響正常應(yīng)用部分的執(zhí)行,所以可以根據(jù)用戶應(yīng)用程序大小配置分段CRC計算,當(dāng)計算到最后一段范圍時,再進行CRC值比較,如果不一致則測試失敗。圖23.Flash CRC運行時檢測流程
四、棧邊界運行時溢出檢測
可驗證尋址和數(shù)據(jù)路徑測試相關(guān),定義特殊固定值的Magic Pattern數(shù)組,放置在棧區(qū)域最底部地址,通過運行中檢測Magic Pattern數(shù)組完整性來判斷棧是否溢出。如果原始Pattern被破壞,則表明棧溢出測試失敗,調(diào)用故障安全程序。這一區(qū)域根據(jù)設(shè)備及應(yīng)用有不同的配置。用戶必須為堆棧定義足夠的區(qū)域,并保證pattern正確放置。圖24.堆棧邊界溢出運行時檢測流程
五、RAM運行時檢測
對于不支持硬件SRAM奇偶校驗功能的型號,運行時的RAM自檢是在systick中斷函數(shù)中進行的。測試范圍可以根據(jù)用戶實際應(yīng)用需求調(diào)整,通過修改代碼中宏定義RUNTIME_RAM_START_ADDR和RUNTIME_RAM_END_ADDR來完成,需注意的是因為測試包括了測試區(qū)域前后相鄰的字,所以測試范圍前后要保留適當(dāng)余量,不要覆蓋臨時保存數(shù)據(jù)的緩沖塊(buffer block)和溢出芯片RAM范圍。測試流程方法概要描述如下:
- 測試根據(jù)systick時基分批次進行,每次測試按照CLASS B部分4個字的區(qū)域偏移,為保障耦合故障覆蓋率,每次測試的實際內(nèi)存塊還包括測試區(qū)域前后各1個相鄰字,總共6個字。
- 首先將待測試內(nèi)存塊(RAM block)的數(shù)據(jù)存儲到專門用于測試過程中臨時保存數(shù)據(jù)的緩沖塊(buffer block)
- 然后跟啟動時檢測RAM類似,對測試內(nèi)存塊(RAM block)采用March C算法測試
- 測試完成后將緩沖塊(buffer block)中保存的數(shù)據(jù)恢復(fù)至測試內(nèi)存塊(RAM block)
下圖描述了故障耦合的基本原理,圖中數(shù)據(jù)編號表示操作先后順序。圖25.局部RAM檢測故障耦合加擾模式原理圖26.局部RAM運行時檢測流程
六、看門狗運行時刷新
作為程序計數(shù)器檢測的一部分,運行時需要定期喂狗保證系統(tǒng)正常運行,看門狗的刷新部分放置在每次檢測最后部分。注意:運行時的看門狗超時時間,根據(jù)用戶程序中刷新喂狗代碼的調(diào)用頻率配置,軟件庫源代碼通常采用的是10ms調(diào)用一次,所以源代碼中看門狗超時時間配置大于10ms。
注意事項
用戶使用中可能會根據(jù)實際情況對CLASSB代碼進行修改,如果改動不符合要求可能導(dǎo)致檢測失敗,本章節(jié)列舉了一些常見的注意事項。
一、程序中自定義參數(shù)修改
系統(tǒng)主頻根據(jù)實際應(yīng)用修改,函數(shù)為selftest_system_clock_config()。其余配置參數(shù)定義在at32_selftest_param.h文件以及各自集成開發(fā)環(huán)境的鏈接或者分散加載文件中,根據(jù)實際應(yīng)用進行修改,下面分別對Keil、IAR、AT32 IDE進行說明。at32_selftest_param.h文件中各個集成開發(fā)環(huán)境通用部分如下:圖27.通用可修改參數(shù)at32_selftest_param.h文件中跟各個集成開發(fā)環(huán)境相關(guān)寫法不一致的部分如下Keil:圖28.Keil可修改參數(shù)
IAR:圖29.IAR可修改參數(shù)
AT32 IDE:圖30.AT32 IDE可修改參數(shù)
二、Flash CRC檢測范圍設(shè)置
因為在Flash CRC運行時檢測是分段進行的,所以設(shè)置的總大小范圍需要跟代碼中的分段大小宏定義ROM_ONCE_VERIYF_SIZE成整數(shù)倍對齊,否則可能導(dǎo)致最后計算CRC失敗。
三、RAM檢測范圍設(shè)置
因為在運行時檢測是每次4個字,所以檢測范圍也需要保證4字對齊,并且因為檢測范圍前后還需2個字的空隙,所以設(shè)置范圍時要防止覆蓋到測試RAM時臨時保存數(shù)據(jù)的緩沖塊(buffer block)或者溢出芯片RAM范圍,導(dǎo)致在RAM測試時程序出錯。
四、編譯器影響
1. 編譯器的優(yōu)化不僅會導(dǎo)致程序分析調(diào)試?yán)щy,還可能導(dǎo)致程序出現(xiàn)非預(yù)期的結(jié)果,所以強烈建議在使用中針對CLASSB部分代碼不要進行優(yōu)化。2. 當(dāng)使用不同版本的編譯器時,程序可能有差異。新版CLASS軟件庫對于不同型號MCU的工程,為方便使用不同編譯器版本的用戶移植,可能使用了不同的編譯器版本。
軟件庫說明
一、軟件庫下載各個已支持型號對應(yīng)的軟件庫源代碼開放于Example Code中,用戶可以通過官網(wǎng)下載,官網(wǎng)中Example Code內(nèi)容的鏈接地址為https://www.arterytek.com/cn/support/index.jsp?index=2,可搜索關(guān)鍵字“60730”快速查找已支持型號MCU的軟件庫,例如AT32F403A的軟件庫文件為“AT32F403A 407 IEC 60730 CLASSB LIB”。二、軟件庫演示下面以SC0127 AT32F403A 407 IEC 60730 CLASSB LIB為例,AT32F403A安全庫的例程運行環(huán)境如下:
- KEIL工程為V5.36版本,IAR工程為V8.2版本,AT32 IDE工程為V1.0.09版本。
- Demo運行基于F403A芯片,運行在AT-START-F403A開發(fā)板。
- 工程路徑為:utilities\classb_demo
圖31.運行打印信息
-
軟件
+關(guān)注
關(guān)注
69文章
5152瀏覽量
89210 -
IEC
+關(guān)注
關(guān)注
2文章
212瀏覽量
29563 -
AT32
+關(guān)注
關(guān)注
1文章
121瀏覽量
2705
發(fā)布評論請先 登錄
PSoC 4-IEC 60730 B級和IEC 61508 SIL安全軟件庫
首日速遞 | 雅特力閃耀2025慕尼黑上海電子展,全方位展現(xiàn)智能“芯”實力

汽車芯片廠商芯弦半導(dǎo)體NSSineTM系列實時控制MCU通過IEC 60730 Class B功能安全認(rèn)證

雅特力AT32F402/F405入門使用指南

雅特力AT32 Workbench煥“芯”升級!引入Middleware助力開發(fā)高效提速

AN136 基于GD32F30x系列的IEC60730 ClassB庫移植指南

基于GD32F3x0系列的IEC60730 ClassB庫移植指南

STM32應(yīng)用中UL/CSA/IEC 60730-1/60335-1的B類認(rèn)證獲取指南
國民技術(shù)N32 MCU通過IEC/EN/UL 60730功能安全認(rèn)證

AT32講堂088 | 雅特力AT32F402/F405時鐘配置

AT32講堂087 | 雅特力AT32 IDE快速入門指南

雅特力AT32 MCU的隨機數(shù)生成

AT32講堂085 | 雅特力AT32 MCU HICK時鐘校準(zhǔn)

喜訊!雅特力科技蟬聯(lián)「重慶市軟件和信息服務(wù)企業(yè)五十強」

評論