摘要:以VxWorks嵌入式實時操作系統為例,介紹了改進啟動代碼(Bootrom)功能的四點經驗:(1)具備故障保護功能的Bootrom的自我在線更新;(2)增加重啟功能;(3)自動運行應用軟件;(4)多種應用軟件的選擇。
VxWorks是美國WindRiver System公司于1983年設計開發后個運行在目標機上的高性能、可裁減的嵌入式實時操作系統(RTOS)。它是一種功能強大而且比較復雜的操作系統,包括了進程管理、存儲管理、設備管理、文件系統管理、網絡協議及系統應用等幾部分。VxWorks為程序員提供了高效的實時多任務調度、中斷管理、實時的系統資源以及實時的任務間通信。其核心功能主要有微內核、任務間通信機制、網絡支持、文件系統和I/O管理、POSIX標準實時擴展以及C++等其他標準支持。在各種CPU平臺上提供了統一的編程接口和一致的運行特性,盡可能地屏蔽不同CPU之間的底層差異。應用程序員可以將盡可能多的精力放在應用程序本身,而不必關心系統資源的管理。VxWorks以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精類技術及實時要求極高的領域中,如衛星通信、彈道制導、飛機導航等。
設計師通常利用VxWorks開發Bootrom代碼。Bootrom相當于PC機中的BIOS,它完成對加載過程中所需設備的初始化及驅動;然后,通過某種可選擇的通信手段(如網口、串口),將VxWorks內核加載。VxWorks內核相關于PC機上的操作系統,如Linux、Windows。此外,Bootrom還提供了一些輔助功能,如地址內容查看、地址內容修改和Bootrom菜單顯示信息控制等功能。但是,在實際應用中,這些功能不夠豐富,便利性不足。本文介紹了幾點筆者在工作中行之有效的改進Bootrom功能的經驗。
1 具備故障保護功能的Bootrom的自我在線更新
Bootrom一般以二進制文件的方式保存在非易失懷存儲介質,例如Flash、CF卡、EPROM中。通常需要仿無休止器、燒結器或JTAG工具等才能將代碼燒入這類介質,在實際應用中非常不便。以Flash為例介紹如何在線更新Bootrom。
首先,為了做到故障保護,防止在更新過程中發生更新文件出錯、斷電等災難性故障,Bootrom的數據必須在更新之前備份在Flash的另一區域。因此,Flash中必須存在兩片物理區域,暫且命名為PA和PB,每片512KB(假設Bootrom文件小于512KB)。兩片物理區域的起始地址可以互換,其中一片區域的起始地址必須為系統的上電啟動地址,這個地址因處理器而異,例如,PowerPC體系結構的處理器的啟動地址一般是0xfff00100,而MIPS體系結構的處理器的啟動地址是0xbfc00000。在邏輯上,以啟動地址開始的區域為主Boot區,另一片區域為備Boot區。
為了實現地址互聯換,在CPU模塊和Flash芯片之間,增加了一片CPLD(可編程邏輯器件)和一個跳線或撥號開關,開關信號JP輸入到CPLD。CPU訪問Flash的地址信號和片選信號經過CPLD進行地址互換,再到Flash芯片。如果不跳線(默認情況),JP信號為高,則PA的起始地址為啟動地址,PA為主Boot區,PB為備Boot區;否則,JP信號為低,PB的起始地址為啟動地址,PB為主Boot區,PA為備Boot區。默認情況下,PA為主Boot區。如圖1。
如果系統中有兩片Flash芯片,可以不用CPLD,選用另一種地址互換方式,如圖2。兩個二選一邏輯實現兩片Flash片選信號(CS)的互換,從而實現了地址的互換。
地址互換機制屏蔽了PA和PB實際物理位置的差別,給底層軟件提供了一個統一的接口,帶來的好處不言而喻。Bootrom數據總線是從主Boot區備份到備Boot區,系統總是從主Boot區啟動。
其次,編寫Flash擦寫驅動函數。Flash是一種讀寫非對稱器件,讀數據與普通器件一樣,比較簡單;而寫必須根據芯片廠商提供的算法,先擦除欲寫入數據的區域,以扇區(Sector)為單位,然后寫入數據。函數flashUpdate(char *sourceAddr,char *destAddr,int Length)集成了擦除和寫入兩個步驟。
再次,在文件bootConfig.cr Bootrom操作接口函數bootCmdLoop()中增加新命令“u”(update的編寫)。
switch(*(pLine++)){
……
case 'u'; /*更新Bootrom*/
…… /*下載更新代碼并更新*/
break;
……
}
“u”命令的實現流程如圖3。除了flashUpdate()之外,其它函數都由VxWorks本身提供。如果更新挫敗,則改變JP設置,從備份Bootrom啟動,再次更新Bootrom或運行應用軟件。
2 增加重啟功能
VxWorks的Bootrom用戶命令缺少重啟功能,給調試和實際應用帶來諸多不便。與Bootrom在線更新方法相同,增加這項功能其實并不難,只要在函數bootCmdLoop()中增加新命令“r”(reset的縮寫),在命令中調用系統重啟函數sysReboot()即可。SysReboot()由設計師根據系統的不同自行編寫。
Switch(*(pLine++)){
……
case 'r'; /*重啟系統*/
sysReboot();
break;
……
}
舉一反三,還可以根據需要在Bootrom中增加許多自己的命令。完成之后,不要忘了在Bootrom命令解釋函數bootHelp()中添加新增命令的用途、用法等幫助信息。
3 自動運行應用軟件
在實際應用中,一般將上層軟件和VxWorks映象鏈接在一起,暫且稱之為應用程序。默認情況下,當Bootrom運行后,它會倒計時7s,然后從啟動參數(BOOT_LINE)指定的路徑下載應用程序。但是,因為Bootrom提供了啟動參數修改命令,啟動參數可能由于某些原因發生更改。例如調試時需要從FTP服務器下載,或者疏忽好奇等,給下次應用帶來不少麻煩,很可能出現應用程序下載挫敗等故障。
為了保證自動啟動總是從固定路徑下載應用程序,而不受啟動參數的影響,需要修改文件bootConfig.c中的自動啟動函數autoboot()。例如,自動啟動總是從CF卡讀取應用程序。
if(bytesRead ==0){ /*倒計時期間沒有輸入*/
LoadApplicationImage();/*復制應用程序映象到起始地址為Entry的內存中*/
go((FUNCPTR)ENTRY;/*從Entry地址開始運行*/
}
else{
……
}
Entry是應用程序的入口地址,VxWorks系統中該值是RAM_LOW_ADRS。LoadApplicationImage()函數將應用程序映旬從CF卡復制到起始地址為Entry的內存中,然后將PC指針指向該地址,啟動系統。如果在倒計時期間有字符輸入,則進入Bootrom的命令界面,用戶可以修改啟動參數,然后按“@”從啟動參數指定的路徑下載程序,而不影響調試,但是更改后的參數不會影響下次自動啟動的下載路徑。
4 多種應用軟件的選擇
在通信領域,許多產品的硬件平臺其實相同,區別在于應用軟件。不同的軟件塑造出了一個個特色鮮明的產品。如果能夠將不同的軟件集成到一個硬件平臺上,由用戶在啟動時選擇,那么這個產品就擁有一機多能的特性,大大增強了產品的市場競爭力。
退而言之,即使硬件平臺只適合于一種應用軟件,將故障檢測程序作為另一種應用軟件,會帶給產品測試和現場維修人員諸多的方便。
參考以上三點經驗,在Bootrom中增加這項功能并非難事。以兩個應用軟件為例,在函數bootCmdLoop()中增加新命令“o”(other的編寫),如下所示。
switch(*(pLine++)){
……
case 'o': /*啟動另一應用軟件*/
LoadAnoterApplicationImage();/*復制另一應用程序映象到起始地址為Entry的內存中*/
AutoSystemVersionSet();/*詢問用戶是否將另一應用軟件設置為默認啟動*/
go((FUNCPTR)Entry);/*從Entry地址開始運行*/
break;
……
}
圖3
在Bootrom代碼中定義一個變量defaultVersion,用于記錄誰是默認的啟動軟件,該變量保存在Flash等非易失媒質中。上電后,如果在倒計暑期間沒有任何輸入,系統自動啟動defaultVersion指定的應用軟件;否則,用戶進入命令界面。如果鍵入“o”命令,Bootrom調用函數LoadAnotherApplicationImage()將另一應用程序映象復制到起始地址為Entry的內存區域,然后詢問用戶是否希望將另一應用程序設置為默認啟動;如果用戶回答“是”,更改defaultVersion值;否則,defaultVersion值不變。最后運行當前選定的應用軟件。
上述的幾點經驗大部分是修改文件bootConfig.c的代碼。因為bootConfig.c是一個公用文件,為了不影響其它底層軟件的開發,建議將它復制到當前Bootrom開發目錄下,并且在Makefile文件中增加定義:BOOTCONFIG=bootConfig.c。
嵌入式系統開發需要經常開辟新的思路,一些微小的簡單改動通常能夠帶給產品新的功能和特征。啟動代碼是嵌入式系統的重要組成部分。筆者的以上四點經驗在PowerPC處理器(MPC8260)平臺和MIPS處理器(RM7000A)平臺上得到了驗證,希望對其它系統的啟動代碼的開發有所借鑒和啟迪。
- Boot(37582)
- 進經驗談(6761)
protel的柵格經驗談
5384ARM嵌入式軟件編程經驗談
FPGA 牛人經驗談
FPGA幾個入門資料
FPGA牛人經驗談
PCB設計經驗談
Protel 99 PCB設計經驗談
TI電子書免費下載——《電源設計經驗談》
[下載]超強PCB布線設計經驗談附原理圖(1-6章)
[下載]超強PCB布線設計經驗談附原理圖(1-6章)
[資料分享]+Android軟件安全審計及漏洞修復經驗談
fpga經驗談
fpga經驗談(西安大唐電信)
fpga經驗談分享
pcb設計經驗談
【下載】《電源設計經驗談》-----TI工程師
如何學好FPGA(大師經驗談)絕對經典!
工程師經驗分享:PCB布線經驗談zz
服務器選型經驗談
維修經驗談,軟驅故障巧解決
藍牙模塊:選擇經驗談
請問可以改BOOTROM里的bootloader程序嗎
超強PCB布線設計經驗談附原理圖
超強PCB布線設計經驗談附原理圖(3)
超強PCB布線設計經驗談附原理圖(4)
超強PCB布線設計經驗談附原理圖(5)
超強PCB布線設計經驗談附原理圖(6)
Protel 99 PCB設計經驗談
0基于VxWorks的bootrom代碼改進
25pcb布局經驗談
421PCB布線設計經驗談附原理圖(第二章)
837
PCB布線設計經驗談附原理圖(第三章)
2325
PCB布線設計經驗談附原理圖(第五章)
2306
PCB布線設計經驗談附原理圖(第六章)
1234
pcb layout設計經驗談
3688局域網測試及故障排除經驗談——傳統而經典的技術
498這個冬天看電影吧!HTPC配置選擇經驗談
1353充分利用 FTP分類賬戶設置經驗談
642去鉆污生產經驗
1367PLC使用經驗談
39FPGA設計經驗談
5fpga高手經驗談
16FPGA設計經驗談
8電源設計經驗談-合集
8fpga經驗談(華為)
0FIFO經驗談
27VxWorks的bootrom代碼改進解析
3Wi-Fi產品射頻電路調試經驗談
886
焊接工藝技巧與電烙鐵使用經驗談,Welding skills
2073硬件設計經驗談
55950條電源設計的經驗詳細說明
13老工程師經驗談,高速運算放大器電路PCB布線資料下載
22超強PCB布局經驗談
625
電子發燒友App








評論