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