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"