張小平,谷 勇,豐新龍
(1.海軍駐太原地區(qū)航空軍事代表室;2.太原航空儀表有限公司,太原 030006)
引導(dǎo)加載程序是上電運(yùn)行的第一段代碼,一般完成硬件初始化和系統(tǒng)加載的功能。了解引導(dǎo)加載程序有助于更深入的理解計(jì)算機(jī)系統(tǒng),實(shí)現(xiàn)更底層的應(yīng)用,下面以Motorola 公司的DSP 處理器為例介紹引導(dǎo)加載程序的部分應(yīng)用。
通常計(jì)算機(jī)系統(tǒng)從軟件角度劃分層次如下:①引導(dǎo)加載程序。包括固化在固件(firmware)中的boot代碼(可選)和BootLoader 兩大部分。② 操作系統(tǒng)內(nèi)核。特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動(dòng)參數(shù)。③ 文件系統(tǒng)。包括根文件系統(tǒng)和建立于flash、Ram 等存儲(chǔ)設(shè)備上的文件系統(tǒng)。④ 用戶應(yīng)用程序。滿足用戶需求的各種程序和功能代碼。
引導(dǎo)加載程序是系統(tǒng)加電后運(yùn)行的第一段軟件代碼。PC機(jī)中的引導(dǎo)加載程序由BIOS(其本質(zhì)就是一段固件程序)和位于硬盤(pán) MBR 中的OS BootLoader(比如,LILO 和GRUB 等)一起組成。BIOS 在完成硬件檢測(cè)和資源分配后,將硬盤(pán)MBR中的BootLoader 讀到系統(tǒng)的RAM中,然后將控制權(quán)交給OS BootLoader。BootLoader的主要運(yùn)行任務(wù)就是將內(nèi)核映象從硬盤(pán)上讀到RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點(diǎn)去運(yùn)行,也即開(kāi)始啟動(dòng)操作系統(tǒng)。
對(duì)于無(wú)操作系統(tǒng)平臺(tái)的嵌入式系統(tǒng),Bootloader完成初始化硬件、建立內(nèi)存映射等工作后,直接跳轉(zhuǎn)到用戶程序執(zhí)行。
通過(guò)Bootloader 設(shè)計(jì)能實(shí)現(xiàn)很多功能,如初始化硬件、系統(tǒng)啟動(dòng)自檢測(cè)、加載操作系統(tǒng)和用戶程序,實(shí)現(xiàn)系統(tǒng)更新等。嵌入式系統(tǒng)產(chǎn)品一般有3種工作狀態(tài):正常工作狀態(tài)、程序加載狀態(tài)、維護(hù)調(diào)試狀態(tài)。根據(jù)軟件或硬件輸入,Bootloader 判斷系統(tǒng)的狀態(tài),選擇跳轉(zhuǎn)到用戶程序或執(zhí)行加載程序代碼或執(zhí)行維護(hù)檢測(cè)程序。
程序加載的方式有多種,一般通過(guò)串行接口、JTag 接口、以太網(wǎng)接口等,可加載的程序文件格式包括ELF32、S-record 等。[1-5]
下面以Motorola 公司的DSP56F800系列處理器為例,說(shuō)明Bootloaer 在串口加載中的應(yīng)用。
飛思卡爾公司的DSP56F800系列處理器有較廣泛的應(yīng)用基礎(chǔ),采用傳統(tǒng)的JTAG 接口仿真和加載方式,更新軟件時(shí)需要拆裝產(chǎn)品,對(duì)產(chǎn)品外場(chǎng)維護(hù)、檢測(cè)造成不便。采用串口加載方式,接口簡(jiǎn)單、方便,通過(guò)產(chǎn)品上預(yù)留的RS-232 接口,即可更新程序,又能打印維護(hù)信息。
DSP56F800系列處理器的片上設(shè)備有SCI 及GPIO端口,通過(guò)SCI 和RS-232 通訊驅(qū)動(dòng)芯片(ADM3311,MAX232 等)實(shí)現(xiàn)和上位機(jī)的通訊,GPIO 用來(lái)判斷進(jìn)入正常工作還是程序加載模式,復(fù)位信號(hào)和硬件喂狗信號(hào)連接到外部調(diào)試、加載端口便于控制,其硬件基本原理框圖如圖1所示:
圖1 串口加載硬件設(shè)計(jì)原理
ISboot 通過(guò)電阻上拉至3.3 V,輸入懸空時(shí)進(jìn)入正常工作狀態(tài),接地時(shí)進(jìn)入程序加載狀態(tài)。進(jìn)入程序加載狀態(tài)后PC機(jī)通過(guò)RTS 設(shè)置產(chǎn)生喂狗信號(hào)防止DSP 復(fù)位。[6-7]
1)Bootloader 基本原理。在Bootloader的工程中resetvector.asm(見(jiàn)附錄A a)文件中定義復(fù)位中斷向量的入口地址為bootArchStart(見(jiàn)附錄A b)。系統(tǒng)上電首先進(jìn)行必要的寄存器初始化,執(zhí)行調(diào)用main 完成串口加載功能,然后,跳轉(zhuǎn)至archStart執(zhí)行應(yīng)用程序。復(fù)位中斷向量的地址為0x8000~0x8004,archStart 入口地址為0x0080,引導(dǎo)加載的代碼存儲(chǔ)在 bootflash 空間,地址為x8004~0x8800(見(jiàn)附錄A c,link.cmd)。
2)Bootloader 程序設(shè)計(jì)。Bootloader 程序設(shè)計(jì)主要包括如下幾個(gè)部分:
① Bootloader 主程序。主要完成硬件初始化、工作模式選擇功能。ISboot 懸空,跳轉(zhuǎn)至應(yīng)用程序入口,進(jìn)入正常工作狀態(tài);ISboot 接地,進(jìn)入程序加載狀態(tài),等待串口發(fā)送數(shù)據(jù),程序加載完畢跳轉(zhuǎn)至應(yīng)用程序入口。②串口通訊程序。接收PC機(jī)發(fā)送的S-record 格式文件,并反饋狀態(tài)信息。③S-record 文件解碼程序。對(duì)S-record 文件進(jìn)行解碼分析,提取地址、代碼、數(shù)據(jù)等。④ flash 讀寫(xiě)程序。將接收的代碼和數(shù)據(jù)寫(xiě)入Program Flash 或Data Flash 并校驗(yàn)。
其中main(void)為主體函數(shù),其流程如圖2所示,源碼見(jiàn)附錄A,main 執(zhí)行結(jié)束后延時(shí)跳轉(zhuǎn)至用戶程序。
串口通訊使用軟件流控制,X-ON為Ctrl+Q,鍵值17,X-OFF為Ctrl+S,鍵值19;DSP 接收并處理上位機(jī)發(fā)送的S-record 文件,忙時(shí)向上位機(jī)發(fā)送X-OFF,閑時(shí)發(fā)送X-ON;上位機(jī)收到X-OFF 字符停止發(fā)送數(shù)據(jù),收到X-ON 啟動(dòng)發(fā)送數(shù)據(jù)。
圖2 Bootloader串口加載流程
DSP 接收每個(gè)S-record 記錄進(jìn)行校驗(yàn)/解析,將數(shù)據(jù)寫(xiě)入對(duì)應(yīng)的地址,如果接收過(guò)程出現(xiàn)校驗(yàn)或指令錯(cuò)誤,發(fā)送警告信息。[5,8]
Motorola S-records 16 進(jìn)制文件和ELF 文件是編譯生成可執(zhí)行代碼的常見(jiàn)格式,CodeWarrior 編譯出來(lái)的可執(zhí)行代碼就包括這兩種類型的文件(CodeWarrior的工程DEBUG 文件夾下面一般都有這兩種文件,flash.elf,flash.elf.s)。串口加載程序使用S-records 文件。
S-records 文件每個(gè)記錄由ASCII 字符組成,通常不超過(guò)514個(gè)字節(jié),其格式為:類型+字?jǐn)?shù)+地址+數(shù)據(jù)+校驗(yàn)和,見(jiàn)表1。
表1 S-record 文件記錄格式
每個(gè)記錄之間通過(guò)換行符隔離,和目標(biāo)板通訊時(shí)以記錄為單位操作。
各種記錄的描述如下:
S0 記錄內(nèi)容為文件頭信息,其地址域?yàn)?x0000,數(shù)據(jù)域分為3 部分:模塊名稱(20char),版本號(hào)(2char),修訂號(hào)(2char),描述部分(0~36 char)。
S1、S2、S3 記錄均為可加載記錄,數(shù)據(jù)域?yàn)榭杉虞d數(shù)據(jù),地址域分別為4 字節(jié)、6 字節(jié)、8 字節(jié)地址。
S5 記錄,地址域表示此前的可加載記錄總數(shù),數(shù)據(jù)域?yàn)榭铡?/p>
S7、S8、S9 記錄,數(shù)據(jù)域?yàn)榭?,地址域表示可?zhí)行程序入口地址,地址域分別為4 字節(jié)、3 字節(jié)、2 字節(jié)地址。
PC機(jī)的9 針COM端口可實(shí)現(xiàn)串行數(shù)據(jù)輸入輸出,及離散信號(hào)的輸入輸出。COM端口應(yīng)用見(jiàn)表2。
表2 9 針COM端口說(shuō)明
COM 口的DTR、RTS、CTS、DSR 引腳通常為硬件流量控制模式時(shí)作為握手信號(hào)使用,在Bootloader 中數(shù)據(jù)流量控制使用X-ON/OFF 軟件流量控制,因此這4個(gè)引腳可作為離散量輸入/輸出使用。
一般基于DSP56F800 平臺(tái)的產(chǎn)品都有硬件看門(mén)狗的功能,當(dāng)系統(tǒng)軟件不能周期性的喂狗時(shí),系統(tǒng)會(huì)復(fù)位,為減小Bootloader的開(kāi)銷,使用RTS 引腳作為WDI(Watch dog Input),通過(guò)不停翻轉(zhuǎn)RTS電平避免在加載程序過(guò)程中DSP 硬件看門(mén)狗復(fù)位。
DTR 引腳連接到DSP系統(tǒng)復(fù)位信號(hào),加載完畢后可以自動(dòng)復(fù)位DSP,驗(yàn)證程序加載是否成功。
CTS、DSR 也可作為DSP模式輸入引腳,在串口調(diào)試功能設(shè)計(jì)中用來(lái)判斷DSP 當(dāng)前所處的工作模式。[6-7]
上位機(jī)軟件包括如下功能:串行端口設(shè)置及初始化;DSP 信息接收并顯示;S-record 文件讀取及傳送;DSP 復(fù)位信號(hào),喂狗信號(hào)控制。軟件流程圖見(jiàn)圖3。
圖3 上位機(jī)軟件流程圖
通過(guò)Bootloader 也可以實(shí)現(xiàn)串口調(diào)試功能,其程序結(jié)構(gòu)和硬件設(shè)計(jì)原理與上述串口加載設(shè)計(jì)類似,Bootloader 設(shè)計(jì)中加入調(diào)試指令集和命令解釋執(zhí)行代碼,例如接收到“S”指令返回版本信息,接收到“B”指令進(jìn)行BIT 并返回自檢信息等。
Bootloader 設(shè)計(jì)在嵌入式系統(tǒng)中非常重要,可根據(jù)系統(tǒng)的需要設(shè)計(jì)不同功能的Bootloader 能提高產(chǎn)品的可靠性、維修性。
[1]章堅(jiān)武,李杰,姚英彪.嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)[M].西安:西安電子科技大學(xué)出版社,2009:122-213.
[2]符意德.嵌入式系統(tǒng)設(shè)計(jì)原理及應(yīng)用[M].北京:清華大學(xué)出版社,2004:81-237.
[3]張思民.嵌入式系統(tǒng)設(shè)計(jì)及應(yīng)用[M].北京:清華大學(xué)出版社,2008:156-197.
[4]賴曉晨,原旭,孫寧.嵌入式系統(tǒng)程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2009:216-317.
[5]馬學(xué)文,朱名日,程曉輝.嵌入式系統(tǒng)中Bootloader的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2005,31(7):96-97;196.
[6]冬雷.DSP 原理及開(kāi)發(fā)技術(shù)[M].北京:清華大學(xué)出版社,2007:67-179.
[7]范壽康.Freescale 16 位DSP 原理與開(kāi)發(fā)技術(shù)[M].北京:機(jī)械工業(yè)出版社,2006:157-317.
[8]郎巖梅,唐文彥,趙軍.基于 DSP 嵌入式系統(tǒng)中Bootloader的設(shè)計(jì)方法[J].電測(cè)與儀表,2003,40(4):35-37.
附錄A a resetvector.asm 源碼
附錄A b bootArchStart.c 源碼
附錄A c bottloader 編譯鏈接文件link.cmd