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