WINCE的内存配置

WINCE 的内存配置
WINCE的内存(包括SDRAMFLASH)的配置包含两个方面:源代码(包括C和汇编)中的定义,及系统配置文件CONFIG.BIB中的定义。源代码中需要定义内存的物理及虚拟地址,大小,并初始化名为OEMAddressTable的结构数组,以告知系统物理地址与虚拟地址的对应关系,系统根据其设置生成MMU页表。而CONFIG.BIB中一般会将内存定义成不同的段,各段用作不同的用途。

CONFIG.BIB文件
文件分两个部分,我们且称之为段,MEMORY段和CONFIG段。MEMORY段定义内存的分片方法,CONFIG段定义系统其它的一些属性。以下是一个CONFIGBIB文件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片的大小相同。
如果不需要NKBIN文件,则可以不设这两个值。
ROMWIDTH
,它只是定义ROMIMAG生成ROM包时如何组织文件,而非其字面含义:ROM的宽度,所以一般都应该为32
COMPRESSION
,一般定义为ON,以打开压缩功能,从而减小BIN文件的尺寸。
AUTOSIZE
,一般应该设为ON,以使系统将定义给ROM但没有用掉的内存当做RAM使用,而提高RAM的使用率。注意,如果ROMFLASH,则不能设为ON,因为FLASH不能当作RAM使用。
ROMOFFSET
,它定义OS起始位置(即ROMSTART)的物理地址和虚拟地址的差值,有些BSP中并没有使用这个定义。
OEMAddressTable及其他
CONFIG.BIB

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 的地址分布情况。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值