嵌入式系統(tǒng)HAL原理與BSP的實(shí)現(xiàn)方法
2.2 硬件相關(guān)的設(shè)備驅(qū)動程序
BSP另一個(gè)主要功能是硬件相關(guān)的設(shè)備驅(qū)動。與初始化過程相反,硬件相關(guān)的設(shè)備驅(qū)動程序的初始化和使用通常是一個(gè)從高層到底層的過程。
盡管BSP中包含硬件相關(guān)的設(shè)備驅(qū)動程序,但是這些設(shè)備驅(qū)動程序通常不直接由BSP使用,而是在系統(tǒng)初始化過程中由BSP把它們與操作系統(tǒng)中通用的設(shè)備 驅(qū)動程序關(guān)聯(lián)起來,并在隨后的應(yīng)用中由通用的設(shè)備驅(qū)動程序調(diào)用,實(shí)現(xiàn)對硬件設(shè)備的操作。設(shè)計(jì)與硬件相關(guān)的驅(qū)動程序是BSP設(shè)計(jì)中另一個(gè)關(guān)鍵環(huán)節(jié)。圖4顯示 了調(diào)用設(shè)備驅(qū)動程序時(shí)系統(tǒng)各個(gè)層次之間的關(guān)系。
3 設(shè)計(jì)實(shí)現(xiàn)BSP的方法
3.1 設(shè)計(jì)實(shí)現(xiàn)BSP的一般方法
因?yàn)锽SP同時(shí)具有硬件相關(guān)性和操作系統(tǒng)相關(guān)性,是一個(gè)介于硬件與軟件之間的中間層次。因此BSP的開發(fā)不僅需要具備一定的硬件知識,例如CPU的控 制、中斷控制器的設(shè)置、內(nèi)存控制器的設(shè)置及有關(guān)的總線規(guī)范等;同時(shí)還要求掌握操作系統(tǒng)所定義的BSP接口。另外,在BSP的初始化部分通常會包含一些匯編 代碼,因此還要求對所使用的CPU匯編指令有所了解,例如X86的匯編和PowerPC的匯編指令等;對于某些復(fù)雜的BSP還要了解所使用的開發(fā)工具,例 如GNU、Diab Data等。
總之,開發(fā)BSP要求具備比較全面的軟、硬件知識和必要的編程經(jīng)驗(yàn)。由于設(shè)計(jì)實(shí)現(xiàn)的復(fù)雜性,在設(shè)計(jì)特定BSP時(shí)很少從零開始,而是采用以下兩種快捷方法。
方法一:以經(jīng)典BSP為參考
在設(shè)計(jì)BSP時(shí),首先選擇與應(yīng)用硬件環(huán)境最為相似的參考設(shè)計(jì),例如Motorola的ADS系列評估板等。針對這些評估板,不同的操作系統(tǒng)都會提供完整 的BSP,這些BSP是學(xué)習(xí)和開發(fā)自己BSP的最佳參考。針對具體應(yīng)用的特定環(huán)境對參考設(shè)計(jì)的BSP進(jìn)行必要的修改和增加,就可以完成簡單的BSP設(shè)計(jì)。
下面以設(shè)計(jì)pSOS操作系統(tǒng)的BSP初始化過程為例。pSOS系統(tǒng)初始化的層次非常清晰,與初始化過程相對應(yīng)的是以下三個(gè)文件:
1)init.s :對應(yīng)于片級初始化;完成CPU的初始化操作,設(shè)置CPU的工作狀態(tài);
2)board.c :對應(yīng)于板級初始化;繼續(xù)CPU初始化,并設(shè)置CPU以外的硬件設(shè)備;
3)sysinit.c :對應(yīng)于系統(tǒng)級初始化;完成操作系統(tǒng)的初始化,并啟動應(yīng)用程序。
以參考BSP為切入點(diǎn),針對初始化過程的具體環(huán)節(jié),在對應(yīng)的文件中進(jìn)行某些參數(shù)的修改及功能的增加就可以實(shí)現(xiàn)BSP的系統(tǒng)初始化功能。
因?yàn)锽SP具有操作系統(tǒng)相關(guān)性,因此,不同的操作系統(tǒng)會使用不同的文件完成類似的初始化操作。
BSP中硬件相關(guān)的設(shè)備驅(qū)動程序隨操作系統(tǒng)的不同而具有比較大的差異,設(shè)計(jì)過程中應(yīng)參照操作系統(tǒng)相應(yīng)的接口規(guī)范。
方法二:使用操作系統(tǒng)提供的BSP模板
除了提供某些評估板的BSP以外,很多操作系統(tǒng)還提供相應(yīng)的BSP模板(一組需要編寫的文件),根據(jù)模板的提示也可以逐步完成特定BSP的設(shè)計(jì)。
相比較而言,第一種方法最為簡單快捷。因此,在實(shí)際的設(shè)計(jì)過程中,通常以第一種方法為主,同時(shí)結(jié)合使用第二種方法。
在設(shè)計(jì)實(shí)現(xiàn)BSP兩部分功能時(shí)應(yīng)采用以下兩種不同方法:
(1)“自底向上”地實(shí)現(xiàn)BSP中的初始化操作:從片級初始化開始到系統(tǒng)級初始化;
(2)“自頂向下”地設(shè)計(jì)硬件相關(guān)的驅(qū)動程序:從API開始,到操作系統(tǒng)內(nèi)部的通用設(shè)備驅(qū)動程序,再到BSP內(nèi)部的硬件相關(guān)的設(shè)備驅(qū)動程序,最后到底層具體的硬件設(shè)備。
3.2 BSP設(shè)計(jì)方法的不足與改進(jìn)
從以上介紹的兩種設(shè)計(jì)方法可以看出:目前BSP的設(shè)計(jì)與實(shí)現(xiàn)主要是針對某些特定的文件進(jìn)行修改。這種方法比較原始,它不僅要求設(shè)計(jì)人員了解BSP的各個(gè) 組成部分及所對應(yīng)的文件和相關(guān)參數(shù)的具體含義,還要求具備比較全面的軟硬件知識。直接修改相關(guān)文件容易造成代碼的不一致性,增加軟件設(shè)計(jì)上的隱形錯(cuò)誤,從 而增加系統(tǒng)調(diào)試和代碼維護(hù)的難度。隨著底層硬件功能的日益復(fù)雜,開發(fā)BSP所涉及的內(nèi)容也越來越多。這種原始方法的不足之處也越來越突出。進(jìn)行BSP設(shè)計(jì) 方法和工具的創(chuàng)新成為一個(gè)日益突出的問題。
解決這個(gè)問題的一個(gè)可行辦法是:設(shè)計(jì)實(shí)現(xiàn)一種具有圖形界面的BSP開發(fā)設(shè)計(jì)向?qū)?由該向?qū)е?導(dǎo)設(shè)計(jì)者逐步完成BSP的設(shè)計(jì)和開發(fā),并最終由向?qū)上鄳?yīng)的BSP文件,而不再由設(shè)計(jì)人員直接對源文件進(jìn)行修改。這樣不僅可以大大縮短BSP的開發(fā)周 期,減少代碼不一致性,而且系統(tǒng)排錯(cuò)、調(diào)試以及維護(hù)都很簡單。因此,這種方法是目前嵌入式領(lǐng)域中BSP設(shè)計(jì)的一個(gè)趨勢和研究方向。但是,由于嵌入式系統(tǒng)硬 件環(huán)境的多樣性,設(shè)計(jì)向?qū)У膶?shí)現(xiàn)仍需解決若干關(guān)鍵問題。為此,作者仍將在這一方面作進(jìn)一步研究。
文中提出的方法在華環(huán)公司的寬帶網(wǎng)絡(luò)工程中得到實(shí)踐和應(yīng)用,并取得了非常良好的應(yīng)用成果。
評論