天天看點

ROM監控器RedBoot

 開放源代碼ROM監控器RedBoot的功能特點以及配置方法,它可以提供一種下載下傳調試環境,且體積非常小巧。RedBoot也稱作紅帽(Red Hat)嵌入式調試引導程式,是一種用于嵌入式系統的獨立開放源代碼引導/裝載器,任何人都可以從網際網路上下載下傳具有紅帽eCos公共許可證的RedBoot源代碼。雖然RedBoot使用的是源于eCos實時作業系統(RTOS)的軟體子產品,并且常用于嵌入式Linux系統,但它與這兩種作業系統完全無關,RedBoot能夠用于任何作業系統或RTOS,甚至沒有作業系統也行。

       RedBoot自帶一個GDB“存根程序(stub)”,可提供目标端通信軟體,允許使用者通過标準GDB協定指令進行遠端調試,這樣設計師就能利用RedBoot與運作GNU調試器的主機通過序列槽或網絡連接配接起來調試設計的嵌入式軟體。RedBoot支援多種處理器架構和硬

件平台,包括ARM、日立SHx、MIPS、PowerPC、SPARC以及x86等。

       結構配置

       RedBoot可以在多種不同配置下運作,但一般都是從目标平台的閃存引導區或引導ROM啟動。RedBoot設計為系統上電啟動,能提供完整的處理器初始化和裝置設定,使設計人員能夠迅速開始與系統通信。

       RedBoot可設為用序列槽或以太網口(通過Telnet)進行通信,當從某個端口收到第一條指令後,那麼随後所有的RedBoot通信都将從那個端口進行,直到系統重新啟動。

       利用以太網口與RedBoot通信時,一定要清楚目标平台是如何得到其IP位址的。設定目标平台IP位址有兩種方法,分别是動态法和靜态法。在靜态方式下,目标平台的IP位址在編譯RedBoot映像前設定(後文還會詳細讨論這方面内容),也可通過序列槽指令設定。

       RedBoot還可以采用BOOTP協定動态配置設定IP位址,BOOTP協定是目前許多網絡廣泛支援的動态主機配置協定(DHCP)的一個子集,與靜态法一樣,可在編譯時或通過序列槽指令,使目标平台使用動态網絡配置。當然,為了取得IP位址,目标裝置必須連到能夠通路BOOTP或DHCP伺服器的網絡上。

       當裝載的應用軟體本身需要IP位址時,切記RedBoot映像不能使用動态IP位址,否則會在以太網端口的IP位址配置中引起沖突,進而造成與RedBoot或應用軟體通信錯誤。在這種情況下,最好給不在動态網絡配置協定範圍内的RedBoot設定靜态IP位址。

       RedBoot還能根據與BOOTP響應一起收到的配置資訊,用一般檔案傳輸協定(TFTP)自動下載下傳應用軟體代碼,此時在主機上同樣需要TFTP伺服器以提供軟體映像通路。

       指令行語句

       RedBoot通過指令行接口(CLI)輸入指令,在最小模式下,RedBoot指令行接口建立在目标平台硬體序列槽上,當有多個序列槽時,RedBoot可以用其中任何一個建立通信。RedBoot還能利用Telnet協定在以太網端口建立CLI(預設情況下RedBoot将端口9000用于Telnet,不過可以用下面講到的fconfig指令改變端口号)。

       CLI輸出的RedBoot初始化資訊如圖1所示,這些資訊提供了有關RedBoot映像的資訊,包括映像建立日期、目标硬體平台以及可供RedBoot使用的資源等。當顯示出提示符:RedBoot> 後,就表明CLI已經準備好,使用者可以開始輸入指令。

ROM監控器RedBoot

