隨著越來越多的工業應用對產品的可靠性和安全性要求越來越高,我們在做產品設計的時候不僅要正確的實現產品功能,同時也需要通過一些功能安全認證,比如家電行業的 IEC60730 等或者 ISO13849 等。一般的系統故障可以通過設計的迭代和嚴格測試來避免,但是硬件的隨機失效理論上是無法完全消除的,所以要想提高硬件隨機失效的診斷覆蓋率,就需要軟硬件診斷機制來保障。
作為系統的核心控制部分,MCU 主平臺的診斷機制就是最關鍵的部分。針對一般通用的 MCU,以 Piccolo C2000 系列為例,硬件上提供了一些診斷或者校驗機制,如下所示:
同時 TI 也提供了一些軟件診斷方案,如 MSP430 IEC60730 Software Package 和 C2000 SafeTI 60730 SW Packages 軟件庫等,可以提供很多的診斷測試功能,例如 CPU、時鐘、外設、RAM 等的診斷,已經可以滿足一部分的需求。如下圖所示為 C2000 SafeTI 60730 SW Packages 中的功能和資源消耗。
然而在實際的應用中,有些安全標準要求對 RAM 進行周期性的在線診斷,同時不能影響程序的正常運行。但是程序在運行過程中存儲在 RAM 中的數據會實時的變化,而 RAM 的診斷往往會破壞這些存儲的數據,比如電機控制類的實時性要求較高的場合。所以在沒有 ECC 的情況下,如何對 RAM 進行實時在線的診斷是一個值得討論的問題。
下面以電機控制為例,討論硬件校驗的實現,尤其是 RAM 在線檢測的過程。
1. 系統軟件流程
非破壞性的診斷可以放在背景循環里面進行,這些軟件診斷不會對實時性中斷造成影響,例如看門狗測試,內部晶振測試,FLASH CRC 校驗,靜態變量 RAM CRC 校驗,堆棧溢出判斷,以及 GPIO 口診斷等。另外一些破壞性的或者對實時控制有影響的診斷,可以放到主中斷中進行,如 RAM March 校驗,ALU 診斷以及 CPU 寄存器診斷等。具體流程圖如下所示:
2. RAM 診斷的方法
以 C2000 SafeTI 60730 SW Packages 為例,主要提供了兩種 RAM 檢測方式。
一種是 CRC 檢測 STL_CRC_TEST_testRam,此功能用于測試 RAM 的位錯誤。該測試以 0 和 1 的交替模式填充被測 RAM 區域,并使用 PSA 計算 RAM 的 CRC。對于給定的 RAM 存儲器區域,如果 RAM 存儲器中沒有任何 stuck bit,則 CRC 值應始終相同。并行串行分析器(PSA)是 c28x 器件中的一個模塊,可用于生成 40 位給定存儲區域上的 CRC。 PSA 多項式為 Y = x40 + x21 + x19 + x2 + 1。PSA 通過監視數據讀取數據總線(DRDB)來計算 CRC 值。 一旦激活就會監控 Data Read Data Bus (DRDB),當 CPU 通過 DRDB 讀取數據時,PSA 每個時鐘周期會為 DRDB 上的數據生成一個 CRC。由于此測試具有破壞性,因此需要將要測試的 RAM 內容保存到單獨的 RAM 位置。
當然也可以使用軟件 CRC 的方式,使用起來更靈活,并且可以選擇非破壞性的方式來計算 CRC,對一些靜態常量存儲的區域可以考慮這種 CRC 方式。另外一點是軟件 CRC 算法可以更方便的進行代碼評估,以滿足不同安全標準的要求。
另一種是 MARCH 檢測 STL_MARCH_TEST_testRam,此功能直接對 RAM 進行 32bit 的讀寫測試,可以選擇進行 MarchC 13N 或者 MarchC- 測試。由于此測試具有破壞性,因此也需要將要測試的 RAM 內容保存到單獨的 RAM 位置。
3. RAM 在線檢測的實現
由于需要周期性的 RAM 檢測,以電機控制為例,可以將 RAM 檢測放到主中斷里面執行。同時關鍵是不能影響控制程序的運行和實時性,所以主要考慮兩點:
第一是主中斷時間有限,要盡可能減小 RAM 檢測的時間,所以可以將 RAM 分成多個小段進行檢測,每段 RAM 越小,占用中斷的時間越小,但是所有 RAM 檢測一遍的時間會變長,這個需要綜合考慮。
第二是不能破壞 RAM 中的變量值,所以在檢測是之前將 RAM 段中的內容保存到專門區域,戴檢測完成并且通過之后,再將保存好的數據恢復過來,使用 memCopy 來提高效率。
具體實現方法如下:
首先定義好各個 RAM 區間的地址范圍,可以參考具體的數據手冊,如下所示:
然后定義好檢測的范圍和每次檢測的數據長度:
注意由于 STL_MARCH_TEST_testRam 函數執行 32 位讀 / 寫測試,而在測試 RAM 單元陣列時,由于 RAM 單元的 16 位體系結構,所以要求起始地址為偶數,結束地址為奇數,可以測試的最大內存范圍限制為 65535 個 32 位字。所以要求測試長度也需要為奇數。
在主中斷里面的 RAM 在線檢測函數里,首先將要檢測區域的 RAM 值保存下來:
if ((gStructSTLMonitor.NowRamAddrStart 》= MARCH_RAM_START)
&& (gStructSTLMonitor.NowRamAddrStart 《= (MARCH_RAM_END-RAM_CHK_NUM)))
{
gStructSTLMonitor.NowRamAddrEnd = gStructSTLMonitor.NowRamAddrStart + RAM_CHK_NUM;
memCopy((uint16_t *)gStructSTLMonitor.NowRamAddrStart,(uint16_t *)
gStructSTLMonitor.NowRamAddrEnd,(uint16_t *)MARCH_RAM_BK);
}
然后進行檢測:
gStructSTLMonitor.status = STL_MARCH_TEST_testRam((uint32_t *)
gStructSTLMonitor.NowRamAddrStart,(uint32_t *)gStructSTLMonitor.NowRamAddrEnd);
if(gStructSTLMonitor.status != SIG_RAM_MARCH_TEST)
{
}
else
{
memCopy((uint16_t *)MARCH_RAM_BK,(uint16_t *)(MARCH_RAM_BK + RAM_CHK_NUM),
(uint16_t *)gStructSTLMonitor.NowRamAddrStart);
gStructSTLMonitor.NowRamAddrStart = gStructSTLMonitor.NowRamAddrEnd + 1;
gStructSTLMonitor.gTestStep++;
}
注意檢測成功之后馬上恢復當前區域的 RAM 值,并為下一次檢測做好準備。如果檢測發現故障,則進入故障處理函數。
責任編輯:pj
-
寄存器
+關注
關注
31文章
5425瀏覽量
123526 -
存儲器
+關注
關注
38文章
7637瀏覽量
166536 -
RAM
+關注
關注
8文章
1391瀏覽量
116896
發布評論請先 登錄
兩種驅動方式下永磁直線開關磁鏈電機的研究
常見人體姿態評估顯示方式的兩種方式

評論