你的位置:首頁(yè) > 互連技術(shù) > 正文

一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法

發(fā)布時(shí)間:2020-05-15 來(lái)源:China Central FAE Sam Zhang 責(zé)任編輯:wenwei

【導(dǎo)讀】隨著越來(lái)越多的工業(yè)應(yīng)用對(duì)產(chǎn)品的可靠性和安全性要求越來(lái)越高,我們?cè)谧霎a(chǎn)品設(shè)計(jì)的時(shí)候不僅要正確的實(shí)現(xiàn)產(chǎn)品功能,同時(shí)也需要通過(guò)一些功能安全認(rèn)證,比如家電行業(yè)的IEC60730等或者ISO13849等。一般的系統(tǒng)故障可以通過(guò)設(shè)計(jì)的迭代和嚴(yán)格測(cè)試來(lái)避免,但是硬件的隨機(jī)失效理論上是無(wú)法完全消除的,所以要想提高硬件隨機(jī)失效的診斷覆蓋率,就需要軟硬件診斷機(jī)制來(lái)保障。
 
作為系統(tǒng)的核心控制部分,MCU主平臺(tái)的診斷機(jī)制就是最關(guān)鍵的部分。針對(duì)一般通用的MCU,以Piccolo C2000系列為例,硬件上提供了一些診斷或者校驗(yàn)機(jī)制,如下所示:
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
同時(shí)TI也提供了一些軟件診斷方案,如MSP430 IEC60730 Software Package和C2000 SafeTI 60730 SW Packages軟件庫(kù)等,可以提供很多的診斷測(cè)試功能,例如CPU、時(shí)鐘、外設(shè)、RAM等的診斷,已經(jīng)可以滿足一部分的需求。如下圖所示為C2000 SafeTI 60730 SW Packages中的功能和資源消耗。
 
然而在實(shí)際的應(yīng)用中,有些安全標(biāo)準(zhǔn)要求對(duì)RAM進(jìn)行周期性的在線診斷,同時(shí)不能影響程序的正常運(yùn)行。但是程序在運(yùn)行過(guò)程中存儲(chǔ)在RAM中的數(shù)據(jù)會(huì)實(shí)時(shí)的變化,而RAM的診斷往往會(huì)破壞這些存儲(chǔ)的數(shù)據(jù),比如電機(jī)控制類的實(shí)時(shí)性要求較高的場(chǎng)合。所以在沒(méi)有ECC的情況下,如何對(duì)RAM進(jìn)行實(shí)時(shí)在線的診斷是一個(gè)值得討論的問(wèn)題。
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
下面以電機(jī)控制為例,討論硬件校驗(yàn)的實(shí)現(xiàn),尤其是RAM在線檢測(cè)的過(guò)程。
 
1. 系統(tǒng)軟件流程
 
非破壞性的診斷可以放在背景循環(huán)里面進(jìn)行,這些軟件診斷不會(huì)對(duì)實(shí)時(shí)性中斷造成影響,例如看門狗測(cè)試,內(nèi)部晶振測(cè)試,F(xiàn)LASH CRC校驗(yàn),靜態(tài)變量RAM CRC校驗(yàn),堆棧溢出判斷,以及GPIO口診斷等。另外一些破壞性的或者對(duì)實(shí)時(shí)控制有影響的診斷,可以放到主中斷中進(jìn)行,如RAM March校驗(yàn),ALU診斷以及CPU寄存器診斷等。具體流程圖如下所示:
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
2. RAM診斷的方法
 
以C2000 SafeTI 60730 SW Packages為例,主要提供了兩種RAM檢測(cè)方式。
 
一種是CRC檢測(cè)STL_CRC_TEST_testRam,此功能用于測(cè)試RAM的位錯(cuò)誤。該測(cè)試以0和1的交替模式填充被測(cè)RAM區(qū)域,并使用PSA計(jì)算RAM的CRC。對(duì)于給定的RAM存儲(chǔ)器區(qū)域,如果RAM存儲(chǔ)器中沒(méi)有任何stuck bit,則CRC值應(yīng)始終相同。并行串行分析器(PSA)是c28x器件中的一個(gè)模塊,可用于生成40位給定存儲(chǔ)區(qū)域上的CRC。 PSA多項(xiàng)式為Y = x40 + x21 + x19 + x2 + 1。PSA通過(guò)監(jiān)視數(shù)據(jù)讀取數(shù)據(jù)總線(DRDB)來(lái)計(jì)算CRC值。 一旦激活就會(huì)監(jiān)控Data Read Data Bus (DRDB),當(dāng)CPU通過(guò)DRDB讀取數(shù)據(jù)時(shí),PSA每個(gè)時(shí)鐘周期會(huì)為DRDB上的數(shù)據(jù)生成一個(gè)CRC。由于此測(cè)試具有破壞性,因此需要將要測(cè)試的RAM內(nèi)容保存到單獨(dú)的RAM位置。
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
當(dāng)然也可以使用軟件CRC的方式,使用起來(lái)更靈活,并且可以選擇非破壞性的方式來(lái)計(jì)算CRC,對(duì)一些靜態(tài)常量存儲(chǔ)的區(qū)域可以考慮這種CRC方式。另外一點(diǎn)是軟件CRC算法可以更方便的進(jìn)行代碼評(píng)估,以滿足不同安全標(biāo)準(zhǔn)的要求。
 
