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

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

感光器件有哪兩種
Linux應(yīng)用層控制外設(shè)的兩種不同的方式

兩種常見的硬件消抖實(shí)現(xiàn)方式

評論