??? 摘 要: 以VxWorks嵌入式實時操作系統(tǒng)為例,介紹了改進啟動代碼(Bootrom)功能的四點經(jīng)驗:(1)具備故障保護功能的Bootrom的自我在線更新,;(2)增加重啟" title="重啟">重啟功能,;(3)自動運行應用軟件" title="應用軟件">應用軟件;(4)多種應用軟件的選擇,。
??? 關(guān)鍵詞: Bootrom? 嵌入式實時操作系統(tǒng)? FTP
?
??? VxWorks 是美國 Wind River System 公司于1983年設計開發(fā)的一個運行在目標機上的高性能,、可裁減的嵌入式實時操作系統(tǒng)(RTOS),。它是一種功能強大而且比較復雜的操作系統(tǒng),包括了進程管理,、存儲管理,、設備管理、文件系統(tǒng)管理,、網(wǎng)絡協(xié)議及系統(tǒng)應用等幾部分,。VxWorks為程序員提供了高效的實時多任務調(diào)度、中斷管理,、實時的系統(tǒng)資源以及實時的任務間通信,。其核心功能主要有微內(nèi)核、任務間通信機制,、網(wǎng)絡支持,、文件系統(tǒng)和I/O管理、POSIX標準實時擴展以及C++等其他標準支持,。在各種CPU平臺上提供了統(tǒng)一的編程接口和一致的運行特性,,盡可能地屏蔽不同CPU 之間的底層差異。應用程序" title="應用程序">應用程序員可以將盡可能多的精力放在應用程序本身,,而不必關(guān)心系統(tǒng)資源的管理,。VxWorks以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事,、航空,、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域中,如衛(wèi)星通信,、彈道制導,、飛機導航等。
??? 設計師通常利用VxWorks開發(fā)Bootrom代碼,。Bootrom相當于PC機中的BIOS,,它完成對加載過程中所需設備的初始化及驅(qū)動;然后,,通過某種可選擇的通信手段(如網(wǎng)口,、串口),將VxWorks內(nèi)核加載,。VxWorks內(nèi)核相當于PC機上的操作系統(tǒng),,如Linux、Windows,。此外,,Bootrom還提供了一些輔助功能,如地址內(nèi)容查看、地址內(nèi)容修改和Bootrom菜單顯示信息控制等功能,。但是,,在實際應用" title="實際應用">實際應用中,這些功能不夠豐富,,便利性不足,。本文介紹了幾點筆者在工作中行之有效的改進Bootrom功能的經(jīng)驗。
1 具備故障保護功能的Bootrom的自我在線更新
??? Bootrom一般以二進制文件的方式保存在非易失性存儲介質(zhì),,例如Flash,、CF卡、EPROM中,。通常需要仿真器,、燒結(jié)器或JTAG工具等才能將代碼燒入這類介質(zhì),在實際應用中非常不便,。以Flash為例介紹如何在線更新Bootrom。
??? 首先,,為了做到故障保護,,防止在更新過程中發(fā)生更新文件出錯、斷電等災難性故障,,Bootrom的數(shù)據(jù)必須在更新之前備份在Flash的另一區(qū)域,。因此,F(xiàn)lash中必須存在兩片物理區(qū)域,,暫且命名為PA和PB,,每片512KB(假設Bootrom文件小于512KB)。兩片物理區(qū)域的起始地址可以互換,,其中一片區(qū)域的起始地址必須為系統(tǒng)的上電啟動地址,,這個地址因處理器而異,例如,, PowerPC體系結(jié)構(gòu)的處理器的啟動地址一般是0xfff00100,,而MIPS體系結(jié)構(gòu)的處理器的啟動地址是0xbfc00000。在邏輯上,,以啟動地址開始的區(qū)域為主Boot區(qū),,另一片區(qū)域為備Boot區(qū)。
??? 為了實現(xiàn)地址互換,,在CPU模塊和Flash芯片之間,,增加了一片CPLD(可編程邏輯器件)和一個跳線或撥號開關(guān),開關(guān)信號JP輸入到CPLD,。CPU訪問Flash的地址信號和片選信號經(jīng)過CPLD進行地址互換,,再到Flash芯片。如果不跳線(默認情況),JP信號為高,,則PA的起始地址為啟動地址,,PA為主Boot區(qū),PB為備Boot區(qū),;否則,,JP信號為低,PB的起始地址為啟動地址,,PB為主Boot區(qū),,PA為備Boot區(qū)。默認情況下,,PA為主Boot區(qū),。如圖1。
?
?? 如果系統(tǒng)中有兩片F(xiàn)lash芯片,,可以不用CPLD,,選用另一種地址互換方式,如圖2,。兩個二選一邏輯實現(xiàn)兩片F(xiàn)lash片選信號(CS)的互換,,從而實現(xiàn)了地址的互換。
?
??? 地址互換機制屏蔽了PA和PB實際物理位置的差別,,給底層軟件提供了一個統(tǒng)一的接口,,帶來的好處不言而喻。Bootrom數(shù)據(jù)總是從主Boot區(qū)備份到備Boot區(qū),,系統(tǒng)總是從主Boot區(qū)啟動,。
??? 其次,編寫Flash擦寫驅(qū)動函數(shù),。Flash是一種讀寫非對稱器件,,讀數(shù)據(jù)與普通器件一樣,比較簡單,;而寫必須根據(jù)芯片廠商提供的算法,,先擦除欲寫入數(shù)據(jù)的區(qū)域,以扇區(qū)(Sector)為單位,,然后寫入數(shù)據(jù),。函數(shù)flashUpdate(char *sourceAddr, char *destAddr, int Length)集成了擦除和寫入兩個步驟。
??? 再次,,在文件bootConfig.c的Bootrom命令操作接口函數(shù)bootCmdLoop()中增加新命令“u”(update的縮寫),。
??? switch (*(pLine++)){
??? ……
????? ?case ‘u’:??/* 更新Bootrom */
??????????? ?……???/* 下載更新代碼并更新 */
???????break;
??? ……
??? }
??? “u”命令的實現(xiàn)流程如圖3。除了flashUpdate()之外,,其它函數(shù)都由VxWorks本身提供,。如果更新失敗,則改變JP設置,從備份Bootrom啟動,,再次更新Bootrom或運行應用軟件,。
?
2 增加重啟功能
??? VxWorks的Bootrom用戶命令缺少重啟功能,給調(diào)試和實際應用帶來諸多不便,。與Bootrom在線更新方法相同,,增加這項功能其實并不難,只要在函數(shù)bootCmdLoop()中增加新命令“r”(reset的縮寫),,在命令中調(diào)用系統(tǒng)重啟函數(shù)sysReboot()即可,。sysReboot()由設計師根據(jù)系統(tǒng)的不同自行編寫。
??? switch (*(pLine++)){
??? ……
????? ??case ‘r’:?????/* 重啟系統(tǒng) */
?????????? ???sysReboot();
????? ??break;
??? ……
??? }
??? 舉一反三,,還可以根據(jù)需要在Bootrom中增加許多自己的命令,。完成之后,不要忘了在Bootrom命令解釋函數(shù)bootHelp()中添加新增命令的用途,、用法等幫助信息,。
3 自動運行應用軟件
??? 在實際應用中,一般將上層軟件和VxWorks映象" title="映象">映象鏈接在一起,,暫且稱之為應用程序,。默認情況下,當Bootrom運行后,,它會倒計時7s,然后從啟動參數(shù)(BOOT_LINE)指定的路徑下載應用程序,。但是,,因為Bootrom提供了啟動參數(shù)修改命令,啟動參數(shù)可能由于某些原因發(fā)生更改,。例如調(diào)試時需要從FTP服務器下載,,或者疏忽好奇等,給下次應用帶來不少麻煩,,很可能出現(xiàn)應用程序下載失敗等故障,。
??? 為了保證自動啟動總是從固定路徑下載應用程序,而不受啟動參數(shù)的影響,,需要修改文件bootConfig.c中的自動啟動函數(shù)autoboot(),。例如,自動啟動總是從CF卡讀取應用程序,。
??? if (bytesRead == 0) {??/*倒計時期間沒有輸入 */
????? ??LoadApplicationImage();?/*復制應用程序映象到起始地址為Entry的內(nèi)存中 */
????? ??go ((FUNCPTR ) Entry); /*從Entry地址開始運行 */
??? }
??? else{
????? ??……
??? }
??? Entry是應用程序的入口地址,,VxWorks系統(tǒng)中該值是RAM_LOW_ADRS。LoadApplicationImage()函數(shù)將應用程序映象從CF卡復制到起始地址為Entry的內(nèi)存中,,然后將PC指針指向該地址,,啟動系統(tǒng)。如果在倒計時期間有字符輸入,則進入Bootrom的命令界面,,用戶可以修改啟動參數(shù),,然后按“@”從啟動參數(shù)指定的路徑下載程序,而不影響調(diào)試,,但是更改后的啟動參數(shù)不會影響下次自動啟動的下載路徑,。
4 多種應用軟件的選擇
??? 在通信領(lǐng)域,許多產(chǎn)品的硬件平臺其實相同,,區(qū)別在于應用軟件,。不同的軟件塑造出了一個個特色鮮明的產(chǎn)品。如果能夠?qū)⒉煌能浖傻揭粋€硬件平臺上,,由用戶在啟動時選擇,,那么這個產(chǎn)品就擁有一機多能的特性,大大增強了產(chǎn)品的市場競爭力,。
??? 退而言之,,即使硬件平臺只適合于一種應用軟件,將故障檢測程序作為另一種應用軟件,,會帶給產(chǎn)品測試和現(xiàn)場維修人員諸多的方便,。
??? 參考以上三點經(jīng)驗,在Bootrom中增加這項功能并非難事,。以兩個應用軟件為例,,在函數(shù)bootCmdLoop()中增加新命令“o”(other的縮寫),如下所示,。
??? switch (*(pLine++)){
??? ……
????? ??case 'o':????? /*啟動另一應用軟件*/
?????????? ???LoadAnotherApplicationImage();?? /*復制另一應用程序映象到起始地址為Entry的內(nèi)存中*/
?????????? ???AutoSystemVersionSet(); ? /*詢問用戶是否將另一應用軟件設置為默認啟動*/
?????????? ???go ((FUNCPTR ) Entry ); /*從Entry地址開始運行*/
????? ??break;
??? ……
??? }
??? 在Bootrom代碼中定義一個變量defaultVersion,,用于記錄誰是默認的啟動軟件,該變量保存在Flash等非易失媒質(zhì)中,。上電后,,如果在倒計時期間沒有任何輸入,系統(tǒng)自動啟動defaultVersion指定的應用軟件,;否則,,用戶進入命令界面。如果鍵入“o”命令,,Bootrom調(diào)用函數(shù)LoadAnotherApplicationImage()將另一應用程序映象復制到起始地址為Entry的內(nèi)存區(qū)域,,然后詢問用戶是否希望將另一應用程序設置為默認啟動;如果用戶回答“是”,,更改defaultVersion值,;否則,defaultVersion值不變,。最后運行當前選定的應用軟件,。
??? 上述的幾點經(jīng)驗大部分是修改文件bootConfig.c的代碼,。因為bootConfig.c是一個公用文件,為了不影響其它底層軟件的開發(fā),,建議將它復制到當前Bootrom開發(fā)目錄下,,并且在Makefile文件中增加定義:BOOTCONFIG=bootConfig.c。
??? 嵌入式系統(tǒng)開發(fā)需要經(jīng)常開辟新的思路,,一些微小的簡單改動通常能夠帶給產(chǎn)品新的功能和特征,。啟動代碼是嵌入式系統(tǒng)的重要組成部分。筆者的以上四點經(jīng)驗在PowerPC處理器(MPC8260)平臺和MIPS處理器(RM7000A)平臺上得到了驗證,,希望對其它系統(tǒng)的啟動代碼的開發(fā)有所借鑒和啟迪,。
參考文獻
1 Windriver Inc. VxWorks BSP Developer's Guide, 2002
2 Windriver Inc. VxWorks Programmer's Guide, 2002