另一種是MARCH檢測(cè)STL_MARCH_TEST_testRam,此功能直接對(duì)RAM進(jìn)行32bit的讀寫(xiě)測(cè)試,可以選擇進(jìn)行MarchC 13N或者M(jìn)archC-測(cè)試。由于此測(cè)試具有破壞性,因此也需要將要測(cè)試的RAM內(nèi)容保存到單獨(dú)的RAM位置。
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
3. RAM在線檢測(cè)的實(shí)現(xiàn)
 
由于需要周期性的RAM檢測(cè),以電機(jī)控制為例,可以將RAM檢測(cè)放到主中斷里面執(zhí)行。同時(shí)關(guān)鍵是不能影響控制程序的運(yùn)行和實(shí)時(shí)性,所以主要考慮兩點(diǎn):
 
第一是主中斷時(shí)間有限,要盡可能減小RAM檢測(cè)的時(shí)間,所以可以將RAM分成多個(gè)小段進(jìn)行檢測(cè),每段RAM越小,占用中斷的時(shí)間越小,但是所有RAM檢測(cè)一遍的時(shí)間會(huì)變長(zhǎng),這個(gè)需要綜合考慮。
 
第二是不能破壞RAM中的變量值,所以在檢測(cè)是之前將RAM段中的內(nèi)容保存到專門區(qū)域,戴檢測(cè)完成并且通過(guò)之后,再將保存好的數(shù)據(jù)恢復(fù)過(guò)來(lái),使用memCopy來(lái)提高效率。
 
具體實(shí)現(xiàn)方法如下:
 
首先定義好各個(gè)RAM區(qū)間的地址范圍,可以參考具體的數(shù)據(jù)手冊(cè),如下所示:
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
然后定義好檢測(cè)的范圍和每次檢測(cè)的數(shù)據(jù)長(zhǎng)度:
 
一種C2000系列芯片的RAM在線診斷實(shí)現(xiàn)方法
 
注意由于STL_MARCH_TEST_testRam函數(shù)執(zhí)行32位讀/寫(xiě)測(cè)試,而在測(cè)試RAM單元陣列時(shí),由于RAM單元的16位體系結(jié)構(gòu),所以要求起始地址為偶數(shù),結(jié)束地址為奇數(shù),可以測(cè)試的最大內(nèi)存范圍限制為65535個(gè)32位字。所以要求測(cè)試長(zhǎng)度也需要為奇數(shù)。
 
在主中斷里面的RAM在線檢測(cè)函數(shù)里,首先將要檢測(cè)區(qū)域的RAM值保存下來(lái):
 
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)行檢測(cè):
 
gStructSTLMonitor.status = STL_MARCH_TEST_testRam((uint32_t *)
 
   gStructSTLMonitor.NowRamAddrStart,(uint32_t *)gStructSTLMonitor.NowRamAddrEnd);
 
if(gStructSTLMonitor.status != SIG_RAM_MARCH_TEST)
 
{
 
STL_SetFail();
 
}
 
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++;
 
}
 
注意檢測(cè)成功之后馬上恢復(fù)當(dāng)前區(qū)域的RAM值,并為下一次檢測(cè)做好準(zhǔn)備。如果檢測(cè)發(fā)現(xiàn)故障,則進(jìn)入故障處理函數(shù)。
 
參考文檔:
 
1. IEC60730 Safety Library for TMS320F2806x USER’S GUIDE
2. Safety Manual for C2000™ MCUs in IEC60730 Safety Applications (SPRUHI3A)
 
 
推薦閱讀:
 
專業(yè)音頻應(yīng)用中生成負(fù)電源軌的方案
工程師福利!Digi-Key聯(lián)手柴火x.factory在中國(guó)社區(qū)推廣Arduino基礎(chǔ)認(rèn)證考試
無(wú)線水質(zhì)監(jiān)測(cè)系統(tǒng)
穩(wěn)定可靠和高能效的工業(yè)驅(qū)動(dòng)方案
通過(guò)驅(qū)動(dòng)器源極引腳將開(kāi)關(guān)損耗降低約35%
要采購(gòu)晶振么,點(diǎn)這里了解一下價(jià)格!
特別推薦
技術(shù)文章更多>>
技術(shù)白皮書(shū)下載更多>>
熱門搜索
?

關(guān)閉

?

關(guān)閉