WinCE开发How to大集合之实战内存(bib)配置
来源:互联网 发布:经济类推荐书目知乎 编辑:程序博客网 时间:2024/04/30 09:01
WINCE的内存(包括SDRAM及FLASH)的配置包含两个方面:源代码(包括C和汇编)中的定义,及系统配置文件CONFIG.BIB中的定义。源代码中需要定义内存的物理及虚拟地址,大小,并初始化名为OEMAddressTable的结构数组,以告知系统物理地址与虚拟地址的对应关系,系统根据其设置生成MMU页表。而CONFIG.BIB中一般会将内存定义成不同的段,各段用作不同的用途。
CONFIG.BIB文件
CONFIG.BIB文件分两个部分,我们且称之为段,MEMORY段和CONFIG段。MEMORY段定义内存的分片方法,CONFIG段定义系统其它的一些属性。以下是一个CONFIG。BIB文件MEMORY段的例子:
MEMORY
名称 起始地址 大小 属性
RESERVED 80000000 00008000 RESERVED
DRV_GLB 80008000 00001000 RESERVED
CS8900 80010000 00030000 RESERVED
EDBG 80040000 00080000 RESERVED
NK 800C0000 00740000 RAMIMAGE
RAM 81000000 00800000 RAM
名称原则上可以取任意字符串,ROMIMAGE通过一个内存片的属性来判断它的用途。RESERVE属性表明该片内存是BSP自己使用的,系统不必关心其用途;RAMIMAGE说明它是一片存放OS IMAGE的内存;而RAM则表示些片内存为RAM,系统可以在其中分配空间,运行程序。
但存放ROM的这片内存的名称,即NK一般不要改动。因为BIB文件中定义将一个文件加入到哪个ROM片(WINCE支持将ROM IMAGE存放在不连续的几个内存片中)中时会用到这个名称,如下现这行BIB文件项就定义将touch.dll放在名称为NK这片ROM中,
touch.dll $(_FLATRELEASEDIR)/touch.dll NK SH
因而,如果将NK改为其它名称,则系统中所有的BIB文件中的这个NK串都需要改动。
注意:保证各片内存不要重叠;而且中间不要留空洞,以节约内存;两种设备如果不能同时被加载,就应该只为其保留一片从而节约内存,例如,本例中的CS8950是为网卡驱动程序保留的,EDBG是为网卡作调试(KITL)用时保留的,而系统设计成这两个程序不会同时加载(CS8950在启动时判断如果EDBG在运行就会自动退出),这样为这两个驱动程序各保留一片内存实在浪费而且也没有必要。
RAM片必须在物理上是连续的,如果系统的物理内存被分成了几片,则在RAM片只能声明一片,其它的内存在启动阶段由OEMGetExtensionDRAM报告给系统,如果有多于一个的内存片,应该用OEMEnumExtensionDRAM报告。NK片则没有此限制,只是NK跨越两个以上物理内存片时,系统启动时会显示这个OS包跨越了多个物理内存片,认为是个错误,但并不影响系统的执行与稳定性,因为系统启动之时便会打开MMU而使用虚拟地址,从而看到连续的内存空间。当然,如果内核自己都被放在了两个内存片上,那系统应该就无法启动了。而其它保留起来的内存片是一般是给驱动程序DMA用,应该保证它们在物理上的连续性,因为DMA是直接用物理地址的。
CONFIG段中以下几个需要格外注意:
ROMSTART,它定义ROM的起始位置,应该和NK片的起始位置相同。
ROMSIZE,定义ROM的大小,应该和NK片的大小相同。
如果不需要NK。BIN文件,则可以不设这两个值。
ROMWIDTH,它只是定义ROMIMAG生成ROM包时如何组织文件,而非其字面含义:ROM的宽度,所以一般都应该为32
COMPRESSION,一般定义为ON,以打开压缩功能,从而减小BIN文件的尺寸。
AUTOSIZE,一般应该设为ON,以使系统将定义给ROM但没有用掉的内存当做RAM使用,而提高RAM的使用率。注意,如果ROM是FLASH,则不能设为ON,因为FLASH不能当作RAM使用。
ROMOFFSET,它定义OS起始位置(即ROMSTART)的物理地址和虚拟地址的差值,有些BSP中并没有使用这个定义。
OEMAddressTable及其它
OEMAddressTable用来初始化系统中各种设备的虚拟地址与物理地址的对映关系。在我使用的BSP中,它是这样定义并初始化的:复制内容到剪贴板代码:
typedef struct
{
ULONG ulVirtualAddress;
ULONG ulPhysicalAddress;
ULONG ulSizeInMegs;
} AddressTableStruct;
#define MEG(A) (((A - 1)>>20) + 1)
const AddressTableStruct OEMAddressTable[] =
{
{ SDRAM_VIRTUAL_MEMORY, /虚拟地址
PHYSICAL_ADDR_SDRAM_MAIN, /物理地址
MEG(SDRAM_MAIN_BLOCK_SIZE) /这段空间的大小,以M计
},
………………………
{
0,
0,
0
}
};如例子所示,OEMAddressTable为一个结构数组,每项的第一个成员为虚拟地址,第二个成员为对应的物理地址,最后一个成员为该段空间的大小。这个数组的最后一项必须全部为0,以示整个数组的结束。内核启动时会读取这个数组的内容以初始化MMU页表,启用MMU,从尔使程序可以用虚拟地址来访问设备。当然,OEMAddressTable中所用到的每个物理地址及虚拟地址都需要在头文件中定义,每个BSP中定义这些值的文件不尽相同,所以,在此不能说明具体在哪个文件,读者朋友可以参考具体BSP的文档及代码。
不连续内存的处理
如果内存在物理上是连续的,则OEMAddressTable中只需要一项就可以完成对内存的地址映射。但如果BSP运行在SDRAM物理上不连续的系统上时,OEMAddressTable中需要更多的项来将SDRAM映射到连续的虚拟地址上,当然也可以将它们映射到不连续的虚拟地址上,但似乎没有理由那么做。而且,当其物理地址不连续时系统需要做更多的工作。例如,我有这样一个系统:32M SDRAM,16M FLASH,SDRAM在物理上不连续,被分成了4个8M的内存块,我的SDRAM的使用情况如下图所示:
CONFIG.BIB文件的MEMORY段如下所示:复制内容到剪贴板代码:
MEMORY
RESERVED 80000000 00008000 RESERVED
DRV_GLB 80008000 00001000 RESERVED
CS8900 80010000 00030000 RESERVED
EDBG 80040000 00080000 RESERVED
NK 800C0000 00940000 RAMIMAGE
RAM 81800000 00800000 RAM在这32M的空间中,BSP保留了前0x80000字节,接下来是NK,它占用了0x940000字节,而且它跨越了两个内存片,这些和其它BSP的设置都没有多大差别,接下来看RAM片,它只占用了最后的8M空间,前面说过,在这种物理内存不连续的系统中,RAM片不能跨越两个物理内存块,所以它被设计成只占用该系统中的最后一个物理内存片,而其它两片则由OEMEnumExtensionDRAM在运行时刻报告给系统,该函数的内容如下:复制内容到剪贴板代码:
pMemSections[0].dwFlags=0;
pMemSections[0].dwStart=(SDRAM_VIRTUAL_MEMORY + 0x1000000);
pMemSections[0].dwLen=0x800000;
pMemSections[1].dwFlags=0;
pMemSections[1].dwStart=(SDRAM_VIRTUAL_MEMORY + 0x0A00000);
pMemSections[1].dwLen=0x600000;
return 2;这样,系统所有的内存都被激活,系统可用内存就变成了8+8+6=24M,可以将RAM定义为这三片中的任意一片,而在OEMEnumExtensionDRAM中报告其它两片。但把RAM放在最后一片物理内存上有一个很大的好处,即如果NK变大,例如编译一个DEBUG版的系统时,这时,只需要将OEMEnumExtensionDRAM中的内容注释掉,CONFIG.BIB文件不用做任何改动,系统就可运行,只是在MAKEIMG时会有一个警告说系统包太大,可能无法运行,但实际不会影响系统的执行与稳定性,因为NK之后的那段内存并没有被使用,正好被涨大的系统占用,这在调试时极其方便。
而如果系统物理内存是连续的,那将变得简单的多,还以上面的设置为例,如果这32M的SDRAM是物理上连续的,内存的使用情况就可以表示如下图:
所有者系统可用内存都可以定义在RAM片中。
对硬件知识了解不多的朋友请注意:SDRAM是否在物理上连续,与我们的板上有几片SDRAM没有关系,应该向硬件工程师了解SDRAM的地址分布情况。
Dirs文件配置:
- 关于Dirs文件,就是指定要编译的路径,这个地球人都知道。还是简单介绍一下。按照文档上面介绍有三种定义:DIRS,DIRS_CE和OPTIONAL_DIRS。
- DIRS:就是指定要编译的目录。
- DIRS_CE:只有目录下的源代码用于WinCE的映像文件时,才编译该目录。
- OPTIONAL_DIRS:指定可以选择编译的目录。比如:OPTIONAL_DIRS=proj1,如果想编译proj1目录,可以设置BUILD_OPTIONS=proj1,然后运行build命令就可以了。
- 举个例子:
- DIRS= common
- drivers
- oal
- bootloader
- 表示需要编译common,drivers,oal和bootloader目录。
- DIRS=*
- 表示编译当前的所有目录。
Sources文件 配置:
- 在WinCE BSP中会看到很多sources文件,一般会和源代码放在同一个目录,当然不是绝对的。这些sources文件里面就是定义了一些宏,主要用于告诉 Build.exe在编译源代码的时候应该如何编译和链接,告诉Nmake.exe如何编译源代码以及最后生成什么类型的文件。
- 下面具体介绍一下:
- TARGETNAME:最后编译完后生成的目标文件的名字,不包括扩展名。
- TARGETTYPE:生成的文件的类型。具体值如下:
- LIBRARY,一个.lib文件
- DYNLINK,一个.dll文件
- PROGRAM,一个.exe文件
- RELEASETYPE:该宏设置两个环境变量RELEASEDIR和RELEASELIBDIR,就是设置编译后生成文件存放的路径。具体值如下:
- PLATFORM,生成的文件在PLATFORM
- LOCAL,生成的文件在当前路径下
- CUSTOM,生成的文件在TARGETPATH指定的位置
- MANAGED,生成的文件在%_PROJECTROOT%OAKManaged
- OAK, SDK, DDK,生成的文件在%_PROJECTROOT%Oak
- TARGETPATH:当上面的RELEASETYPE=CUSTOM的时候,该宏指定路径
- SOURCELIBS:静态链接。函数的实体被链接过来,生成一份拷贝
- TARGETLIBS:动态链接。函数的地址被链接过来,系统执行时会加载该库
- INCLUDES:指定额外的要搜索的头文件的路径
- SOURCES:指定要被编译的文件
- ADEFINES:指定汇编器要使用的参数
- CDEFINES:指定编译器要使用的参数
- LDEFINES:指定连接器要使用的参数
- RDEFINES:指定资源编译器Rc.exe的参数
- DLLENTRY:指定dll的入口函数
- DEFFILE:指定该模块的.def文件
- EXEENTRY:指定可执行文件的入口函数
- SKIPBUILD:不做实际的build操作,直接返回成功
- WINCECOD:编译后生成一个.cod的汇编文件,用于查看汇编代码调试
- WINCECPU:用于说明为指定的CPU编译,这样被编译出来的目标文件会被放在_TGTCPU环境变量所指定的子目录下面,一般该宏在sources.cmn中定义。
- WINCEMAP:编译后生成一个.map文件,用于调试
- WINCEOEM:设置该值表示需要使用WinCE下的一些公用的库和头文件,该值一般在BSP中的sources.cmn中定义。
- WINCETARGETFILE0:用于告诉编译系统在编译当前路径下的源码文件之前,要先由Build.exe编译的目标文件。
- WINCETARGETFILES:用于告诉编译系统在链接当前路径下所有的目标文件之前,要先由Build.exe编译的目标文件。
- WINCE_OVERRIDE_CFLAGS:用于定义用户自己的编译器参数取代默认的编译器参数。
- 举个例子:
- TARGETNAME=serial_smdk2410
- TARGETTYPE=DYNLINK
- RELEASETYPE=PLATFORM
- TARGETLIBS=$(_COMMONSDKROOT)lib$(_CPUINDPATH)coredll.lib
- $(_SYSGENOAKROOT)lib$(_CPUINDPATH)ceddk.lib
- SOURCELIBS=$(_SYSGENOAKROOT)lib$(_CPUINDPATH)serpddcm.lib
- $(_SYSGENOAKROOT)lib$(_CPUINDPATH)com_mdd2.lib
- DEFFILE=serial.def
- DLLENTRY=_DllEntryCRTStartup
- SOURCES= ser_smdk2410.cpp
- pdds3c2410_ser.cpp
- 需要编译的文件为ser_smdk2410.cpp和pdds3c2410_ser.cpp,DEF文件为serial.def,DLL的入口函数是 _DllEntryCRTStartup,静态连接serpddcm.lib和com_mdd2.lib两个库,动态链接coredll.lib和 ceddk.lib两个库,最终编译为dll文件,文件名为serial_smdk2410.dll。
- 最后总结一下,Dirs文件会和Sources文件配合使用,但是他们不可能存在同一个目录下面。Dirs文件指定编译目录,Sources文件指定如何编译。
- WinCE开发How to大集合之实战内存(bib)配置
- WinCE开发How to大集合 (转载)
- 实战内存(bib)配置
- WinCE开发How to大集合之在Bootloader, WinCE,应用程序间传递参数的方法
- WinCE开发How to大集合之 WinCE下读写串口非常简单好用的例程
- wince内存配置-CONFIG.BIB
- WinCE开发How to大集合之详解MSDN上推荐的分步加载流驱动实现启动提速
- WINCE 内存配置--config.bib文件
- WINCE的内存配置-config.bib文件的解析
- WINCE的内存配置-config.bib文件的解析
- WINCE的内存配置-config.bib文件的解析
- WINCE的内存配置-config.bib文件的解析
- WINCE的内存配置-config.bib文件的解析
- WinCE映像配置.BIB文件
- WinCE配置文件详解之(一)--BIB文件
- WinCE配置文件详解之(一)--BIB文件 .
- config.bib内存配置错误
- Lazarus实战开发之网络版(WIN32/WINCE)
- Nk.exe Boot Process
- symbian SMS应用
- 没有找到MSVCR80D.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题
- 常见的物理引擎
- AppEngine debug
- WinCE开发How to大集合之实战内存(bib)配置
- 孙膑 庞涓 鬼谷子 数论
- Linux的vi命令
- VS2005(VC8)编译的程序,许多错误都不能在SetUnhandledExceptionFilter捕获到
- VC 中的数据类型
- 为什么?
- 穿过黑暗、走出痛苦、告别孤独
- 比较好的国外WEB代理地址
- localhost无法访问,但127.0.0.1可以访问 解决办法