圖1CLI輸出的RedBoot初始化資訊

       RedBoot指令的基本格式是:

       指令 [-選項1] [-選項2 參數值] 操作符

       指令格式中的選項1和選項2代表可以加到某些指令中的可選參數,用于訓示一些特定動作或附加資訊,在選項2中還包括一個數值。操作符定義了某些特殊指令所需的附加資訊。指令也可以縮寫成最短的無歧義字元串,如dump、dum、du和d都是dump指令的有效寫法。

       RedBoot用load指令下載下傳應用軟體映像,映像可以用TFTP協定、X/Y數據機協定或直接從目标硬體下載下傳。映像成功下載下傳到目标平台後,就可以用go指令運作軟體。

       在RedBoot提示符下可鍵入help指令顯示所有可用指令清單,并不是所有指令都能用于各種RedBoot映像,指令是否可用取決于目标平台的資源狀況,例如有些指令就不适合用于沒有閃存的硬體平台。

       首字元是“$”的指令代表執行後會在RedBoot映像中調用GDB stub,一旦進入GDB模式,RedBoot就會一直保持這種模式直到系統重新啟動。

       有幾條RedBoot指令需要在這裡重點提一下。首先是閃存映像系統(fis)指令,當硬體平台上配有閃存時,RedBoot提供fis指令作為基本檔案系統,這些指令主要用來管理檔案系統映像。

       另一個有用的指令是基于閃存的配置和控制指令fconfig。圖2給出了用fconfig指令查詢的輸出資訊,從中可以看出,配置指令可以設定RedBoot啟動順序。啟動配置包括是否在初始化期間運作引導腳本、是否用BOOTP協定擷取IP位址以及是否用GDB telnet端口進行調試等。  

ROM監控器RedBoot

圖2 用fconfig指令查詢

       RedBoot也支援引導腳本,是以允許使用者在上電過程完成後執行所需指令。在産品測試階段采用RedBoot裝載應用軟體映像時引導腳本很有好處,使用者還可以設定逾時參數,在引導腳本執行前按下Ctrl+C中斷執行。引導腳本可用fconfig指令進行設定。

       建構RedBoot 

       能夠自己重新建構RedBoot對使用者來說非常重要,因為随時都可能需要進行代碼更新和缺陷更正;如果使用者希望定制RedBoot,那麼也需要重建RedBoot,比如增加自己的指令或與它的接口。  

     重建RedBoot映像的第一步是建立主機開發環境,建立RedBoot映像的工具要能運作在Windows或Linux主機平台上。主機開發工具包括GNU二進制應用程式(常稱為binutils)、C/C++編譯器和調試器。安裝完GNU工具後,接着就是确定配置工具,使用者可以采用圖形化配置工具或指令行工具配置建立RedBoot映像。本文重點講述圖形化配置工具。

       配置工具允許進行源代碼級設定,進而確定RedBoot映像是專為各個使用者應用而開發的,整個源代碼知識庫和配置工具用元件定義語言(CDL)描述庫中的元件及建立軟體映像規則。配置工具利用先前設立的GNU工具建立适合特定處理器結構的RedBoot映像,有關配置工具的更多資訊可以從網上得到,也可以從幫助菜單中獲得。

       下面的例子使用的是configtool-2.08-setup.exe,它是目前最新版配置工具,在安裝之前最好閱讀一下readme.txt檔案,一起下載下傳的changes.txt檔案則列出了不同版本的變動情況。接下來就是下載下傳RedBoot源代碼,RedBoot源代碼包含在匿名CVS庫中,可以用免費的客戶軟體通路。連上庫以後,最好将包括eCos檔案在内的所有源代碼都下載下傳,因為RedBoot會使用裝置驅動器之類的eCos源檔案。在确定建立自己RedBoot映像所需所有檔案後,可以删掉其它不必要檔案。RedBoot軟體結構主要軟體子產品方框圖如圖3所示。 

ROM監控器RedBoot

