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