本發(fā)明涉及軟件方法領(lǐng)域,具體應(yīng)用于星載系統(tǒng)中,具體是一種基于zynq-7000的片上存儲(chǔ)器抗單粒子翻轉(zhuǎn)防護(hù)方法。
背景技術(shù):
近年來,商用器件(commercial-off-the-shelf,cots)因成本低、性能高、不受國外進(jìn)口限制等特點(diǎn)被越來越多地應(yīng)用于航天領(lǐng)域中。其中,xilinx公司的zynq-7000系列器件將雙核arm處理器與可編程邏輯、硬ip外設(shè)緊密集成,其靈活性和可配置性的完美結(jié)合受到小衛(wèi)星領(lǐng)域的廣泛關(guān)注,逐步應(yīng)用于航天領(lǐng)域的工程實(shí)踐中。
zynq-7000socps部分內(nèi)的雙核armcortex-a9處理器可采用非對(duì)稱多處理(asymmetricmulti-coreprocessor,amp)機(jī)制以并行或冗余的方式執(zhí)行不同的任務(wù),使系統(tǒng)性能實(shí)現(xiàn)最大化。zynq-7000socps部分內(nèi)的片上存儲(chǔ)器(on-chipmemory,ocm)包含256kb的ram存儲(chǔ)空間,具有較高的訪問吞吐量,是zynq-7000soc片內(nèi)雙核處理器之間進(jìn)行數(shù)據(jù)交互和資源共享的重要資源媒介。但zynq-7000作為cots器件其抗輻射能力較低,其片上存儲(chǔ)器很容易受到對(duì)ram敏感的單粒子翻轉(zhuǎn)的影響,造成存儲(chǔ)器數(shù)據(jù)狀態(tài)的改變,導(dǎo)致雙核處理器通信的失效,甚至導(dǎo)致星載系統(tǒng)指令或數(shù)據(jù)的失效,引發(fā)系統(tǒng)崩潰。
在星載系統(tǒng)的設(shè)計(jì)中,不僅要滿足星載系統(tǒng)基本的功能需求,更要考慮星載系統(tǒng)的高可靠性要求。目前,針對(duì)單粒子翻轉(zhuǎn)進(jìn)行存儲(chǔ)器加固的常用方法是硬件edac電路,主要包括處理器自帶edac電路和用fpga實(shí)現(xiàn)edac電路兩類。其中,處理器自帶edac電路通常由芯片的安全等級(jí)決定,如宇航級(jí)芯片,而zynq-7000內(nèi)的片上存儲(chǔ)器僅具有奇偶校驗(yàn)功能,不具備糾錯(cuò)能力,不滿足星載系統(tǒng)抗單粒子翻轉(zhuǎn)的需求;用fpga實(shí)現(xiàn)edac電路具有設(shè)計(jì)靈活、可配置的特點(diǎn),但sram型fpga作為易失性存儲(chǔ),其自身可靠性存在問題,且最重要的是雙核處理器與片上存儲(chǔ)器已集成在同一芯片中,無法通過外加硬件edac電路實(shí)現(xiàn)存儲(chǔ)器的加固。
技術(shù)實(shí)現(xiàn)要素:
為解決傳統(tǒng)硬件edac在zynq-7000內(nèi)片上存儲(chǔ)器ocm加固的局限性,本發(fā)明提供了一種基于zynq-7000的片上存儲(chǔ)器抗單粒子翻轉(zhuǎn)軟件防護(hù)設(shè)計(jì)方法,利用zynq-7000內(nèi)雙核arm處理器和軟件生成中斷(softwaregenerateinterrupt,sgi)的資源特性,采用軟件edac方法實(shí)現(xiàn)ocm的數(shù)據(jù)容錯(cuò),保障雙核通信的可靠性。
一種基于zynq-7000的片上存儲(chǔ)器抗單粒子翻轉(zhuǎn)防護(hù)方法,cpu0或cpu1中的原始數(shù)據(jù)通過軟件edac模塊進(jìn)行編碼操作,寫入到ocm中;ocm中的hsiao碼數(shù)據(jù)通過軟件edac模塊進(jìn)行解碼操作,被cpu0或cpu1讀?。划?dāng)數(shù)據(jù)讀取檢測(cè)到單位錯(cuò)或雙位錯(cuò)時(shí),sgi產(chǎn)生軟件中斷進(jìn)行雙核同步數(shù)據(jù)回寫或通知cpu0和cpu1進(jìn)行處理,其特征在于:
a、關(guān)鍵變量定義及初始化:將需存儲(chǔ)在ocm且待加固的變量作為關(guān)鍵變量,定義關(guān)鍵變量的位寬,指定關(guān)鍵變量在ocm中的存儲(chǔ)地址,初始化關(guān)鍵變量,并對(duì)sgi進(jìn)行使能;
b、數(shù)據(jù)編解碼操作:采用具有糾一檢二功能的hsiao碼作為ocm加固的糾錯(cuò)碼,根據(jù)hsiao碼算法原理,對(duì)cpu寫入ocm的數(shù)據(jù)進(jìn)行編碼操作,對(duì)cpu從ocm讀取的數(shù)據(jù)進(jìn)行解碼操作;
c、錯(cuò)誤中斷生成:采用zynq-7000內(nèi)部軟件生成中斷sgi處理檢測(cè)到的錯(cuò)誤,當(dāng)從ocm讀取數(shù)據(jù)檢測(cè)到單位錯(cuò)時(shí),sgi產(chǎn)生軟件中斷sec,通知cpu0和cpu1進(jìn)行同步回寫;當(dāng)從ocm讀取數(shù)據(jù)檢測(cè)到雙位錯(cuò)時(shí),sgi產(chǎn)生軟件中斷ded,通知cpu0和cpu1進(jìn)行處理;
d、雙核同步回寫:當(dāng)數(shù)據(jù)讀取檢測(cè)到單位錯(cuò)時(shí),通過hsiao碼解碼操作可以得到cpu所需的正確數(shù)據(jù),但為便于后續(xù)數(shù)據(jù)的使用需將正確數(shù)據(jù)回寫到ocm中。同時(shí)為避免一個(gè)cpu在數(shù)據(jù)回寫過程中被另一個(gè)cpu訪問,采取雙核同步回寫操作,直到數(shù)據(jù)回寫完成才可以被訪問。
進(jìn)一步的,所述的關(guān)鍵變量定義及初始化過程中,將所有存儲(chǔ)到ocm的關(guān)鍵變量定義成位寬為32位的無符號(hào)長整型數(shù),其中僅低16位有效,高16位全部清0,用作(13,8)hsiao碼校驗(yàn)位的存儲(chǔ);為所有的關(guān)鍵變量分配ocm存儲(chǔ)地址,zynq-7000內(nèi)ocm默認(rèn)的映射地址空間為(0x0000_0000~0x0003_ffff)和(0xffff_0000~0xffff_ffff);對(duì)存儲(chǔ)到ocm的關(guān)鍵變量進(jìn)行初始化賦值。
進(jìn)一步的,所述的解碼操作過程中,當(dāng)cpu向ocm寫入數(shù)據(jù)時(shí),從cpu0或cpu1中讀取原始數(shù)據(jù),將原始數(shù)據(jù)的低16位有效數(shù)據(jù)拆分成兩組8位數(shù)據(jù),對(duì)8位數(shù)據(jù)進(jìn)行移位操作存入一個(gè)長度為8的數(shù)據(jù)位數(shù)組中,使數(shù)組中各元素最低位的值為8位數(shù)據(jù)相應(yīng)位的值;根據(jù)上述得到的數(shù)據(jù)數(shù)組與(13,8)hsiao碼算法獲取的生成矩陣g,對(duì)每一個(gè)8位數(shù)據(jù)進(jìn)行編碼操作,并獲取一個(gè)長度為5的校驗(yàn)位數(shù)組;根據(jù)hsiao碼的數(shù)據(jù)位分配,將兩組數(shù)據(jù)位數(shù)組和校驗(yàn)位數(shù)組進(jìn)行移位操作,合成一個(gè)32位hsiao碼數(shù)據(jù),存入ocm中。
進(jìn)一步的,所述的解碼操作過程中,當(dāng)cpu從ocm讀取數(shù)據(jù)時(shí):從ocm中讀取hsiao碼數(shù)據(jù),并記錄該數(shù)據(jù)地址,將hsiao碼數(shù)據(jù)拆分成兩組(13,8)hsiao碼數(shù)據(jù),對(duì)13位編碼數(shù)據(jù)進(jìn)行移位操作存入一個(gè)長度為13的編碼位數(shù)組中,使數(shù)組中各元素最低位的值為編碼數(shù)據(jù)相應(yīng)位的值;根據(jù)上述得到的編碼位數(shù)組與(13,8)hsiao碼算法獲取的監(jiān)督矩陣h,對(duì)每一個(gè)編碼數(shù)據(jù)進(jìn)行解碼操作,并獲取一個(gè)長度為5的校驗(yàn)子數(shù)組;將兩組校驗(yàn)子數(shù)組進(jìn)行移位操作,使校驗(yàn)子s相應(yīng)位的值為數(shù)組中各元素最低位的值,根據(jù)校驗(yàn)子s得到無錯(cuò)、單位錯(cuò)和雙位錯(cuò)的錯(cuò)誤狀態(tài)標(biāo)志,對(duì)于無錯(cuò)和單位錯(cuò)可以得到正確的數(shù)據(jù),被cpu0或cpu1讀取和使用。
進(jìn)一步的,所述的錯(cuò)誤中斷生成過程中,為單位錯(cuò)和雙位錯(cuò)分別分配一個(gè)sgiid號(hào),初始化并開啟對(duì)應(yīng)的sgi;當(dāng)檢測(cè)到錯(cuò)誤時(shí),將sgi連接到所有的cpu,通過寫zynq-7000內(nèi)部icdsgir寄存器,產(chǎn)生相應(yīng)的軟件中斷,同時(shí)對(duì)錯(cuò)誤狀態(tài)標(biāo)志sec_flag或ded_flag置位;進(jìn)入單位錯(cuò)或雙位錯(cuò)對(duì)應(yīng)的軟件中斷服務(wù)函數(shù)。
進(jìn)一步的,所述的雙核同步回寫過程中,當(dāng)cpu0檢測(cè)到單位錯(cuò)時(shí):cpu0解碼操作對(duì)單位錯(cuò)狀態(tài)標(biāo)志sec_flag置1,cpu0和cpu1同時(shí)進(jìn)入單位錯(cuò)中斷服務(wù)程序;在cpu0中,獲取待回寫變量的存儲(chǔ)地址和正確數(shù)據(jù),并將該正確數(shù)據(jù)回寫到對(duì)應(yīng)的存儲(chǔ)地址,將sec_flag置0;在cpu1中,等待cpu0完成回寫操作,直到sec_flag為0。
進(jìn)一步的,所述的雙核同步回寫過程中,當(dāng)cpu1檢測(cè)到單位錯(cuò)時(shí):cpu1解碼操作對(duì)單位錯(cuò)狀態(tài)標(biāo)志sec_flag置2,cpu0和cpu1同時(shí)進(jìn)入單位錯(cuò)中斷服務(wù)程序;在cpu1中,獲取待回寫變量的存儲(chǔ)地址和正確數(shù)據(jù),并將該正確數(shù)據(jù)回寫到對(duì)應(yīng)的存儲(chǔ)地址,將sec_flag置0;在cpu0中,等待cpu1完成回寫操作,直到sec_flag為0。
本發(fā)明的有益效果是:通過采用本發(fā)明的技術(shù)方案,
(1)該方法利用zynq-7000內(nèi)部雙核arm處理器和軟件生成中斷sgi等自帶的資源特性,將軟件edac模塊分為數(shù)據(jù)編解碼模塊、錯(cuò)誤中斷生成模塊和雙核同步回寫模塊三部分,使關(guān)鍵變量具有糾正1位錯(cuò)誤的同時(shí)能檢測(cè)到2位錯(cuò)誤,以及數(shù)據(jù)回寫的能力。
(2)該方法采取雙核同步回寫操作,解決一個(gè)cpu在數(shù)據(jù)回寫過程中另一個(gè)cpu重復(fù)讀取到錯(cuò)誤數(shù)據(jù)的問題,避免數(shù)據(jù)回寫對(duì)雙核arm處理器訪問ocm造成的沖突。
(3)該方法屬于空間環(huán)境中存儲(chǔ)器加固的軟件處理手段,解決了zynq-7000內(nèi)cpu與ocm之間無法硬件容錯(cuò)的缺陷,可對(duì)ocm中指定地址的數(shù)據(jù)進(jìn)行加固,滿足雙核之間數(shù)據(jù)訪問的條件,提高雙核通信的可靠性。
附圖說明
圖1為本發(fā)明軟件edac原理框圖。
圖2為hsiao碼數(shù)據(jù)位分配圖。
圖3為軟件edac數(shù)據(jù)寫入流程圖。
圖4為軟件edac數(shù)據(jù)讀取流程圖。
圖5為cpu0雙核同步回寫程序流程圖。
圖6為cpu1雙核同步回寫程序流程圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步說明。
一種基于zynq-7000的片上存儲(chǔ)器抗單粒子翻轉(zhuǎn)防護(hù)方法,利用zynq-7000芯片內(nèi)雙核arm處理器和軟件生成中斷(softwaregenerateinterrupt,sgi)的資源特性,采用軟件edac方法實(shí)現(xiàn)ocm的數(shù)據(jù)容錯(cuò),保障雙核通信的可靠性,其原理框圖如圖1所示。
在圖1中,cpu0或cpu1中的原始數(shù)據(jù)通過軟件edac模塊進(jìn)行編碼操作,寫入到ocm中;ocm中的hsiao碼數(shù)據(jù)通過軟件edac模塊進(jìn)行解碼操作,被cpu0或cpu1讀取;當(dāng)數(shù)據(jù)讀取檢測(cè)到單位錯(cuò)或雙位錯(cuò)時(shí),sgi產(chǎn)生軟件中斷進(jìn)行雙核同步數(shù)據(jù)回寫或通知cpu0和cpu1進(jìn)行處理。主要步驟如下:
步驟(一)關(guān)鍵變量定義及初始化:將需存儲(chǔ)在ocm且待加固的變量作為關(guān)鍵變量,定義關(guān)鍵變量的位寬,指定關(guān)鍵變量在ocm中的存儲(chǔ)地址,初始化關(guān)鍵變量,并對(duì)sgi進(jìn)行使能;具體為:
(1)將所有存儲(chǔ)到ocm的關(guān)鍵變量定義成位寬為32位的無符號(hào)長整型數(shù),其中僅低16位有效,高16位全部清0,用作(13,8)hsiao碼校驗(yàn)位的存儲(chǔ),其hsiao碼數(shù)據(jù)位分配如圖2所示;
(2)為所有的關(guān)鍵變量分配ocm存儲(chǔ)地址,zynq-7000內(nèi)ocm默認(rèn)的映射地址空間為(0x0000_0000~0x0003_ffff)和(0xffff_0000~0xffff_ffff)。
(3)對(duì)存儲(chǔ)到ocm的關(guān)鍵變量進(jìn)行初始化賦值。
步驟(二)數(shù)據(jù)編解碼操作:采用具有糾一檢二功能的hsiao碼作為ocm加固的糾錯(cuò)碼,根據(jù)hsiao碼算法原理,對(duì)cpu寫入ocm的數(shù)據(jù)進(jìn)行編碼操作,對(duì)cpu從ocm讀取的數(shù)據(jù)進(jìn)行解碼操作,具體為:
如圖3所示,當(dāng)cpu向ocm寫入數(shù)據(jù)時(shí):
(1)從cpu0或cpu1中讀取原始數(shù)據(jù),將原始數(shù)據(jù)的低16位有效數(shù)據(jù)拆分成兩組8位數(shù)據(jù),對(duì)8位數(shù)據(jù)進(jìn)行移位操作存入一個(gè)長度為8的數(shù)據(jù)位數(shù)組中,使數(shù)組中各元素最低位的值為8位數(shù)據(jù)相應(yīng)位的值;
(2)根據(jù)上述得到的數(shù)據(jù)數(shù)組與(13,8)hsiao碼算法獲取的生成矩陣g,對(duì)每一個(gè)8位數(shù)據(jù)進(jìn)行編碼操作,并獲取一個(gè)長度為5的校驗(yàn)位數(shù)組;
(3)根據(jù)圖2所示的hsiao碼數(shù)據(jù)位分配,將兩組數(shù)據(jù)位數(shù)組和校驗(yàn)位數(shù)組進(jìn)行移位操作,合成一個(gè)32位hsiao碼數(shù)據(jù),存入ocm中。
如圖4所示,當(dāng)cpu從ocm讀取數(shù)據(jù)時(shí):
(1)從ocm中讀取hsiao碼數(shù)據(jù),并記錄該數(shù)據(jù)地址,將hsiao碼數(shù)據(jù)拆分成兩組(13,8)hsiao碼數(shù)據(jù),對(duì)13位編碼數(shù)據(jù)進(jìn)行移位操作存入一個(gè)長度為13的編碼位數(shù)組中,使數(shù)組中各元素最低位的值為編碼數(shù)據(jù)相應(yīng)位的值;
(2)根據(jù)上述得到的編碼位數(shù)組與(13,8)hsiao碼算法獲取的監(jiān)督矩陣h,對(duì)每一個(gè)編碼數(shù)據(jù)進(jìn)行解碼操作,并獲取一個(gè)長度為5的校驗(yàn)子數(shù)組;
(3)將兩組校驗(yàn)子數(shù)組進(jìn)行移位操作,使校驗(yàn)子s相應(yīng)位的值為數(shù)組中各元素最低位的值,根據(jù)校驗(yàn)子s得到無錯(cuò)、單位錯(cuò)和雙位錯(cuò)的錯(cuò)誤狀態(tài)標(biāo)志,對(duì)于無錯(cuò)和單位錯(cuò)可以得到正確的數(shù)據(jù),被cpu0或cpu1讀取和使用。
步驟(三)錯(cuò)誤中斷生成:采用zynq-7000內(nèi)部軟件生成中斷sgi處理檢測(cè)到的錯(cuò)誤,當(dāng)從ocm讀取數(shù)據(jù)檢測(cè)到單位錯(cuò)時(shí),sgi產(chǎn)生軟件中斷sec,通知cpu0和cpu1進(jìn)行同步回寫;當(dāng)從ocm讀取數(shù)據(jù)檢測(cè)到雙位錯(cuò)時(shí),sgi產(chǎn)生軟件中斷ded,通知cpu0和cpu1進(jìn)行處理。具體為:
(1)為單位錯(cuò)和雙位錯(cuò)分別分配一個(gè)sgiid號(hào),初始化并開啟對(duì)應(yīng)的sgi;
(2)當(dāng)檢測(cè)到錯(cuò)誤時(shí),將sgi連接到所有的cpu,通過寫zynq-7000內(nèi)部icdsgir寄存器,產(chǎn)生相應(yīng)的軟件中斷,同時(shí)對(duì)錯(cuò)誤狀態(tài)標(biāo)志sec_flag或ded_flag置位;
(3)進(jìn)入單位錯(cuò)或雙位錯(cuò)對(duì)應(yīng)的軟件中斷服務(wù)函數(shù)。
步驟(四)雙核同步回寫:當(dāng)數(shù)據(jù)讀取檢測(cè)到單位錯(cuò)時(shí),通過hsiao碼解碼操作可以得到cpu所需的正確數(shù)據(jù),但為便于后續(xù)數(shù)據(jù)的使用需將正確數(shù)據(jù)回寫到ocm中,同時(shí)為避免一個(gè)cpu在數(shù)據(jù)回寫過程中被另一個(gè)cpu訪問,采取雙核同步回寫操作,直到數(shù)據(jù)回寫完成才可以被訪問,如圖4、圖5所示。具體為:
當(dāng)cpu0檢測(cè)到單位錯(cuò)時(shí):
(1)cpu0解碼操作對(duì)單位錯(cuò)狀態(tài)標(biāo)志sec_flag置1,cpu0和cpu1同時(shí)進(jìn)入單位錯(cuò)中斷服務(wù)程序;
(2)在cpu0中,獲取待回寫變量的存儲(chǔ)地址和正確數(shù)據(jù),并將該正確數(shù)據(jù)回寫到對(duì)應(yīng)的存儲(chǔ)地址,將sec_flag置0;在cpu1中,等待cpu0完成回寫操作,直到sec_flag為0。
當(dāng)cpu1檢測(cè)到單位錯(cuò)時(shí):
(1)cpu1解碼操作對(duì)單位錯(cuò)狀態(tài)標(biāo)志sec_flag置2,cpu0和cpu1同時(shí)進(jìn)入單位錯(cuò)中斷服務(wù)程序;
(2)在cpu1中,獲取待回寫變量的存儲(chǔ)地址和正確數(shù)據(jù),并將該正確數(shù)據(jù)回寫到對(duì)應(yīng)的存儲(chǔ)地址,將sec_flag置0;在cpu0中,等待cpu1完成回寫操作,直到sec_flag為0。
以上所述實(shí)施例僅為表達(dá)本發(fā)明的實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形、同等替換、改進(jìn)等,這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。