基于KeyStone 器件建立魯棒性系統(tǒng)
摘要
本文引用地址:http://www.ex-cimer.com/article/201610/307368.htm對于復(fù)雜的系統(tǒng),魯棒性是非常重要的。為了協(xié)助客戶建立魯棒性系統(tǒng),KeyStone 器件提供了多種硬件保護(hù)機(jī)制,如內(nèi)存保護(hù)、EDC。本文介紹如何利用這些特性在 KeyStone 器件上建立一個魯棒的系統(tǒng)。同時提供了與文檔配套的例程。
1 簡介
如圖1 所示,KeyStone 器件提供了多種協(xié)助客戶建立魯棒性應(yīng)用的特性。
如圖1 所示,在LL2、L1P 及L1D 中集成了內(nèi)存保護(hù)模塊;LL2、SL2 及DDR 控制器中集成了錯誤檢查糾正模塊;L1P 集成了錯誤檢測模塊。
MPAX 和MPU 模塊附在總線上,用于監(jiān)控檢測以避免非法的總線訪問。
每個DSP CorePac 有一個獨(dú)立的MPAX 用于監(jiān)控與MSMC 連接的總線。
對于系統(tǒng)中其他的master,根據(jù)權(quán)限ID 進(jìn)行分類。對每個權(quán)限ID,在MSMC 中集成了2 個MPAX 用于監(jiān)視與該權(quán)限ID 相關(guān)的訪問。其中一個是SES MPAX 用于保護(hù)對DDR3 的訪問,另一個是SMS MPAX 用于保護(hù)對SL2 的訪問。關(guān)于每個master 對應(yīng)的權(quán)限ID,參考相應(yīng)的器件手冊。
某些外設(shè)的配置端口上添加了MPU,用于保護(hù)對該外設(shè)配置區(qū)域的非法訪問。但是并非所有的外設(shè)都受MPU 的保護(hù),具體參考相應(yīng)器件手冊中受MPU 保護(hù)的外設(shè)列表。
每個CorePac 有一個看門狗定時器用于監(jiān)視其活動,如果該核死機(jī),看門狗可以觸發(fā)不可屏蔽中斷或者復(fù)位信號。
EMC 可以避免DSP core 訪問沒有映射的的配置空間,XMC 則可以避免DSP core 訪問沒有映射的數(shù)據(jù)空間。
所有這些功能都由硬件模塊實(shí)現(xiàn),使用這些功能對系統(tǒng)性能基本上沒有影響。使用EDC 會對存儲器的訪問性能稍有影響,但從整個系統(tǒng)層面上看,它幾乎是微不足道的。
在出現(xiàn)問題時,所有這些模塊可以向DSP core 觸發(fā)異常,DSP core 的異常監(jiān)控模塊可以記錄這些狀態(tài)并觸發(fā)異常服務(wù)程序執(zhí)行相應(yīng)的操作。
本文討論這些特性的應(yīng)用,并給出相關(guān)基于寄存器層CSL 實(shí)現(xiàn)的例程。代碼使用如下方式定義寄存器指針。
上述各種特性具體描述分布于各自子系統(tǒng)的文檔中,本文最后的參考章節(jié)中列出了所有相關(guān)的文檔。在看本文之前,假設(shè)客戶已經(jīng)閱讀了相關(guān)屬性對應(yīng)的文檔,所以本文旨在提供相關(guān)的補(bǔ)充信息。
本文適用于KeyStone 1 系列DSP,例程在TCI6614 EVM,C6670 EVM,C6678 EVM 上進(jìn)行了驗(yàn)證。對于其他的KeyStone 器件包擴(kuò)KeyStone 2 系列,基本功能都是一樣的,一些細(xì)節(jié)上的些許差異請參閱相應(yīng)器件手冊。
2 內(nèi)存保護(hù)
文檔“Memory Protection On KeyStone Devices (SPRWIKI9012)”中討論了KeyStone 器件上的內(nèi)存保護(hù)屬性,其中包括其它文檔中沒有的很多有用信息,本節(jié)在其基礎(chǔ)上做一些總結(jié)和補(bǔ)充。
表1 總結(jié)列出不同內(nèi)存保護(hù)模塊的差異。
系統(tǒng)中有多個master 和slave,位于slave 輸入端口的保護(hù)模塊用于阻止來自其他master 對該slave 的非法訪問;位于master 輸出端口的保護(hù)模塊用于阻止該master 對所有其他slave 的非法訪問。
每個內(nèi)存頁、分片或范圍的保護(hù)屬性都是可編程的。
2.1 L1 及LL2 內(nèi)存保護(hù)
關(guān)于L1 及LL2 內(nèi)存保護(hù)的基本信息參考“TMS320C66x CorePac User Guide(SPUGW0)”中內(nèi)存保護(hù)章節(jié)。
L1 及LL2 內(nèi)存保護(hù)只區(qū)分7 個外部請求ID,但是系統(tǒng)可能有16 個權(quán)限ID。默認(rèn)情況下,系統(tǒng)權(quán)限ID 0~5 映射到CorePac AID 0~5,所有其他的權(quán)限ID 均映射到AIDx。
CorePac AID 與系統(tǒng)權(quán)限ID 之間的映射關(guān)系可由EMC 編程配置,具體參考“TMS320C66x CorePac User Guide(SPUGW0)”中“外部存儲控制器(EMC)”章節(jié)。
注意,IDMA 的AID 與其所屬CorePac 的數(shù)值一致,EDMA 傳輸?shù)臋?quán)限ID 與配置并發(fā)起這個傳輸?shù)暮说木幪栆恢隆?/p>
通常L1 被配置為cache,此時所有L1 相關(guān)的內(nèi)存保護(hù)屬性寄存器應(yīng)該清零從而阻止其他master的對L1 的訪問。
CorePac 內(nèi)部內(nèi)存保護(hù)模塊(保護(hù)L1,LL2 及XMC/MPAX)的寄存器被一個鎖保護(hù)起來。默認(rèn)情況下,這些寄存器沒有被鎖住,用戶軟件可以使用自定義的密鑰鎖住這些寄存器,然后,只有用該密鑰進(jìn)行解鎖后才可以訪問這些寄存器。
2.2 共享內(nèi)存保護(hù) – MPAX
關(guān)于CorePac 共享內(nèi)存保護(hù)的基本信息參考“TMS320C66x CorePac User Guide(SPRUGW0)”中“擴(kuò)展存儲控制器(XMC)”章節(jié);關(guān)于系統(tǒng)中其他master 的共享內(nèi)存保護(hù)基本信息參考“KeyStone Architecture Multicore Shared Memory Controller User Guide (SPRUGW7)”中“內(nèi)存保護(hù)及地址擴(kuò)展 (MPAX)”章節(jié)。
如下是例程中關(guān)于XMC/MPAX 的配置樣例,每一行代表MPAX 中的一個分片配置。
邏輯地址低于0x0C00_0000 的地址訪問不會進(jìn)入XMC。對地址空間0x0000_0000~0x07FF_FFFF 進(jìn)行訪問時,在C66x CorePac 內(nèi)部進(jìn)行地址解析。這塊地址范圍包括內(nèi)部及外部配置總線,及L1D、L1P、L2 存儲空間。
對位于0x0C00_0000~0x0FFF_FFFF 區(qū)間的邏輯地址訪問時,會經(jīng)過L1 cache,并且在讀操作時會經(jīng)過預(yù)取緩存,與該地址范圍對應(yīng)的內(nèi)存屬性配置寄存器MAR 是硬件拉死的,不可修改。也就是說對該邏輯地址空間的訪問在進(jìn)入XMC MPAX 之前不會經(jīng)過L2 cache,所以這塊邏輯地址空間稱為“快速SL2 RAM 路徑”。
對大于等于0x1000_0000 的邏輯地址訪問會首先經(jīng)過L2 cache 控制器,然后經(jīng)過XMC MPAX,這種常規(guī)路徑會增加一個cycle 的時延。
根據(jù)上述配置例子,在訪問SL2 時,采用邏輯地址0x0C00_0000 的訪問速率高于使用重映射后的邏輯地址0x1800_0000。但是0x1800_0000 對應(yīng)的內(nèi)存屬性寄存器MAR 是可編程的,因此可以配置通過0x1800_0000 訪問的SL2 為non-cacheable 及non-prefetchable。
注意DDR3 起始物理地址為0x8:0000_0000,而0x9:0000_0000 相對起始地址有4GB 的偏移,在大多數(shù)系統(tǒng)中這是一個非法的地址。
在真實(shí)系統(tǒng)中,應(yīng)該充分利用好MPAX 的所有片段更好地將存儲空間劃分成盡可能多的小片,并仔細(xì)設(shè)定各個分片的訪問限定屬性。
不用的地址不應(yīng)該映射,MPAX 會拒絕對未映射的地址訪問并上報異常事件,從而有助于捕獲軟件錯誤。
當(dāng)兩個master 通過共享memory 交換數(shù)據(jù)時,應(yīng)該確保兩個master 使用的邏輯地址映射到相同的物理地址。
注意EDMA 的權(quán)限ID 是繼承于對其配置的CorePac。
警告:
在修改一條 MPAX 表項(xiàng)時,需要確保此時沒有對該表項(xiàng)所覆蓋地址的訪問。在修改之前,需要先將該表項(xiàng)覆蓋地址對應(yīng)的cache 及預(yù)取緩存中的數(shù)據(jù)進(jìn)行回寫及失效操作。
對于MPAX 的配置,推薦在程序開始之初且沒有使用任何共享存儲空間之前完成。用于CorePac MPAX 配置的代碼和數(shù)據(jù)應(yīng)該放在LL2。
如果要運(yùn)行時動態(tài)修改一個MPAX 表項(xiàng),安全的方法是先將新的配置寫到一個未使用的編號高度表項(xiàng),然后清掉舊的表項(xiàng)。這是由于編號高度表項(xiàng)的優(yōu)先級高于編號低端表項(xiàng)。
在修改MPAX 表項(xiàng)之前需要先執(zhí)行如下操作:
1. 將MPAX 表項(xiàng)對應(yīng)的存儲空間內(nèi)容從cache 中剔除出去。即使對于屬性為不可寫的存儲空間,應(yīng)該使用CACHE_wbInvL2()而非CACHE_inv L2()。
2. 如果對受影響的存儲器空間使能了預(yù)取功能,則需要對預(yù)取緩存執(zhí)行失效操作。
3. 執(zhí)行“MFENCE”確?;貙懠笆Р僮魍瓿?。
CorePac 的MPAX 寄存器受CorePac 的內(nèi)存保護(hù)寄存器鎖保護(hù)。SES 及SMS 的MPAX 內(nèi)存保護(hù)屬性寄存器被MSMC 內(nèi)部分別用于SES 及SMS 的鎖保護(hù)。MSMC 內(nèi)部其他寄存器被MSMC內(nèi)部用于非MPAX 的鎖保護(hù)。
2.3 外設(shè)配置端口保護(hù) – MPU
關(guān)于MPU 的基本信息參考“KeyStone Architecture Memory Protection Unit User Guide (SPRUGW5)”。
MPU0、MPU1、MPU2 及MPU3 對所有KeyStone 1 器件是相同的。但是對于不同的器件,其附加MPU 的個數(shù),每個MPU 支持的地址范圍表項(xiàng)數(shù),MPU 的默認(rèn)配置均有所差異。具體可參考相關(guān)器件手冊的“內(nèi)存保護(hù)單元(MPU)”章節(jié)。
MPU 與MPAX 的區(qū)別在于,如果訪問地址不在MPU 任何一個地址范圍內(nèi),則該地址訪問是允許的;而當(dāng)該地址與MPAX 中任意表項(xiàng)地址范圍不匹配時,則該地址訪問被拒絕。
注意,如果沒有被MPPA 的設(shè)置所拒絕,MPU 單元默認(rèn)所有的訪問都是許可的。對于一個地址訪問,MPU 首先將訪問的權(quán)限ID 與MPPA 寄存器的AID bit 配置進(jìn)行核對,如果與權(quán)限ID 對應(yīng)的AID bit 為0,則不需要核對地址范圍,該訪問被許可。如MPPA=0 則允許所有的對該空間的訪問,如果要拒絕任意對該空間的訪問則需要將MPPA 配置為0x03FFFC00。L1 及LL2 內(nèi)存保護(hù)的MPPA 設(shè)置則有所不同,當(dāng)MPPA 中AID bit 為0 是拒絕相應(yīng)的訪問。
當(dāng)傳輸與MPU 中多個地址范圍匹配時,所有重疊的范圍必須允許其訪問,否則該訪問會被拒絕。最終賦予的訪問權(quán)限與所有匹配表項(xiàng)中最低的權(quán)限等級一致。如某傳輸與2 個表項(xiàng)匹配,其中一個是RW,另一個是RX,則最終的權(quán)限是R。這與MPAX 也是不一樣的。如果一個地址落入多個MPAX 表項(xiàng),編號高的表項(xiàng)優(yōu)先于編號低的表項(xiàng)。MPAX 只會用編號最高的表項(xiàng)決定權(quán)限,并忽略其他匹配的表項(xiàng)。
如下與本文對應(yīng)例程中一個對MPU1 的配置例子。每行代表MPU 中一個配置范圍。
如上配置知,隊列保護(hù)如下:
· 隊列0~2047 只可由AID0~7 進(jìn)行寫(PUSH)操作;
· 隊列2048~6143 可由AID11 以外所有的AID 進(jìn)行寫(PUSH)操作;
· 隊列6144~8191 只可由AID8~15(AID11 除外)進(jìn)行寫(PUSH)操作。
TCI6614 上的MPU6 用于避免ARM 對DDR3 的非法操作。注意,MPU6 是用于低32-bit DDR 物理地址范圍的保護(hù)。
注意,為了清除MPU 異常/中斷事件,必須在服務(wù)程序的最后向EOI 寄存器寫0.
TCI6614 的MPU 事件與其他KeyStone 器件有所不同。TCI6614 中所有的MPU0~7 事件被合并為一個事件并作為一個系統(tǒng)事件連接到CIC0。由于TCI6614 MPU 事件是電平中斷而非脈沖中斷事件,所有必須首先清除MPU 事件標(biāo)志,然后才可以清CIC 標(biāo)志。對于脈沖中斷事件,必須首選清CIC 標(biāo)志,然后清源標(biāo)志。
另外,只有在通過PSC 使能BCP 后,才可以訪問TCI6614 中用于BCP 的MPU5。即在訪問TCI6614 中MPU5 寄存器時,如果此時BCP 沒有被使能,則該訪問將觸發(fā)訪問錯誤。
2.4 預(yù)留區(qū)域保護(hù)
預(yù)留區(qū)域(非法地址)被自動保護(hù)。對非法地址進(jìn)行讀操作時將返回垃圾數(shù)據(jù),寫操作則會被阻止。對預(yù)留區(qū)域的訪問可以產(chǎn)生異常,這有益于捕獲軟件bug。
由于DSP core 的訪問會經(jīng)過L1D 控制器,所以DSP core 對非法地址的訪問會觸發(fā)L1D 內(nèi)存保護(hù)異常。
DSP core 從非法地址執(zhí)行時將觸發(fā)指令獲取異常。
對于非法寫操作,觸發(fā)的異常取決于相應(yīng)的目的地址。
DMA 對非法地址訪問時,DMA 模塊會上報總線錯誤。DMA 錯誤事件可以作為異常路由到DSP core。
3 EDC
EDC(Error Detection and Correction)用于存儲器軟錯誤 (Soft Error) 。軟錯誤是一個錯誤的信號或數(shù)據(jù),但是并不意味著硬件被破壞。在觀測到一個軟錯誤后,并不意味著系統(tǒng)可靠性會下降。在宇宙飛船中這種類型的錯誤稱為單一事件擾亂。在內(nèi)存系統(tǒng)中,一個軟錯誤會改變程序中的一條指令或者一個數(shù)據(jù)值。軟錯誤通??梢酝ㄟ^器件的重啟進(jìn)行糾正,而硬件錯誤通常不能通過重啟來恢復(fù)。軟錯誤不會對系統(tǒng)硬件造成破壞;僅僅會對處理的代碼或數(shù)據(jù)造成錯誤。產(chǎn)生軟錯誤的原因有:
1. 阿爾法粒子輻射及宇宙射線產(chǎn)生能量中子及質(zhì)子。發(fā)生的概率取決于器件的地理位置及周圍環(huán)境。通常,一個器件在幾年中才會出現(xiàn)幾次。
2. 軟錯誤也可由隨機(jī)噪聲、干擾或信號完整性錯誤引發(fā),如板載電感應(yīng)或電容串?dāng)_。如果軟錯誤發(fā)送概率高于上述條目1 中的理論值,則應(yīng)該檢查硬件設(shè)計找出其他原因。一個常見的原因是供電電源電壓低于預(yù)期,導(dǎo)致器件對噪聲或干擾的影響更敏感。
KeyStone 器件各級memory 中都實(shí)現(xiàn)了EDC 機(jī)制,下表對不同memory 模塊的實(shí)現(xiàn)機(jī)制進(jìn)行了比較。
3.1 L1P 錯誤檢測
關(guān)于L1P 及LL2 EDC 基本信息參考“TMS320C66x DSP CorePac User Guide(SPRUGW0)”。
校驗(yàn)比特生成與核對:校驗(yàn)比特在進(jìn)行64-bit 對齊的DMA 寫或L1P cache 緩存時生成。非64-bit對齊的DMA 訪問將使校驗(yàn)信息失效。在256-bit 對齊的程序讀取或64-bit 對齊的DMA 讀操作時,L1P EDC 邏輯會核對校驗(yàn)信息。
錯誤檢查設(shè)置:器件復(fù)位后默認(rèn)情況下L1P 錯誤檢查特性是關(guān)閉的。一旦L1PEDCMD 寄存器中的“EN”bit 被置位,所有L1P memory 中的ED 邏輯被使能。下面是從應(yīng)用代碼中摘錄的L1P ED 功能使能例子。
注意:要使L1P ED 功能工作正常,必須同時使能L2 EDC。
對L1P cache 訪問時的錯誤處理: 對從L1P cache 中獲取程序產(chǎn)生的校驗(yàn)錯誤,沒有專用的系統(tǒng)事件,然而,錯誤檢測邏輯會發(fā)送一個直接的異常事件給DSP(IERR.IFX 事件),然后用戶可以使用內(nèi)部異常事件獲取這個錯誤。L1PEDSTAT 寄存器的PERR bit 會被置位。L1PEDARRD寄存器會記錄包含錯誤bit 的的地址信息。在L1P 錯誤對應(yīng)的異常處理服務(wù)函數(shù)中,需要對包含錯誤地址的cache line 進(jìn)行失效操作。
對DMA 訪問的錯誤處理:對DMA/IDMA 訪問產(chǎn)生的校驗(yàn)錯誤,對應(yīng)#113 號系統(tǒng)事件。用戶可以使用這個事件獲取錯誤。L1PEDSTAT 寄存器的DERR 比特位會被置位,并且L1PEDARRD 寄存器會記錄包含錯誤bit 的地址信息。
L1P EDC 功能驗(yàn)證:通過置位LPEDCMD 寄存器中的SUSP 比特可以暫停L1P EDC 邏輯。使用該特性,可以軟件模仿EDC 錯誤并驗(yàn)證EDC 功能。與本文對應(yīng)的例程中提供了驗(yàn)證L1P EDC功能的代碼,對應(yīng)函數(shù)L1P_ED_test()。
3.2 LL2 錯誤檢查與糾正
校驗(yàn)比特生成與核對:在對L2 以128 bits 為單元進(jìn)行內(nèi)存寫操作時會產(chǎn)生相應(yīng)的校驗(yàn)信息。非128-bit 對齊或者小于128 bits 的寫操作會使校驗(yàn)信息失效。對128-bit 對齊的memory 讀操作時,LL2 EDC 邏輯會核對校驗(yàn)信息。更多信息參考“TMS320C66x DSP CorePac User Guide(SPRUGW0)”。
錯誤檢查及糾正配置:器件復(fù)位后默認(rèn)情況下LL2 EDC 特性是被關(guān)閉的。與某些C64+ DSP 不同的是,KeyStone DSP 不能對內(nèi)存分塊使能EDC。一旦EDC 使能,EDC 邏輯對整個CorePac L2 內(nèi)存生效。然而,可以對不同的內(nèi)存訪問請求者分別使能,如L1D 控制器、L1P 控制器或DMA 控制器。例如,如果用戶只需要對代碼段使用EDC,需要使能下面三個域:
1. 設(shè)置L2EDCMD 寄存器中的EN bit 以使能LL2 EDC 邏輯;
2. 設(shè)置L2EDCEN 寄存器中的PL2SEN 比特以使能L1 SRAM 的EDC 邏輯對L1P 訪問的檢查;
3. 設(shè)置L2EDCEN 寄存器中的PL2CEN 比特以使能L2 cache 的EDC 邏輯對L1P 訪問的檢查。
從關(guān)閉到使能狀態(tài)轉(zhuǎn)變時,LL2 EDC 邏輯不會初始化校驗(yàn)RAM。因此,在進(jìn)入使能狀態(tài)后,校驗(yàn)RAM 中的值是隨機(jī)值,需要用戶軟件對其進(jìn)行初始化,。對L2 EDC 的配置必須遵循“TMS320C66x DSP CorePac User Guide(SPRUGW0)”中闡述的EDC 配置順序。下面是從例程中摘錄的L2 EDC 使能函數(shù)參考代碼:
對來自L1D 控制器的訪問錯誤處理:在經(jīng)過L1D cache 從LL2 中獲取數(shù)據(jù)時,對所有這些數(shù)據(jù)會進(jìn)行錯誤檢查,但是不會有任何的糾正。不管是1-bit 或者是多bit 錯誤,將會通過#117 號系統(tǒng)事件(L2_ED2:不可糾正比特錯誤檢測)上報給DSP core。
對來自L1P 及DMA 控制器的訪問錯誤處理:1-bit 錯誤可以被糾正并通過#116 號系統(tǒng)事件(L2_ED1:可被糾正的比特錯誤)上報 。2-bit 錯誤可以被檢測,并通過#117 號系統(tǒng)事件上報該錯誤。
下表列出對于不同存儲器訪問請求者,相應(yīng)的1-bit 錯誤處理細(xì)節(jié)。
錯誤計數(shù)器(L2EDCPEC, L2EDNPEC)非常有用,可用于在長時間運(yùn)行的系統(tǒng)中評估校驗(yàn)比特錯誤發(fā)生的種類與概率。
下表列出對不同存儲器訪問請求者,相應(yīng)的2-bit 錯誤處理細(xì)節(jié)。
對于大于2 bits 的錯誤,EDC 邏輯可能會檢測并報告為1-bit 或2-bit 錯誤,或者EDC 根本檢測不到該錯誤。所以說,KeyStone 系列EDC 硬件邏輯只能保證檢測2-bit 錯誤或糾正1-bit 錯誤。
通常軟錯誤出現(xiàn)的概率很低,首先出現(xiàn)1-bit 錯誤,在相對長時間后,第二個錯誤bit 也許會產(chǎn)生。由于1-bit 錯誤可以被糾正,而2-bit 錯誤不能被糾正,所以我們應(yīng)該盡可能在第二個比特錯誤出現(xiàn)前糾正好第一個比特錯誤。
糾正1-bit 錯誤的操作通常稱為“刷新”。 為了刷新一塊存儲器,可以使用IDMA,把IDMA 的源地址與目的地址設(shè)為相同的地址;字節(jié)長度設(shè)置為期望覆蓋的內(nèi)存塊。地址訪問必須是128-bit 對齊,并且整塊的內(nèi)存范圍長度必須是128 bits 的整數(shù)倍。在IDMA 從LL2 讀取數(shù)據(jù)時,對于存在有效校驗(yàn)信息的128-bit 字,EDC 硬件會糾正可能存在于其中的1-bit 錯誤。當(dāng)IDMA 把數(shù)據(jù)回寫到相同的地址時,EDC 會對數(shù)據(jù)產(chǎn)生校驗(yàn)信息并標(biāo)識其為有效。
刷新操作通常是在1-bit 錯誤中斷服務(wù)函數(shù)中進(jìn)行。但是在1-bit 錯誤發(fā)生之后2-bit 錯誤發(fā)生之前,某些數(shù)據(jù)也許不會被訪問,在沒有訪問時1-bit 錯誤是不會被自動上報的。為了避免這種情況,應(yīng)該周期性地刷新整塊存儲器區(qū)間來糾正潛在的1-bit 錯誤。下面是一段LL2 EDC 刷新的代碼例子。
通常,這個函數(shù)可以在一個定時中斷中調(diào)用。如在一個600 秒周期的定時中斷中調(diào)用該函數(shù)。
這樣, 1MB 的存儲區(qū)間會每7 天被刷新一遍。
由于刷新操作會與正常的內(nèi)存操作相競爭,因此會影響正常內(nèi)存操作的性能。所以刷新操作不能太頻繁,但是必須在2-bit 錯誤產(chǎn)生前完成。在設(shè)計時必須權(quán)衡考慮。
LL2 EDC 功能驗(yàn)證:通過設(shè)置L2EDCMD 寄存器中的SUSP 比特可以暫停LL2 EDC 邏輯。使用該特性,可以軟件模仿EDC 錯誤并驗(yàn)證EDC 功能。與本文對應(yīng)的例程中提供了驗(yàn)證LL2 EDC 功能的代碼,對應(yīng)函數(shù)LL2_ED_test()。
3.3 SL2 錯誤檢測與糾正
對共享存儲器SL2 的基本信息,參考“KeyStone Architecture Multicore Shared Memory Controller User Guide(SPRUGW7)”。
校驗(yàn)比特產(chǎn)生與核對:有兩種機(jī)制用于MSMC 校驗(yàn)信息的產(chǎn)生與檢測:
1. 對任意master 發(fā)起的256-bit 內(nèi)存段的寫操作時,校驗(yàn)信息會被更新并設(shè)置為有效。小于256 bits 的寫操作會使校驗(yàn)信息失效。當(dāng)DSP master 發(fā)起256-bit 內(nèi)存段的的讀操作時,校驗(yàn)信息會被檢查。
2. MSMC 包含一個后臺錯誤糾正硬件稱作刷新引擎,用于周期刷新存儲器的內(nèi)容。刷新的周期數(shù)可以通過SMEDCC 寄存器中的REFDEL 比特域來配置,每次刷新會讀取并回寫大小是4 個32字節(jié)的塊。在檢測并糾正1-bit 或者檢查到2-bit 錯誤時,刷新引擎還會上報EDC 錯誤。在MSMC用戶手冊中有具體的機(jī)制細(xì)節(jié)描述。
DSP 復(fù)位后,MSMC 硬件會使校驗(yàn)信息失效,并重新初始化校驗(yàn)信息。在第一次讀MSMC 存儲器時,軟件必須先檢查SMEDCC 中的PRR 比特(校驗(yàn)RAM 是否準(zhǔn)備好的狀態(tài)信息)。
錯誤檢測與糾正配置:DSP 復(fù)位后SL2 EDC 邏輯的刷新引擎被使能,并且會在后臺產(chǎn)生校驗(yàn)信息。軟件不需要像LL2 EDC 一樣使用DMA 進(jìn)行存儲器刷新,只需要查詢SMEDCC 寄存器中的PRR(校驗(yàn)RAM 準(zhǔn)備)比特位來確認(rèn)校驗(yàn)比特已經(jīng)產(chǎn)生。為了使能錯誤糾正,SMEDCC 中的ECM比特同樣應(yīng)該使能。請注意,錯誤糾正邏輯會對從SL2 的讀操作增加1 cycle 的時延(訪問流水線增加了一級),不過訪問吞吐量并不會降低。
下面是使能MSMC EDC 功能的例程:
錯誤上報機(jī)制:MSMC 用戶手冊中有詳細(xì)的錯誤上報機(jī)制信息,這里總結(jié)如下表。
請注意,由刷新引擎上報的錯誤地址是從0 開始的地址偏移,而為非刷新訪問記錄的錯誤地址是器件中從0x0C000000 開始的SL2 地址。
MSMC EDC 功能驗(yàn)證:可以通過設(shè)置SMEDCTST 寄存器中的PFn 比特位(bit0~3)來暫停MSMC EDC 邏輯。SMEDCTST 的地址偏移是0x58。每個SL2 RAM bank 對應(yīng)PFn 中一個比特(PF0~3 與bank0~3 依次對應(yīng)),每個比特可以用于禁止對校驗(yàn)RAM 的寫操作。這樣可以凍結(jié)bank 對應(yīng)的校驗(yàn)RAM,因此可以通過故意注入錯誤來破壞SL2 存儲內(nèi)容與校驗(yàn)信息的一致性,從而測試檢測糾正邏輯。具體的順序如下:
1. 向測試bank 中的某一個位置寫一個已知值,這樣可以正確地為這個位置初始化一個校驗(yàn)值。
2. 向SMEDCSTST 對應(yīng)的PF 比特寫1 以凍結(jié)該校驗(yàn)值。
3. 向上述被寫的位置寫任意字節(jié)來改變該位置的數(shù)值,如果檢驗(yàn)糾正功能則寫一個1-bit 差異的值,如果檢驗(yàn)檢測功能則寫一個存在2-bit 差異的值。此時該位置的校驗(yàn)值與其存儲的數(shù)值沒有同步。
4. 讀回該位置的值,將會產(chǎn)生所選類型的校驗(yàn)錯誤。
與本文對應(yīng)的例程中提供了相應(yīng)的代碼用于驗(yàn)證SL2 EDC 功能,對應(yīng)的函數(shù)為SL2_EDC_test()。
4 其它魯棒性特性
4.1 看門狗定時器
對應(yīng)看門狗定時器的基本知識,請參考“KeyStone Architecture Timer64 User Guide(SPRUGV5)”中“看門狗定時器模式”章節(jié)。
定時器0~(N-1)可用于N 個core 的看門狗。在TCI6614 中定時器8 是ARM 的看門狗定時器。
在看門狗模式下,定時器倒計時到0 時產(chǎn)生一個事件。需要由軟件在倒計時終止前向定時器寫數(shù),然后計數(shù)重新開始。如果計數(shù)到0,會產(chǎn)生一個定時器事件??撮T狗定時器事件可以觸發(fā)本核復(fù)位、器件復(fù)位或者NMI 異常,這可以通過配置相應(yīng)器件手冊中描述的“復(fù)位復(fù)用寄存器(RSTMUXx)”來選擇。
使看門狗事件觸發(fā)NMI 異常具有更高的靈活性,在NMI 異常服務(wù)函數(shù)中,錯誤的原因及某些關(guān)鍵的狀態(tài)信息可以被記錄下來,或者上報給上位機(jī)來進(jìn)行故障分析,然后如果它不能自恢復(fù)則可以再由軟件來復(fù)位器件。
4.2 EDMA 錯誤檢測
關(guān)于基本的EDMA CC 錯誤信息可以參考“KeyStone Architecture Enhanced Direct Memory Access(EDMA3)Controller User Guide(SPRUGS5)”中的“錯誤中斷”章節(jié)。
關(guān)于基本的EDMA TC 錯誤信息可以參考“KeyStone Architecture Enhanced Direct Memory Access(EDMA3) Controller User Guide(SPRUGS5)”中的“錯誤產(chǎn)生”章節(jié)。
所有的EDMA 錯誤事件可作為異常被路由到 CorePac。
事件丟失錯誤是一種最常見的EDMA CC 錯誤,意味著EDMA 不能按要求及時完成數(shù)據(jù)的傳輸,或者錯誤的事件觸發(fā)了不應(yīng)該的EDMA 傳輸。
總線錯誤是一種最常見的EDMA TC 錯誤,通常意味著EDMA 訪問了錯誤的地址(如預(yù)留地址或受保護(hù)的地址)。
4.3 中斷丟失檢測
中斷丟失或遺漏是實(shí)時系統(tǒng)中常見也是常被忽略的問題。中斷丟失檢測是一種用于捕捉這種異常的有效方法。對基本的中斷丟失檢測信息參考“TMS320C66x DSP CorePac User Guide(SPRUGW0)”中“中斷錯誤事件”章節(jié)。
軟件系統(tǒng)應(yīng)該對路由到DSP core 且有對應(yīng)軟件服務(wù)的中斷使能中斷丟失檢測。在所有中斷配置完畢后可以添加如下代碼使能中斷丟失檢測:
注意,當(dāng)使能中斷丟失檢測并在CCS/Emulator 下使用斷點(diǎn)或單步進(jìn)行調(diào)測時,由于在仿真停止時中斷沒有被響應(yīng),所有此時中斷丟失錯誤上報的概率很高。如果想忽略它,可以在調(diào)測時暫時對某些或全部中斷關(guān)閉中斷丟失檢測,但是注意不要忘記在正式發(fā)布的程序中重新使能該功能。
5 異常處理
關(guān)于異常處理的基本信息參考“TMS320C66x DSP CPU and Instruction Set Reference Guide(SPRUGH7)”中“CPU 異常”一節(jié)。
關(guān)于中斷或異常事件路由的基本信息參考“TMS320C66x DSP CorePac User Guide(SPRUGW0)”中“中斷控制器”章節(jié)。
5.1 異常事件路由
所有源自或由CorePac 觸發(fā)的錯誤事件均直接路由到CorePac 的中斷控制器。常被當(dāng)作異常處理的錯誤如下表所示。
一些其他非致命的錯誤事件,如可糾正的LL2 EDC 錯誤,應(yīng)該被路由到中斷而非異常。
源自或者由器件中共享模塊觸發(fā)的錯誤事件被路由到CIC。CIC 基本信息參考“KeyStone Architecture Chip Interrupt Controller(CIC) User Guide(SPRUGW4)”。
CIC 事件中常被當(dāng)作異常處理的事件如下表所示。
每種這樣的異常事件只能路由到一個CorePac。通常所有的這些事件被路由到一個CorePac。 下圖描述DSP core 內(nèi)部控制異常處理的開關(guān)。
一旦軟件置位TSR.GEE 及IER.NMIE,不能再由軟件清除,只能在復(fù)位后被清除。
TSR.XEN 可以由軟件置位并清除。XEN 可以在進(jìn)入異常服務(wù)函數(shù)中由硬件自動清除,并在退出異常服務(wù)函數(shù)時自動恢復(fù)原來的狀態(tài)。
因此,默認(rèn)情況下,在中斷服務(wù)函數(shù)中,TSR.GEE=1,IER.NMIE=1 及TSR.XEN=0.
5.2 異常服務(wù)函數(shù)
異常函數(shù)中應(yīng)該記錄或上報異常原因及相關(guān)信息,用于故障分析。
關(guān)鍵的記錄信息是NRP。NRP 是異常返回指針,通常用于確定異常觸發(fā)的位置。
實(shí)際上,非法操作與NRP 捕獲之間的時延大概在10~100 個DSP Core cycles 之間,具體的時延取決于很多因素,如操作類型,產(chǎn)生異常事件的模塊等等。例如對于向一個被MPU 保護(hù)的寄存器執(zhí)行寫操作,其時延包括:從DSP core 到寄存器的寫指令時延;錯誤事件從MPU 到CIC 然后 到CorePac 異常模塊的路由時延。因此,當(dāng)我們獲得NRP 后,應(yīng)從NRP 指向的位置向后搜索大概10~100cycles 來找有問題的操作。
不過,某些異常NRP 是沒有意義的,例如,對于指令獲取異常及非法操作碼異常。這通常發(fā)生在當(dāng)程序跳轉(zhuǎn)到一個非法的地址時,這時NRP 也指向一個非法的地址。我們真正想知道的是在程序跳轉(zhuǎn)到非法地址前到底發(fā)生了什么,但是這并不能從NRP 推導(dǎo)出來。在這種情況下,寄存器B3,A4,B4,B14 及B15 也許會有所幫助。B3 可能還保存著上次函數(shù)調(diào)用的返回指針;A4 及B4 也許保存著上次函數(shù)調(diào)用的參數(shù);B15 是棧指針;B14 是指向某些全局變量的數(shù)據(jù)指針。更多的細(xì)節(jié)可以參考“TMS320C6000 Optimizing Compiler User Guide(SPRUG187)” 中“7.4 函數(shù)結(jié)構(gòu)及調(diào)用約定”章節(jié)。根據(jù)這些信息,我們也許可以推導(dǎo)出在程序跳轉(zhuǎn)到非法地址前發(fā)生了什么。注意,B3,A4,B4 可能在異常發(fā)生前已經(jīng)被修改用于保存其它信息,所以它們也許不是有用的。實(shí)際上,B3,A4,B4 包含有價值信息的概率還是很高的,所以這些寄存器是值得記錄并分析的。
通用寄存器的值不能用C 代碼記錄,而必須用匯編代碼來記錄。下面的例子是將B3,A4,B4,B14,B15 寄存器記錄在“exception_record”中,然后調(diào)用 “Exception_service_routine”。
其它需要記錄的基本信息有:EFR,IERR,NTSR,TSCL/TSCH. EFR 用于判決異常類型:內(nèi)部、外部或是NMI。對于內(nèi)部異常,內(nèi)部異常的原因記錄在IERR。NTSR 記錄異常發(fā)生時的DSP core狀態(tài)。記錄的TSCL/TSCH 用于確定異常發(fā)生前器件運(yùn)行的時長。
對于外部異常,通過檢查INTC 及CIC 標(biāo)志寄存器來決定異常原因。對應(yīng)一個特定的異常,往往有特定的狀態(tài)寄存器可以檢查、記錄或上報。例如對應(yīng)內(nèi)存保護(hù)異常,需要記錄的關(guān)鍵信息是故障地址。參考各模塊的用戶指南了解相關(guān)狀態(tài)或標(biāo)志的更多細(xì)節(jié)。
通常,異常服務(wù)函數(shù)將這些異常信息保存在一個類似如下的數(shù)據(jù)結(jié)構(gòu)中。
可以在異常服務(wù)函數(shù)中將這些數(shù)據(jù)結(jié)構(gòu)中的信息傳遞給主機(jī),或者將其導(dǎo)出來進(jìn)行錯誤分析。
通常異常服務(wù)函數(shù)處理的錯誤是致命的,用戶不應(yīng)該期望從異常服務(wù)函數(shù)中返回。另外,軟件也不總是能從異常服務(wù)函數(shù)中安全返回,阻止從異常中安全返回的條件有:
1. 被異常終止的SPLOOPs 不能正確地重新開始。在返回前應(yīng)該核實(shí)NTSR 中的SPLX 比特數(shù)值為0.
2. 中斷被堵塞時發(fā)生的異常不能正確地重新開始。在返回前應(yīng)該核實(shí)NTSR 中的IB 比特數(shù)值為0.
3. 在不能被安全中斷的代碼處(如一個保護(hù)多個賦值的緊湊循環(huán))發(fā)生的異常不能正確地返回。編譯器通常會在代碼中的這些地方關(guān)閉中斷;查看NTSR 中的GIE 比特值為1 來驗(yàn)證滿足這個條件。
4. NRP 不是一個合法的地址。
所以通常異常服務(wù)函數(shù)以一個while(1)循環(huán)作為結(jié)束。
默認(rèn)情況下在異常服務(wù)程序中,TSR.GEE=1,IER.NMIE=1 及TSR.XEN=0.即在異常服務(wù)程序中NMI 及內(nèi)部異常是使能的。
當(dāng)一個使能的異常發(fā)生在第一個異常服務(wù)程序中時,復(fù)位向量指向的程序會被執(zhí)行。這時NTSR和NRP 不會發(fā)生改變。TSR 復(fù)制到ITSR,此時的PC 復(fù)制到IRP。此時為了避免其他外部異常,硬件將TSR 設(shè)置為默認(rèn)的異常處理值,NMIE 中的IER 比特被清零。
通常中斷服務(wù)表中的復(fù)位向量是跳轉(zhuǎn)到程序起始位置如_c_int00,這樣,嵌套異常會重啟程序。然而這并非大部分用戶所期望的,我們通常期望的是異常發(fā)生時在異常服務(wù)程序執(zhí)行完后結(jié)束程序。為了避免嵌套異常導(dǎo)致程序重啟,可以給嵌套異常添加一個額外的異常服務(wù)程序,用戶可以修改復(fù)位向量跳轉(zhuǎn)到嵌套異常服務(wù)程序。在KeyStone 器件中,加載程序不依賴于復(fù)位向量啟動程序,所以修改復(fù)位向量不會影響程序的加載。
6 例程
本文相關(guān)的例程可以在TCI6614 EVM, C6670 EVM 及C6678 EVM 上跑通。例程可以從以下鏈接下載:
http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx
如下為工程目錄結(jié)構(gòu):
“common“文件夾中包含通用代碼如DDR 初始化及DMA、定時器、多核導(dǎo)航器、SRIO 驅(qū)動等。內(nèi)存保護(hù)初始化代碼、EDC 及異常處理的代碼包含在KeyStone_common.c.
“src”文件夾中的每個c 文件包含一個測試用例代碼。主函數(shù)在 “Robust_System.c”. 在 “Robust_System.c“的開頭有一些宏開關(guān),每個開關(guān)用于使能或關(guān)閉一個測試用例。
如果出現(xiàn)這種情況,可以關(guān)閉這個測試用例然后重新測試其他的用例。
在EVM 上運(yùn)行例程的步驟如下:
1. 解壓例程, 將CCS workspace 切換到解壓后的文件夾;
2. 在workspace 中導(dǎo)入工程;
3. 如果發(fā)生代碼修改對工程重新編譯,也許需要在編譯選項(xiàng)中修改CSL 保護(hù)路徑;
4. 設(shè)置EVM 板上的器件加載模式為No boot 模式;
5. 將代碼加載到DSP core0,運(yùn)行;
6. 查看CCS stdout 窗口瀏覽測試結(jié)果。
如下為TCI6614 上的測試結(jié)果。
7 參考文獻(xiàn)
1. Memory Protection On KeyStone Devices (SPRWIKI9012)
2. TMS320C66x DSP CPU and Instruction Set Reference Guide (SPRUGH7)
3. TMS320C66x DSP CorePac User Guide (SPRUGW0)
4. KeyStone Architecture Multicore Shared Memory Controller User Guide (SPRUGW7)
5. KeyStone Architecture Memory Protection Unit (MPU) User Guide (SPRUGW5)
6. KeyStone Architecture Enhanced Direct Memory Access (EDMA3) Controller User Guide (SPRUGS5)
7. KeyStone Architecture Timer64 User Guide (SPRUGV5)
8. KeyStone Architecture Chip Interrupt Controller (CIC) User Guide (SPRUGW4)
9. KeyStone Architecture DDR3 Memory Controller’s user guider (SPRUGV8)
10. TMS320C6000 Optimizing Compiler User's Guide (SPRU187)
11. “Interrupts”, “MPU” and “Memory Map Summary” sections in Device specific Data Manuals
評論