圖3 主要軟體子產品方框圖

       RedBoot軟體結構采用分層方法,這樣可以裝入新的功能和軟體元件,RedBoot的基礎是eCos硬體抽象層(HAL)和裝置驅動器。

       讓我們看一下RedBoot的源代碼目錄結構。從匿名CVS庫中下載下傳的源代碼檔案都放在packages子目錄下,這個主目錄下面是redboot子目錄,裡面存放全部RedBoot檔案。由于所有檔案都是從匿名CVS庫下載下傳的,是以都位于current子目錄下。在redboot子目錄下有個名為ChangeLog的檔案,它記錄了RedBoot源檔案的所有修改情況。

       配置工具能夠非常友善地用圖形化方式配置RedBoot映像建立所必需的元件,通過選中或不選中某個特定元件選擇框,可以激活或去除相應的配置選項,設定值可在視窗右邊的方格中加入。

       建立新RedBoot配置有兩種方法。第一種方法是在配置工具的Build菜單下選擇模闆,這時會彈出模闆對話框,然後從中選擇硬體平台和模闆資料包,這裡我們的模闆資料包選擇redboot。這種方法為建立預設配置RedBoot映像提供了一個基本方式,選擇菜單Build->Packages,在彈出的Packages對話框中可以添加或删除其它資料包。

       第二種建立RedBoot新配置的方法是導入eCos最小配置檔案(.ecm)。RedBoot支援的每個硬體平台都包含這樣的最小配置檔案,這些配置檔案一般位于硬體抽象層目錄hal下對應于每個結構的misc子目錄中。

       最小配置檔案包含特定硬體平台基本配置資訊,将.ecm檔案作為出發點,我們就有了作為基礎的硬體平台工作配置檔案,可改變配置選項支援RedBoot映像所需要的任何修改。 

       最小配置檔案同樣使用CDL。圖4是一個eCos最小配置檔案執行個體,源自RedBoot_ROM.ecm檔案,适合那些采用PowerPC的Motorola MBX開發闆。從圖中可以看到,.ecm檔案列出了cdl_configuration指令的資料包清單,需要包含在RedBoot配置中。cdl_option指令用來為特定選項設定選項值。

ROM監控器RedBoot

 圖4 eCos最小配置檔案執行個體

       大多數支援平台都包含一個可以導入的ROM和RAM RedBoot.ecm檔案作為配置起點,ROM和RAM表明RedBoot映像在目标硬體上的存放位置。一般情況下,RAM配置在最初調試硬體時使用,而ROM配置則在映像調試完成後準備存放進閃存時使用。RAM映像還可用于更新駐留閃存的RedBoot映像。i386 PC目标平台還包含了一個RedBoot FLOPPY配置檔案,可供軟碟啟動RedBoot時使用。

       為了導入最小配置檔案,需要選擇配置工具菜單中的File->Import指令,然後浏覽相應的.ecm檔案并選中,配置工具利用.ecm檔案裝載相應資料包并設定對應選項。如果發生因配置選項設定引起的沖突,配置工具會顯示一個沖突解決對話框,選擇繼續按鈕就可解決該沖突。

       由于RedBoot還依賴其它軟體子產品如HAL,是以并不是所有的配置選項都包含在RedBoot ROM監控資料包内。在eCos HAL包中就有底層硬體配置選項,其它可能需要配置的資料包還有裝置驅動器,例如在包括網絡支援的平台上,以太網裝置驅動器選項就包含在通用以太網支援包内。

       如果想要網絡通信,還需要建立RedBoot網絡配置選項,這樣可以設定目标硬體的預設IP位址,或BOOTP初始化期間使用的配置。

       完成RedBoot配置後,最好把最小配置檔案儲存下來,這一步可以通過選擇File->Export并輸入檔案名完成。

       建立RedBoot映像

       接下來需要儲存目前的配置。為了将目前配置儲存為eCos目前配置檔案(.ecc),需要選擇File菜單中的Save As指令,不妨把檔案存為redboot_rom.ecc。這步操作将生成正在建立的RedBoot映像的工作目錄結構,所有目錄都将以剛才建立的.ecc檔案名開頭。在本例中,目錄名以redboot開始。

       正确設定好配置以後,下面就可以開始建立RedBoot映像了。為了執行建立過程,需要采用Build->Library指令,此時配置工具輸出視窗将顯示相關建立資訊。建立過程完成後,生成的RedBoot映像存放在redboot_install/bin子目錄中,本例中新的RedBoot映像取名為redboot_rom.bin。

       更新目标平台

       将RedBoot映像裝進非易失性存儲器根據目标不同有很多方法,一般情況下,映像必須用軟體編進閃存或用裝置程式設計器編入ROM。

       RedBoot映像裝入閃存後,就可以直接執行缺陷修正或增加功能等映像更新任務,此時需要已有的閃存RedBoot映像和建立立的從RAM運作的RedBoot映像的支援。

       首先從閃存啟動目标平台并運作舊的RedBoot映像,由于這裡采用了閃存映像系統指令将新的RedBoot映像編入閃存,是以需要執行 :RedBoot> fis init ,指令初始化fis系統。該指令用于初始化閃存,使新的映像能用fis指令下載下傳。映像系統初始化完成後,可以用 :RedBoot> fis list ,指令檢視閃存中的映像。此時會得到類似于圖5的輸出,根據實際使用的硬體平台而顯示不同的位址、長度和入口地點,同時還能看到RedBoot映像名,該映像名代表的是目前正在閃存中運作的RedBoot映像。

