本發(fā)明涉及一種帶自檢功能的soc應(yīng)用程序引導(dǎo)方法,屬于soc加載技術(shù)領(lǐng)域。
背景技術(shù):
soc,systemonchip的簡(jiǎn)稱,即片上系統(tǒng)。從狹義角度講,它是信息系統(tǒng)核心的芯片集成,是將系統(tǒng)關(guān)鍵部件集成在一塊芯片上;從廣義上講,soc是一個(gè)微小型系統(tǒng),如果說(shuō)中央處理器是大腦,那么soc就是包括大腦、心臟、眼睛和手的系統(tǒng)。國(guó)內(nèi)外學(xué)術(shù)界一般傾向?qū)oc定義為將微處理器、模擬ip核、數(shù)字ip核和存儲(chǔ)器(或片外存儲(chǔ)控制接口)集成在單一芯片上,它通常是客戶定制的,或是面向特定用途的標(biāo)準(zhǔn)產(chǎn)品。由于其強(qiáng)大的可擴(kuò)展性和高度的集成性,目前soc被廣泛用于移動(dòng)電子產(chǎn)品、智能設(shè)備和控制裝置中。如果將soc比作軀干,那么運(yùn)行于soc中的嵌入式軟件即為片上系統(tǒng)的靈魂。soc借助運(yùn)行于其中的應(yīng)用軟件來(lái)控制外設(shè)工作,進(jìn)行邏輯運(yùn)算從而完成其所擔(dān)負(fù)的應(yīng)用功能。本發(fā)明所述方法即為嵌入式軟件的一部分,屬于bootloader的一種。
在嵌入式操作系統(tǒng)中,bootloader是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行??梢猿跏蓟布O(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒(méi)有像bios那樣的固件程序,因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由bootloader來(lái)完成。目前的bootloader程序在上電后直接將soc的flash空間中的應(yīng)用程序目標(biāo)碼搬運(yùn)到sram中,并從第一條語(yǔ)句開(kāi)始執(zhí)行。一旦出現(xiàn)故障,無(wú)法判別是由于應(yīng)用程序?qū)崿F(xiàn)不正確還是由于芯片本身存在故障,或者是由于程序搬運(yùn)過(guò)程存在錯(cuò)誤,造成后續(xù)排故成本高企。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提出一種帶自檢功能的soc應(yīng)用程序引導(dǎo)方法,在啟動(dòng)嵌入式應(yīng)用程序運(yùn)行前,對(duì)其運(yùn)行的環(huán)境及其應(yīng)用程序運(yùn)行前的狀態(tài)的正確性進(jìn)行檢查,從而提高了嵌入式應(yīng)用程序運(yùn)行的正確性和可靠性。
本發(fā)明目的通過(guò)如下技術(shù)方案予以實(shí)現(xiàn):
提供一種帶自檢功能的soc應(yīng)用程序引導(dǎo)方法,步驟具體如下:
(1)生成關(guān)于應(yīng)用程序的在soc芯片中運(yùn)行的應(yīng)用程序目標(biāo)碼,計(jì)算應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼;
(2)將應(yīng)用程序目標(biāo)碼和應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼打包;
(3)生成帶自檢功能引導(dǎo)方法的目標(biāo)碼,并將引導(dǎo)方法的目標(biāo)碼放于最前端,與應(yīng)用程序目標(biāo)碼及應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼,一起構(gòu)成帶自檢功能的可執(zhí)行目標(biāo)碼;
(4)上傳帶自檢功能的可執(zhí)行目標(biāo)碼到soc的flash空間中。
優(yōu)選的,所述步驟(3)中生成帶自檢功能引導(dǎo)方法的目標(biāo)碼具體包括如下步驟:
步驟3.1,初始化soc芯片;
步驟3.2,對(duì)應(yīng)用程序運(yùn)行的目標(biāo)sram區(qū)進(jìn)行工作正確性檢查;
步驟3.3,將應(yīng)用程序目標(biāo)碼部分從flash搬運(yùn)到應(yīng)用程序運(yùn)行的目標(biāo)sram中;
步驟3.4,讀取搬運(yùn)到sram中應(yīng)用程序目標(biāo)碼,采取所述的步驟(1)中計(jì)算應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼的方法,計(jì)算sram中應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼;
步驟3.5,讀取flash中的應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼,與步驟3.4中計(jì)算出sram中應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼進(jìn)行比較,檢查是否一致,若不一致則報(bào)警,若一致,則繼續(xù)執(zhí)行步驟3.6;
步驟3.6,運(yùn)行應(yīng)用程序。
優(yōu)選的,步驟3.2中對(duì)應(yīng)用程序運(yùn)行的目標(biāo)sram區(qū)進(jìn)行工作正確性檢查,即對(duì)每個(gè)sram區(qū)的存儲(chǔ)單元,以雙字為單位,進(jìn)行正確性檢查處理,檢查處理包括如下步驟:
步驟3.2.1,依次向sram的存儲(chǔ)單元中寫入特定值;
步驟3.2.2,在每次寫入特定值后,讀取所寫入的存儲(chǔ)單元中的數(shù)據(jù),檢查讀取數(shù)據(jù)與寫入的值是否一致,若不一致,則sram存在故障,進(jìn)行故障報(bào)警;若一致,則繼續(xù)完成其他單元的檢查,直至完成全部應(yīng)用程序運(yùn)行的目標(biāo)sram區(qū)的正確性檢查。
優(yōu)選的,步驟3.2.2及步驟步驟3.5中的故障報(bào)警的方式包括通過(guò)soc的i/o或總線報(bào)警。
優(yōu)選的,故障報(bào)警通過(guò)i/o輸出故障波形或通過(guò)總線輸出故障消息來(lái)完成。
優(yōu)選的,步驟4中上傳帶自檢功能的可執(zhí)行目標(biāo)碼到soc的flash空間中的具體方法為:
步驟4.1,通過(guò)soc提供的程序上傳接口,將可執(zhí)行目標(biāo)碼上傳至以soc上電后執(zhí)行的第一條指令的地址為起始地址的flash地址空間中;
步驟4.2,傳輸完畢后,從flash地址空間中讀取所上傳的可執(zhí)行目標(biāo)碼,并以字節(jié)為單位,與所上傳的源目標(biāo)碼進(jìn)行比較,若一致則結(jié)束傳輸,若不一致,則重新執(zhí)行步驟4.1;如果兩次傳輸失敗則檢查soc和上傳硬件通路是否存在故障,排除故障后重新執(zhí)行步驟4.1。
優(yōu)選的,soc上電,執(zhí)行flash地址空間中的帶自檢功能的引導(dǎo)程序。
優(yōu)選的,soc芯片的型號(hào)為bm3101,soc的微處理器為leon2版本的sparcv8架構(gòu)。
優(yōu)選的,在sram自檢的過(guò)程中,由于sram是檢查的目標(biāo),因此在檢查的過(guò)程中不使用sram區(qū)。
優(yōu)選的,以sparc的指令集實(shí)現(xiàn)的sram自檢功能的引導(dǎo)方法的目標(biāo)碼具體構(gòu)造步驟如下:
步驟1.將待檢查的sram區(qū)長(zhǎng)度以立即數(shù)的形式放入l7寄存器中;
步驟2.將l3寄存器清零,作為當(dāng)前已訪問(wèn)sram單元計(jì)數(shù)器;
步驟3.將l5寄存器設(shè)置為sram區(qū)的檢查基址;
步驟4.判斷是否sram區(qū)全部地址檢查完畢,如果檢查完畢進(jìn)入步驟12,如果沒(méi)有檢查完畢進(jìn)入步驟5;
步驟5.將當(dāng)前地址值偏移量寫入l4寄存器;
步驟6.向寄存器g1中寫入當(dāng)前檢測(cè)值;
步驟7.向l5+l4指定的sram地址中寫入g1寄存器中的值;
步驟8.讀出l5+l4指定的sram地址中的數(shù)值到寄存器l2中;
步驟9.比較g1和l2中的值是否相等,如不相等則置o2寄存器為1,跳到步驟12,否則繼續(xù)執(zhí)行后續(xù)步驟;
步驟10.給寄存器l3中的值加一;
步驟11.比較l3的長(zhǎng)度與l7中的長(zhǎng)度是否相等,如果不相等,則跳轉(zhuǎn)到步驟4,如果相等則執(zhí)行步驟12;
步驟12.判斷o2寄存器中的值是否為0,如果為0,則sram自檢成功繼續(xù)執(zhí)行后續(xù)步驟,否則報(bào)故障,然后進(jìn)入死循環(huán)等待狀態(tài);
步驟13.將應(yīng)用程序目標(biāo)碼從flash區(qū)搬運(yùn)到sram區(qū)域;
步驟14.計(jì)算sram中的目標(biāo)碼的crc校驗(yàn)碼;
步驟15.比較sram區(qū)中應(yīng)用程序目標(biāo)碼crc與flash中的應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼字段的一致性,若一致,則將sram中應(yīng)用程序目標(biāo)碼首地址放入程序指令寄存器中,若不一致,則進(jìn)行故障報(bào)警。
本發(fā)明與現(xiàn)有技術(shù)相比具有如下優(yōu)點(diǎn):
(1)本發(fā)明在程序上傳至soc的flash空間的過(guò)程中進(jìn)行了一致性校驗(yàn),保證了flash空間中的程序的正確性。
(2)在程序由flash空間搬運(yùn)到其運(yùn)行的sram空間前,對(duì)sram空間進(jìn)行功能性校驗(yàn),保證了程序運(yùn)行環(huán)境的正確性。
(3)在程序由flash空間搬運(yùn)到其運(yùn)行的sram空間后,對(duì)程序搬運(yùn)的正確性進(jìn)行校驗(yàn),保證了本次上電運(yùn)行程序與flash空間中的程序一致。
(4)本發(fā)明通過(guò)程序上傳的一致性校驗(yàn)、搬運(yùn)前、后的校驗(yàn),保證了從源程序到每次運(yùn)行程序的正確性,保證了運(yùn)行環(huán)境功能完好,一旦程序發(fā)生故障,能夠快速進(jìn)行故障定位。
附圖說(shuō)明
圖1為本發(fā)明帶自檢功能的soc應(yīng)用程序引導(dǎo)方法流程圖;
圖2為本發(fā)明帶自檢功能的可執(zhí)行目標(biāo)碼實(shí)施例結(jié)構(gòu)示意圖。
具體實(shí)施方式
結(jié)合圖1,帶自檢功能的soc應(yīng)用程序目標(biāo)碼生成及加載方法,步驟具體如下:
(1)生成關(guān)于應(yīng)用程序的在soc芯片中運(yùn)行的目標(biāo)碼,以字節(jié)為單位,計(jì)算crc校驗(yàn)碼;
(2)將目標(biāo)碼和crc校驗(yàn)碼打包,即將所計(jì)算出的應(yīng)用程序crc校驗(yàn)碼放于緊跟應(yīng)用程序目標(biāo)碼的后面,占用一個(gè)字的空間;
(3)生成帶自檢功能引導(dǎo)方法的目標(biāo)碼,并將其放于應(yīng)用程序目標(biāo)碼的前面,并與應(yīng)用程序目標(biāo)碼及所計(jì)算出的crc校驗(yàn)碼,一起構(gòu)成帶自檢功能的可執(zhí)行目標(biāo)碼,參見(jiàn)圖2。
帶自檢功能的引導(dǎo)方法包括如下步驟:
步驟3.1,初始化soc芯片,包括存儲(chǔ)器訪問(wèn)配置、cache訪問(wèn)配置,芯片工作頻率、i\o接口、串口、總線等在內(nèi)的運(yùn)行最小配置集;
步驟3.2,對(duì)應(yīng)用程序運(yùn)行的目標(biāo)sram區(qū)進(jìn)行工作正確性檢查;對(duì)應(yīng)用程序運(yùn)行的目標(biāo)sram區(qū)進(jìn)行工作正確性檢查,具體為:對(duì)每個(gè)sram區(qū)的存儲(chǔ)單元,以雙字為單位,進(jìn)行正確性檢查處理,檢查處理包括如下步驟:
步驟3.2.1,依次向sram的存儲(chǔ)單元中寫入特定值,包括0xffffffff,0xaaaaaaaa,0x55555555,0x00000000;
步驟3.2.2,在每次寫入特定值后,讀取所寫入的存儲(chǔ)單元中的數(shù)據(jù),檢查讀取數(shù)據(jù)與寫入的值是否一致:若不一致,則sram存在故障,進(jìn)行故障報(bào)警;若一致,則繼續(xù)完成其他單元的檢查;報(bào)警的方式可通過(guò)soc的i/o、串行總線或其他擴(kuò)展總線,如1553b總線等通過(guò)輸出故障波形或故障消息來(lái)完成;
步驟3.3,將應(yīng)用程序目標(biāo)碼部分從flash搬運(yùn)到應(yīng)用程序運(yùn)行的目標(biāo)sram中;
步驟3.4,讀取搬運(yùn)到sram中應(yīng)用程序目標(biāo)碼,采取所述的步驟(1)處理中相同的方法,以字節(jié)為單位,來(lái)重新計(jì)算crc校驗(yàn)碼;
步驟3.5,讀取flash中的crc校驗(yàn)碼,與步驟3.4中計(jì)算出的crc校驗(yàn)碼進(jìn)行比較,檢查是否一致,若不一致則報(bào)警,若一致,則繼續(xù)執(zhí)行步驟3.6;
步驟3.6,利用跳轉(zhuǎn)指令,跳轉(zhuǎn)至應(yīng)用程序的第一條指令處,運(yùn)行應(yīng)用程序。
(4)上傳帶自檢功能的可執(zhí)行目標(biāo)碼到soc的flash空間中,包括如下步驟:
步驟4.1,通過(guò)soc提供的程序上傳接口,將可執(zhí)行目標(biāo)碼上傳至以soc上電后執(zhí)行的第一條指令的地址為起始地址的flash地址空間中;
步驟4.2,傳輸完畢后,從flash地址空間中讀取所上傳的可執(zhí)行目標(biāo)碼,并以字節(jié)為單位,與所上傳的源目標(biāo)碼進(jìn)行比較,若一致則結(jié)束傳輸,若不一致,則重新執(zhí)行步驟4.1;如果兩次傳輸失敗則檢查soc和上傳硬件通路是否存在故障,排除故障后重新執(zhí)行步驟4.1。
soc的工作過(guò)程如下:
soc上電,執(zhí)行flash地址空間中的帶自檢功能的引導(dǎo)程序,執(zhí)行步驟3.1-3.6,運(yùn)行應(yīng)用程序。
在一個(gè)實(shí)施例中,在型號(hào)bm3101的soc芯片中實(shí)現(xiàn)上述引導(dǎo)程序。該soc的微處理器為leon2版本的sparcv8架構(gòu)。本實(shí)施例在引導(dǎo)程序進(jìn)行自檢時(shí)發(fā)現(xiàn)故障的情況下,采用1553b總線對(duì)故障信息進(jìn)行發(fā)送。
本發(fā)明所構(gòu)建的bootloader,即引導(dǎo)程序,是在加電后自動(dòng)執(zhí)行,完成cpu和相關(guān)硬件的初始化后,再將固化的嵌入式應(yīng)用程序裝在到內(nèi)存中然后跳轉(zhuǎn)到嵌入式應(yīng)用程序所在的空間,啟動(dòng)嵌入式應(yīng)用程序運(yùn)行。
本發(fā)明所述的技術(shù)包括了一種引導(dǎo)程序的構(gòu)建方法,運(yùn)行邏輯。與其他傳統(tǒng)的引導(dǎo)程序不同的方面在于,其在啟動(dòng)嵌入式應(yīng)用程序運(yùn)行前,對(duì)其運(yùn)行的環(huán)境及其應(yīng)用程序運(yùn)行前的狀態(tài)的正確性進(jìn)行檢查,從而提高了嵌入式應(yīng)用程序運(yùn)行的正確性和可靠性。
以下是以sparc的指令集實(shí)現(xiàn)的sram自檢功能的具體實(shí)現(xiàn)方法,在自檢失敗后,構(gòu)建1553b故障信息消息并放入rt對(duì)應(yīng)子地址的發(fā)送緩沖區(qū)中,同時(shí)程序停止執(zhí)行后續(xù)功能(進(jìn)入死循環(huán)),等待排故。在sram自檢的過(guò)程中,由于sram是檢查的目標(biāo),因此在檢查它的過(guò)程中不允許使用sram區(qū),包括堆棧區(qū)。
帶自檢功能引導(dǎo)方法的目標(biāo)碼構(gòu)造步驟如下:
步驟1.將待檢查的sram區(qū)長(zhǎng)度以立即數(shù)的形式放入l7寄存器中;
步驟2.將l3寄存器清零,作為當(dāng)前已訪問(wèn)sram單元計(jì)數(shù)器;
步驟3.將l5寄存器設(shè)置為sram區(qū)的檢查基址;
步驟4.判斷是否sram區(qū)全部地址檢查完畢,如果檢查完畢進(jìn)入步驟24,如果沒(méi)有檢查完畢進(jìn)入步驟5;
步驟5.將當(dāng)前地址值偏移量寫入l4寄存器;
步驟6.向寄存器g1中寫入當(dāng)前檢測(cè)值0xffffffff
步驟7.向l5+l4指定的sram地址中寫入g1寄存器中的值;
步驟8.讀出l5+l4指定的sram地址中的數(shù)值到寄存器l2中;
步驟9.比較g1和l2中的值是否相等,如不相等則置o2寄存器為1,跳到步驟24,否則繼續(xù)執(zhí)行后續(xù)步驟;
步驟10.向寄存器g1中寫入當(dāng)前檢測(cè)值0xaaaaaaaa
步驟11.向l5+l4指定的sram地址中寫入g1寄存器中的值;
步驟12.讀出l5+l4指定的sram地址中的數(shù)值到寄存器l2中;
步驟13.比較g1和l2中的值是否相等,如不相等則置o2寄存器為1,跳到步驟24,否則繼續(xù)執(zhí)行后續(xù)步驟;
步驟14.向寄存器g1中寫入當(dāng)前檢測(cè)值0x55555555
步驟15.向l5+l4指定的sram地址中寫入g1寄存器中的值;
步驟16.讀出l5+l4指定的sram地址中的數(shù)值到寄存器l2中;
步驟17.比較g1和l2中的值是否相等,如不相等則置o2寄存器為1,跳到步驟24,否則繼續(xù)執(zhí)行后續(xù)步驟;
步驟18.向寄存器g1中寫入當(dāng)前檢測(cè)值0x00000000
步驟19.向l5+l4指定的sram地址中寫入g1寄存器中的值;
步驟20.讀出l5+l4指定的sram地址中的數(shù)值到寄存器l2中;
步驟21.比較g1和l2中的值是否相等,如不相等則置o2寄存器為1,跳到步驟24,否則繼續(xù)執(zhí)行后續(xù)步驟;
步驟22.給寄存器l3中的值加一
步驟23.比較l3的長(zhǎng)度與l7中的長(zhǎng)度是否相等,如果不相等,則跳轉(zhuǎn)到步驟4,否則繼續(xù)執(zhí)行后續(xù)步驟;
步驟24.判斷o2寄存器中的值是否為0,如果為0,則sram自檢成功繼續(xù)執(zhí)行后續(xù)步驟,否則報(bào)故障,然后進(jìn)入死循環(huán)等待狀態(tài);
步驟25.將應(yīng)用程序目標(biāo)碼從flash區(qū)搬運(yùn)到sram區(qū)域;
步驟26.計(jì)算sram中的目標(biāo)碼得crc(由于此時(shí)sram已檢查完畢,算法可以使用sram區(qū),可以用高級(jí)語(yǔ)言撰寫);
步驟27.比較sram區(qū)中應(yīng)用程序目標(biāo)碼crc與flash中的應(yīng)用程序目標(biāo)碼的crc校驗(yàn)碼字段的一致性,若一致,則將sram中應(yīng)用程序目標(biāo)碼首地址放入程序指令寄存器中,否則報(bào)故障。
以上所述,僅為本發(fā)明最佳的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
本發(fā)明說(shuō)明書中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員的公知技術(shù)。