卡斯柯信號(hào)有限公司 宋志堅(jiān) 耿進(jìn)龍 宋興儒 劉 暢 潘 雷
基于μC/OS-II系統(tǒng)的高可靠性啟動(dòng)引導(dǎo)程序設(shè)計(jì)
卡斯柯信號(hào)有限公司 宋志堅(jiān) 耿進(jìn)龍 宋興儒 劉 暢 潘 雷
基于μC/OS-II系統(tǒng)的高可靠性啟動(dòng)引導(dǎo)程序,除完成板卡初始化、引導(dǎo)和啟動(dòng)μC/OS-II系統(tǒng)外,特別加入了NorFlash CRC校驗(yàn)、內(nèi)存和SRAM測(cè)試、故障記錄等功能,極大地增加了板卡啟動(dòng)引導(dǎo)過(guò)程的可靠性。該方法已在實(shí)際產(chǎn)品中驗(yàn)證可行,并在鐵路信號(hào)系統(tǒng)中得到了廣泛應(yīng)用。
μC/OS-II;ColdFire;啟動(dòng)引導(dǎo);高可靠性
The high reliability boot program based on μC/OS-II system complete the board initialization, boot and start μC/OS-II system, in particular,joined the NorFlash CRC check, SDRAM and SRAM test, fault records and other functions. Greatly increasing the reliability of the board boot process.The method has been proved feasible in practical products and has been widely used in railway signal system.
Keyworkds:μC/OS-II; ColdFire; boot; high reliability.
在嵌入式領(lǐng)域,因良好的實(shí)時(shí)性、可剪裁、可搶占、多任務(wù)、方便移植等特性,μC/OS-II系統(tǒng)得到了廣泛的使用。本文中介紹的啟動(dòng)引導(dǎo)程序,是在ColdFire架構(gòu)微處理器MCF54415基礎(chǔ)上實(shí)現(xiàn)的一種高可靠性專用bootloader,除一般移植μC/OS-II系統(tǒng)時(shí)要考慮的功能外,還增加了NorFlash CRC校驗(yàn)、內(nèi)存和SRAM測(cè)試、故障記錄等功能,增強(qiáng)了板卡啟動(dòng)引導(dǎo)過(guò)程的可靠性。
本文中實(shí)現(xiàn)的啟動(dòng)引導(dǎo)程序,其載體是一塊基于MCF54415的板卡,它包括DDR2 SDRAM、NorFlash、Uart、CAN、SPI等多個(gè)模塊,如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)框圖
在該板卡中,MPU選用MCF54415,主頻250MHz,DDR2 SDRAM的容量128M字節(jié),NorFlash容量16M字節(jié),用于存放μC/OS-II系統(tǒng)鏡像等,UART用于對(duì)外串口通信和板卡調(diào)試,LED用于程序運(yùn)行狀態(tài)顯示,SPI接口的串行FLASH用于保存系統(tǒng)的配置信息。
板卡上電以后,啟動(dòng)引導(dǎo)過(guò)程開始,經(jīng)過(guò)板卡預(yù)配置、板卡檢查、板卡配置、拷貝、BSS段清零、使能CACHE和MMU幾個(gè)階段,最終完成μC/OS-II系統(tǒng)的加載,如圖2所示。
圖2 啟動(dòng)引動(dòng)過(guò)程
啟動(dòng)引導(dǎo)過(guò)程中,各個(gè)階段的主要工作如下:
1)板卡預(yù)配置
此階段全部由匯編語(yǔ)言編寫,主要功能包括:禁止CPU中斷,禁止CACHE和MMU,配置CPU片上SRAM基地址并使能,設(shè)置堆棧指針用供C語(yǔ)言函數(shù)使用。
2)板卡檢查
自此階段開始,后面都用C語(yǔ)言實(shí)現(xiàn)。檢查的內(nèi)容包括CPU類型和板卡啟動(dòng)類型。
CPU類型:獲取MCF54415的器件號(hào),與預(yù)期值比較。若不等,進(jìn)入死循環(huán),禁止啟動(dòng)。
板卡啟動(dòng)類型:讀取CPU的復(fù)位狀態(tài)寄存器(RSR),獲得板卡的啟動(dòng)類型,供后續(xù)啟動(dòng)過(guò)程,進(jìn)行差異化處理。
3)板卡配置
此階段主要功能包括:關(guān)閉硬件看門狗,配置CPU主頻,外設(shè)供電,外設(shè)管腳配置,局部總線片選配置,初始化內(nèi)存等。
關(guān)閉硬件看門狗:硬件看門狗默認(rèn)上電開啟,啟動(dòng)引導(dǎo)過(guò)程須先關(guān)閉它;
配置CPU主頻:根據(jù)CPU的啟動(dòng)配置字,選擇是否使用PLL以及fvco和fsys的頻率,設(shè)置系統(tǒng)主頻為250MHz;
外設(shè)供電:使用外設(shè)電源管理寄存器(PPM)打開UART,CAN,SPI等設(shè)備的供電開關(guān)。
外設(shè)管腳配置:使用CPU的管腳復(fù)用與控制相關(guān)寄存器,對(duì)外設(shè)模塊的可復(fù)用管腳進(jìn)行配置,如分別配置UART0的TX/RX/RTS/CTS管腳等。
局部總線片選配置:根據(jù)CPU的片選地址寄存器(CSAR)、片選掩碼寄存器(CSMR)和片選控制寄存器(CSCR),對(duì)Nor-Flash的基地址、容量、位寬、是否有效等信息進(jìn)行配置。
初始化內(nèi)存:MCF54415的內(nèi)存配置過(guò)程比較復(fù)雜,配置過(guò)程中,需要特別注意的是內(nèi)存基地址、容量、行列數(shù)、bank數(shù)等關(guān)鍵信息。
4)存儲(chǔ)器校驗(yàn)
此階段主要是完成對(duì)保存在NorFlash中的各類代碼段和數(shù)據(jù)段進(jìn)行CRC校驗(yàn),確保下一步拷貝時(shí)使用的信息源頭的正確性。
5)拷貝
此階段主要分四個(gè)步驟:一是將LCF文件(Linker command files,鏈接命令文件)中定義的SDRAM代碼段拷貝內(nèi)存中,二是對(duì)除SDRAM代碼段外的內(nèi)存和除堆棧區(qū)外的SRAM,進(jìn)行測(cè)試,三是將SDRAM數(shù)據(jù)段、SRAM數(shù)據(jù)段、SRAM代碼段及中斷向量表拷貝到對(duì)應(yīng)區(qū)域,四是將SDRAM BSS段和SRAM BSS段強(qiáng)制清零。
6)使能CACHE和MMU
此階段主要是使能數(shù)據(jù)和指令CACHE,并根據(jù)實(shí)際需求,使能MMU,配置不同存儲(chǔ)空間的訪問屬性,如可讀、可寫、可執(zhí)行、是否有效等。
7)μC/OS-II系統(tǒng)加載
上述工作完成后,則進(jìn)入μC/OS-II系統(tǒng)的加載過(guò)程,如圖3所示。
圖3 μC/OS-II系統(tǒng)加載過(guò)程
μC/OS-II系統(tǒng)的加載和工作原理,不是本文重點(diǎn),略過(guò)不表。
μC/OS-II系統(tǒng)的移植具體過(guò)程,在參考資料[1]中的章節(jié)2.9中有詳細(xì)描述,本文不再贅述。針對(duì)本文中使用的板卡,在移植過(guò)程中需要特別注意的是:
1)編譯模式的選擇
開發(fā)IDE環(huán)境(Code Warrior)支持標(biāo)準(zhǔn)傳參模式和寄存器傳參模式,前者是默認(rèn)模式。在調(diào)用位置無(wú)關(guān)代碼的時(shí)候(最開始的純匯編階段),需要設(shè)置它的傳參類型為寄存器傳參。
2)任務(wù)切換上下文
μC/OS-II系統(tǒng)切換上下文時(shí),采用軟中斷TRAP#14。這與IDE創(chuàng)建Console RAM工程時(shí)默認(rèn)使用的虛擬串口控制臺(tái)軟中斷號(hào)相同。為了防止沖突,將它修改為TRAP#15。
3)μC/OS-II系統(tǒng)時(shí)鐘的配置
為了保證μC/OS-II系統(tǒng)時(shí)鐘的精度是1ms,必須根據(jù)CPU主頻,對(duì)系統(tǒng)時(shí)鐘使用定時(shí)器重新配置。
4)中斷向量表重定向
中斷向量表拷貝完成后,必須重新設(shè)置VBR,保證μC/OS-II系統(tǒng)啟動(dòng)后,使用到正確的中斷向量表。
使用IDE生成鏡像過(guò)程中,編譯器根據(jù)LCF文件定義的不同段來(lái)鏈接各目標(biāo)文件(*.o)。根據(jù)不同的存儲(chǔ)器件特性,設(shè)計(jì)了不同的段,如圖4所示。
圖4 鏈接分段示意圖
在系統(tǒng)中,NorFlash中分三個(gè)段,分別是:
vector_rom:對(duì)半為兩部分,共2KB,前半段用于保存啟動(dòng)引導(dǎo)階段的中斷向量表(第一張表),后半段用于保存μC/OS-II系統(tǒng)運(yùn)行階段的中斷向量表(第二張表);
ext_flash:保存位置無(wú)關(guān)代碼段、CRC校驗(yàn)碼、代碼段和數(shù)據(jù)段等;
ext_flash_debug:保存μC/OS-II系統(tǒng)運(yùn)行時(shí)的故障信息,在啟動(dòng)引導(dǎo)過(guò)程中,保留不用;
在DDR2 SDRAM中分為兩個(gè)段,分別是:ext_code_sdram:保存從NorFlash拷貝過(guò)來(lái)的SDRAM代碼段;ext_data_sdram:保存從NorFlash拷貝過(guò)來(lái)的SDRAM數(shù)據(jù)段和SDRAM BSS段等;
在SRAM中,分為三個(gè)段,分別是:
vector_sram:保存從vector_rom后半段拷貝過(guò)來(lái)的第二張中斷向量表;
user_sram:保存從NorFlash中拷貝過(guò)來(lái)的SRAM代碼段、SRAM數(shù)據(jù)段和SRAM BSS段,同時(shí)也可以保存故障日志;
stack_sram:在啟動(dòng)引導(dǎo)階段使用的堆??臻g,倒序使用。
根據(jù)上述分段配置,以ext_flash舉例,在LCF文件中可做如下定義:
MEMORY
{
ext_flash (RX) : ORIGIN = 0x00000000, LENGTH = 0x00FF0000 #16MB-64KB
}
SECTIONS
{
.ext_flash : {} > ext_flash
.crc : AT(___CRC_FLASH_START)
{
*(.CRC)
} >> ext_flash
}
.CRC表示CRC校驗(yàn)碼的全局變量存放區(qū),編譯器在鏈接時(shí)將把工程中定義為.CRC的變量都將鏈接到ext_flash段。
在本文中,存儲(chǔ)器件分為NorFlash、DDR2 SDRAM和SRAM三種。1)NorFlash校驗(yàn):
采用CRC校驗(yàn)方式,在線計(jì)算NorFlash中SDRAM代碼段、SDRAM數(shù)據(jù)段、SRAM代碼段和SRAM數(shù)據(jù)段的CRC校驗(yàn)碼,與保存在NorFlash的.CRC區(qū)域中的各個(gè)CRC全局變量值(.CRC區(qū)域中的校驗(yàn)碼都是離線生成并重新集成進(jìn)來(lái)的)比較。若相等,繼續(xù)執(zhí)行,否則記錄故障,進(jìn)入死循環(huán)停止啟動(dòng)。
其目的是檢查保存在NorFlash中的內(nèi)容,確保其在執(zhí)行或者拷貝時(shí),信息源頭不出錯(cuò)。當(dāng)啟動(dòng)引導(dǎo)過(guò)程中各個(gè)分段的CRC校驗(yàn)都通過(guò)后,可以進(jìn)行SDRAM代碼段拷貝。
2)DDR2 SDRAM測(cè)試和SRAM測(cè)試
采用Abraham算法進(jìn)行SDRAM數(shù)據(jù)段和SRAM數(shù)據(jù)段的全覆蓋測(cè)試。測(cè)試成功,所有地址清零,否則記錄故障,進(jìn)入死循環(huán)停止啟動(dòng)。
當(dāng)DDR2 SDRAM和SRAM測(cè)試通過(guò)后,可以進(jìn)行SDRAM數(shù)據(jù)段、SRAM代碼段、SRAM數(shù)據(jù)段和中斷向量表的拷貝。
在系統(tǒng)運(yùn)行過(guò)程中,不可避免的會(huì)進(jìn)入到異?;蛘咧袛酄顟B(tài)。MCF54415共用3個(gè)中斷控制器,支持256種中斷源(包括異常、軟中斷和可編程外設(shè)中斷)。在設(shè)計(jì)時(shí)使用雙中斷向量表機(jī)制,將啟動(dòng)引導(dǎo)過(guò)程與μC/OS-II系統(tǒng)運(yùn)行過(guò)程的中斷(異常)處理區(qū)分開,即啟動(dòng)引導(dǎo)階段使用第一張中斷向量表,完成引導(dǎo)過(guò)程成功加載μC/OS-II系統(tǒng)后,則使用第二張中斷向量表。這兩張表依次保存在NorFlash的開始位置,各占1KB空間。
當(dāng)啟動(dòng)引導(dǎo)階段發(fā)生異常后,直接定位到第一張表中的中斷向量,調(diào)用其處理函數(shù)。一般處理過(guò)程是點(diǎn)亮LED紅燈,記錄故障日志,并進(jìn)入死循環(huán)。當(dāng)μC/OS-II系統(tǒng)運(yùn)行階段發(fā)生異常后,則定位到已拷貝到SRAM中的第二張中斷向量表中,這時(shí)可以根據(jù)μC/OS-II系統(tǒng)的不同需求,對(duì)各個(gè)異常進(jìn)行處理。
在系統(tǒng)的啟動(dòng)引導(dǎo)階段,出現(xiàn)異?;蛘叱绦蜻\(yùn)行返回值錯(cuò)誤時(shí),一般的處理過(guò)程都是進(jìn)入死循環(huán),這對(duì)于系統(tǒng)調(diào)試非常不便,因此在設(shè)計(jì)時(shí),在SRAM中的sram_user段中單獨(dú)開辟了一片區(qū)域,專門保存上次運(yùn)行時(shí),出錯(cuò)的具體位置、相關(guān)變量值等關(guān)鍵信息。當(dāng)系統(tǒng)熱啟動(dòng)時(shí),先判斷上次啟動(dòng)是否有異常,如果有異常,就通過(guò)調(diào)試串口,將錯(cuò)誤日志打印出來(lái)。
本文中介紹的基于MCF54415的μC/OS-II系統(tǒng)啟動(dòng)引導(dǎo)程序,在實(shí)現(xiàn)一般的啟動(dòng)引導(dǎo)功能基礎(chǔ)上,特別設(shè)計(jì)了提高可靠性的幾種方法,如通過(guò)CRC對(duì)NorFlash信息進(jìn)行校驗(yàn)、通過(guò)Abraham算法對(duì)SDRAM和SRAM進(jìn)行測(cè)試,采用雙中斷向量表機(jī)制分離啟動(dòng)引導(dǎo)過(guò)程和μC/OS-II系統(tǒng)運(yùn)行過(guò)程的異常處理,在啟動(dòng)引導(dǎo)階段發(fā)生異常和故障時(shí),記錄故障日志等,極大的提高了系統(tǒng)啟動(dòng)引導(dǎo)階段的可靠性,同時(shí)也降低了故障分析的難度。這些方法已在鐵路信號(hào)系統(tǒng)中已得到了廣泛引用,并起到了良好的效果。
[1]諶利等編著.深入淺出COLDFire系列32位嵌入式微處理器[M].北京航空航天大學(xué)出版社,2009,10.
[2]NXP(恩智浦半導(dǎo)體).MCF5441X Reference Manual,Rev.3.2010,9.
[3]NXP(恩智浦半導(dǎo)體).MCF5441x ColdFire Microprocessor Data Sheet,Rev.8.2012,6.
[4]NXP(恩智浦半導(dǎo)體).ColdFire Family Programmer’s Reference Manual,Rev.3.2005,3.
宋志堅(jiān)(1982-),男,碩士研究生,工程師,現(xiàn)供職于卡斯柯信號(hào)有限公司,從事嵌入式系統(tǒng)驅(qū)動(dòng)開發(fā)方向。
耿進(jìn)龍(1982-),男,碩士研究生,工程師,現(xiàn)供職于卡斯柯信號(hào)有限公司,從事系統(tǒng)安全設(shè)計(jì)方向。
宋興儒(1988-),男,碩士研究生,工程師,現(xiàn)供職于卡斯柯信號(hào)有限公司,從事嵌入式系統(tǒng)軟件開發(fā)方向。
劉暢(1979-),男,碩士研究生,工程師,現(xiàn)供職于卡斯柯信號(hào)有限公司,從事硬件電路開發(fā)方向。
潘雷(1976-),男,碩士研究生,高級(jí)工程師,現(xiàn)供職于卡斯柯信號(hào)有限公司,從事硬件電路開發(fā)和管理方向。