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

常見人體姿態(tài)評估顯示方式的兩種方式

評論