Windows CE系統開發,BSP包中的幾個常見檔案詳解
BSP介紹(Board Support Package)是介於底層硬體和上層軟體之間的底層軟體開發包,它主要功能為屏蔽硬體,提供作業系統及硬體驅動,具體功能包括:
(1) 單板硬體初始化,主要是CPU的初始化,為整個軟體系統提供底層硬體支援;
(2) 為作業系統提供裝置驅動程式和系統中斷服務程式;
(3) 定製作業系統的功能,為軟體系統提供一個即時多任務的運行環境;
(4) 初始化作業系統,為作業系統的正常運行做好準備。
1.1.1 sources.cmn檔案
sources.cmn是Common Source檔案,BSP內所有的原始碼編譯都會用到該檔案。裡面定義一些比較常用的名詞或環境變數或路徑。
例如在OAMPL138 MCBSP驅動目錄下source 檔案中“INCLUDES=$(INCLUDES);..\INC”這行虛擬碼,其中“(INCLUDES)”部分及時引用source.cmn檔案中的INCLUDE環境變數,定義如程式清單 0.1所示。
程式清單 0.1 定義 件平台相關的檔案,主要 INCLUDE環境變數
INCLUDES=$(_PLATFORMROOT)\common\src\inc;
大家可以看看這段英文介紹;
Sources.cmn is a build configuration system file that allows you to set common variables. This can be useful if more than one directory in the build tree need the a variable set to the same value because it can reduce your maintenance efforts.
Each build tree can use one sources.cmn file. When build.exe runs, it will determine the root of the build tree by looking for the top most folder with a Dirs file. Build.exe then sets BUILDROOT to the top most folder with a Dirs files. Makefile.def in
Public\Common\OAK\Misc will include $(BUILDROOT)\sources.cmn if it exists.
Some of the variables that are commonly set in sources.cmn include CDEFINES, ADEFINES and INCLUDES.
CDEFINES and ADEFINES are used to set macros that are common to multiple build folders. These might include RAM and ROM sizes, but might also include OEM and CPU specific macros.
The include path, INCLUDES, can be set in sources.cmn which is very helpful, especially if and when you change the directory structure.
The Platform directory tree should have WINCEOEM set to 1, so sources.cmn is a good place to do this rather than setting it in each sources file.
Note: Starting with Windows CE 5.0, sources.cmn is no longer really an option. It is required because sources.cmn needs to at least set _COMMONPUBROOT, _ISVINCPATH, and _OEMINCPATH. These were set by build.exe in prior versions.
1.1.2 XXX.bat檔案
DAT檔案用於在WinCE啟動的時候,定義檔案系統的結構,也就是定義有哪些檔案夾,哪些檔案在什麼位置等。每次冷啟動的時候,Filesys模組會根據.dat檔案中的內容來建立目錄以及目錄下的檔案。
在BSP中我們可以找到platform.dat。在建立一個WinCE的工程以後,可以在工程目錄下面找到project.dat。可以在這兩個.dat檔案中定義我們所需的根目錄以及相應的子目錄和檔案,當然Windows檔案夾及其包含的子檔案夾除外。使用者可以通過定義捷徑的方法來引用Windows目錄下的檔案,如程式清單 0.2所示。
程式清單 0.2 DAT檔案應用樣本
root:-Directory("My Documents")
root:-Directory("Program Files")
Directory("\Program Files"):-Directory("My Projects")
Directory("\Program Files"):-Directory("Accessories")
Directory("\Program Files"):-Directory("Communication")
Directory("\Program Files\My Projects"):-File("My Project Program", "\Windows\Myproj.exe")
root:-File("\control.lnk", "\Windows\control.lnk")
簡單解釋一下,上面的內容是先建立My Documents和Program Files兩個根目錄,然後在Program Files下面建立My Projects,Accessories和Communication三個子目錄,然後拷貝被定義在Windows目錄下的存在於ROM中的Myproj.exe檔案到My Projects目錄下面,且名字為My Project Program。這裡需要說明的一點就是,像Myproj.exe這樣的檔案都是從ROM中拷貝出來的,所以必須在BIB檔案中包含了該檔案。最後一行意思是在根路徑下建立control.lnk,該檔案來自ROM中的control.lnk檔案,是一個捷徑檔案。對上面的一些格式做個解釋;
1. Root Directory的文法格式
root:[-Directory("dir_name")] [-Permdir("dir_name")]
[-File("target_filename", "source_location")]
root:表示根目錄。
-Directory(“dir_name”):定義根目錄下的目錄名。
-Permdir(“dir_name”):定義一個永久的目錄,使用者是不能通過RemoveDirectory函數刪除的。
-File(" target_filename", " source_location"):定義一個目標檔案,該檔案從ROM中拷貝過來。target_filename為目標檔案的檔案名稱,source_location為ROM中的檔案,指Windows目錄下的某路徑下的檔案名稱。
2. Directory的文法格式:
Directory("dir_name"):[-Directory("dir_name")]
[-File("target_filename", "source_location")]
Directory(“dir_name”):表示目錄名。”\”表示根目錄。
-Directory(“dir_name”):表示目錄下的路徑,就是子目錄。
-File(" target_filename", " source_location"):定義一個目標檔案,該檔案從ROM中拷貝過來。target_filename為目標檔案的檔案名稱,source_location為ROM中的檔案,指Windows目錄下的某路徑下的檔案名稱。
DAT中所使用的文法定義比較簡單,看看例子就知道如何修改了,一般我們會通過修改project.dat和platform.dat來改變WinCE啟動後的檔案路徑結構。其中platform.dat是和平台相關的,而project.dat是和WinCE工程相關的。
1.1.3 Config.bib檔案
Config.bib檔案是BSP中一個重要的記憶體,他用於指定CPU記憶體配置,先來看看OAMPL138該部分內容是怎麼安排,如程式清單 0.3所示。
程式清單 0.3 CONFIG.BIB檔案MEMORY部分
MEMORY
NK 80000000 02000000 RAMIMAGE
RAM 82000000 0173F800 RAM
DISPLAY 8373F800 00600000 RESERVED
EMACBUF 83D3F800 000C0000 RESERVED
ARGS 83DFF800 00000800 RESERVED
#if defined BSP_DSPLINK
DSPLINK 83E00000 00200000 RESERVED
EXTENSIONRAM 84000000 04000000 RESERVED
#else
EXTENSIONRAM 83E00000 04200000 RESERVED
#endif
簡要說明下,在CONFIG.BIB中指定的MEMORY都指的是虛擬記憶體,如果知道其對應的物理地址,可以參照OEMADDRTAB.INC代碼。
在上述的代碼中 NK 指定的是Kernel在載入到RAM中存放的地址地區,0x80000000表示的是Kernel的記憶體起始地址,0x02000000表示的是Kernel的大小,從這裡可以看出,核心最大不能超過32MB。
另外一個需要注意的是,在上述代碼中ARGS非常重要,它是建立BSP和OS共用參數的地區,一般在BSP中設定的參數都儲存在ARGS地區中。如果有需要,在OS啟動之後,通過KernelIoControl擷取到這段地區,讀取其中參數之後進行相關的系統設定。例如在Bootloader啟動的過程中,改變了顯示屏的參數,則Bootloader將其參數儲存在ARGS當中,OS啟動之後,LCD驅動擷取ARGS地區,解析參數,調整LCD顯示屏的設定,這樣LCD才能正常顯示。
l 小技巧
在 BootLoader 編譯的時候,有時候發現nb0檔案很難產生,其實就是config.bib 檔案未做相關的設定。看看OAMPL138是怎麼做,如程式清單 0.4所示,其中的設定參照程式清單 0.3,不做解釋。
程式清單 0.4 NB0產生技巧
ROMSTART=80000000
ROMWIDTH=32
ROMSIZE=2000000
另外有時候為了提高RAM的利用率,需要將“NK”地區用於載入Kernel剩餘部分的記憶體釋放出來給RAM用,達到擴大程式運行記憶體的目的。看起來不可思議,其實很簡單,只需要在Config.bib檔案中加入“AutoSize = ON”即可。
1.1.4 Platform.bib檔案
該檔案包含了和硬體平台相關的檔案,以驅動模組為主。該檔案還定義這些模組和檔案以什麼方式被載入到記憶體中。具體格式如程式清單 0.5所示;
程式清單 0.5 Platform.bib格式
Name Path Memory Type
Name:模組的名字,比如一個dll或者exe檔案的檔案名稱。
Path:路徑,一般都是WinCE的工程的Release目錄。
Memory:指定該模組被放在哪個地區,一般都是NK地區。
Type:定義了檔案的類型,具體如下表 0‑1所示;
表 0‑1 TYPE類型
類型 |
描述 |
S |
系統檔案。 |
H |
隱藏檔案。 |
R |
只壓縮模組的資源部分。 |
C |
壓縮模組的所有部分。 |
D |
禁止調試。 |
N |
模組是不可信任的。 |
P |
告訴Romimage.exe不需要檢查CPU的類型。 |
K |
告訴Romimage.exe必需固定該模組的核心地址。有該標記的模組只能被LoadKernelLibrary函數載入。 |
X |
告訴Romimage.exe對該模組簽名。 |
M |
運行時載入整個模組,不要按需分頁。 |
L |
告訴Romimage.exe不要分離ROM DLL。 |
一般FILES項的Type只支援S,H,N,D幾個類型,而MODULES項的Type是都支援的。
舉個例子吧:
INIT.EXE %_WINCEROOT%RELEASEINIT.EXE NK SH
MYDLL.DLL %_WINCEROOT%RELEASEMYDLL.DLL NK SHK
對於BIB檔案來說同樣支援“條件編譯”,我們可以通過設定環境變數來選擇性地將某些模組打包到WinCE image中。一般在BSP中,對於一些驅動模組的環境變數我們IF來進行條件判斷。而對於WinCE的系統模組來說,一般都是SYSGEN變數,應該使用@CESYSGEN IF來判斷。
l 小技巧
通常修改Platform.bib或則Platform.reg檔案,都需要系統重新“sysgen”一次,“Sysgen”一次需要耗費比較長的時間,在工作中實在無法忍受。
如此,我們一般採用這種方法來處理。在Platfrom.bib檔案同級目錄下,建議一個以平台名稱命名的bib檔案,如OAMPL138.bib,然後在將該檔案INCLUDE到Platfrom檔案中(如程式清單 0.6所示),需要修改的時候只修改OAMPL138.bib檔案,之後Make Run-Time Image即可生效。
程式清單 0.6 INCLUDE
#include "$(_TARGETPLATROOT)\FILES\OAMPL138.bib"