ROM監控器RedBoot

 圖5 閃存輸出圖

       接着用上述同樣的步驟建立一個RedBoot RAM映像redboot_ram.bin。為了建立從RAM運作的映像,需要確定啟動類型(CYG_HAL_STARTUP)配置選項設為RAM。因為硬體平台包括ROM和RAM最小配置檔案,是以導入并建立RAM配置并不困難,重要的是要記住将RAM和ROM映像存放到不同的工作目錄中。

       下一步用駐留在閃存中的原有RedBoot映像将新的redboot_ram.bin載入到RAM中,這步操作的指令是:

       RedBoot> load redboot_ram.bin

       載入指令的執行有好幾種方法,如把映像從主機發送到目标硬體的TFTP,具體哪種方法取決于使用者實際可用資源情況,fis load指令還能用來通過閃存映像存儲系統裝載和存儲redboot_ram.bin映像。

       我們用go指令執行剛載入RAM中的RedBoot映像。RedBoot映像從RAM執行後會産生新的類似于圖1的初始化消息,要注意這時是從RAM執行RedBoot映像的。

       接着用與上面相同的步驟裝載新建立的ROM RedBoot映像,裝載redboot_rom.bin映像的指令是:

       RedBoot> load redboot_rom.bin -b

       指令行中的ram_addr指RAM中的位置(不同的平台有不同的值),這裡臨時存放着即将編入閃存的redboot_rom.bin映像。

       現在就可以用fis指令将新映像寫進閃存了。某些平台可以支援閃存的鎖定和解鎖,如果使用者能夠解鎖閃存,那麼使用者需要輸入的第一條fis指令是:

       RedBoot> fis unlock -l

      這裡flash_addr是需解鎖的閃存位址,本例中這項參數對應的是fis list指令中RedBoot映像名稱的閃存位址,從fis list指令中還能得到長度。如果平台不支援閃存鎖定,那麼使用者可以跳過這一步。

       随後可以用指令:RedBoot> fis create RedBoot -f -b -l -s  ,将RAM中的RedBoot新映像寫入閃存中。其中flash_addr是RedBoot新映像寫入閃存的位置,如fis list指令所示,ram_addr是redboot_rom.bin檔案載入RAM存儲器的位置。flash_len同樣出現在fis list指令中,代表RedBoot閃存映像的長度,data_len則是将被寫進閃存的redboot_rom.bin檔案的長度。

       在繼續下面的操作之前,fis create指令會詢問使用者是否願意替換現有名為RedBoot的映像,如果回答“是”則将把新的映像裝入閃存。下一步,如果硬體平台允許鎖定閃存,那麼就可以用:RedBoot> fis lock

-f -l ,指令完成閃存鎖定。上面讨論的針對所支援平台實際存儲位置在RedBoot文檔中有詳細說明。最後重新啟動硬體就可以啟用剛才寫進閃存的RedBoot新映像了。

       發展前景

       目前新版RedBoot正計劃與eCos v.2同時推出,新版RedBoot增強功能包括DHCP客戶機、嵌入式web伺服器、USB調試和IDE驅動支援。

       即使沒有這些功能改善,RedBoot ROM監控器也能提供一種低成本而且容易使用的硬體調試與測試方法。由于RedBoot是開放式源代碼,是以使用者能夠定制RedBoot以滿足項目開發和測試階段遇到的所有特殊需求。RedBoot對GDB的支援甚至可以讓使用者不再需要昂貴的硬體調試工具。 

繼續閱讀