WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(12)-不连续地址的内存配置

上一篇文章已经实现了Multi-Bin,那样原来整个NK占用的内存就释放了许多,80402000到82000000的地址的内存就可以供CE使用.
NK    80402000     02BFF000    NANDIMAGE

而在oemaddrtab_cfg.inc里映射的内存虚拟地址为:
DCD     0x80000000, 0x32000000, 32      ; 32 MB DRAM BANK 6
DCD     0x8C000000, 0x30000000, 32      ; 32 MB DRAM BANK 6

config.bib中定义了一段连续的内存:
RAM            8C200000     01E00000    RAM

这就需要我们来实现如何把80402000起始的内存区域注册给CE使用.MS提供了两种方法:OEMEnumExtensionDRAM和OEMEnumExtensionDRAM
OEMEnumExtensionDRAM用来枚举多个内存区域(最多16个),而OEMEnumExtensionDRAM用来注册2个内存区域(一个在config.bib注册),使用了OEMEnumExtensionDRAM,OEMEnumExtensionDRAM就不被调用.具体调用在C:/WINCE500/PRIVATE/WINCEOS/COREOS/NK/KERNEL/loader.c:

// // Ask OEM if extension RAM exists. // if (pNKEnumExtensionDRAM) { cExtSections = (*pNKEnumExtensionDRAM)(MemSections, MAX_MEMORY_SECTIONS - 1); DEBUGCHK(cExtSections < MAX_MEMORY_SECTIONS); } else if (OEMGetExtensionDRAM(&MemSections[0].dwStart, &MemSections[0].dwLen)) { cExtSections = 1; } else { cExtSections = 0; }
接下来我们就分别用这两种方法来注册80402000起始的内存
1.OEMEnumExtensionDRAM
使用OEMEnumExtensionDRAM需要在OEMInit里实现一个函数指针:
pNKEnumExtensionDRAM = OEMEnumExtensionDRAM;
OEMEnumExtensionDRAM有两个参数(PMEMORY_SECTION pMemSections, DWORD cMemSections)
PMEMORY_SECTION的原型为:
typedef struct _MEMORY_SECTION { DWORD dwFlags; DWORD dwStart; DWORD dwLen; } MEMORY_SECTION, *PMEMORY_SECTION;
dwFlags一直为0,dwStart和dwLen分别为内存块的起始地址和大小
cMemSections是最大的内存块个数,这里值为15,实际上指16个内存块.

OEMEnumExtensionDRAM具体实现如下(我们只注册了一个功能块,如果是多个,以此类推):
DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections, DWORD cMemSections) { DWORD AddedSections = 0; if(AddedSections < cMemSections) { pMemSections->dwFlags=0; pMemSections->dwStart=0x80402000; pMemSections->dwLen=0x01500000; AddedSections++; pMemSections++; } return AddedSections; }
2.OEMEnumExtensionDRAM
OEMEnumExtensionDRAM不需要赋值给对应的函数指针,只需实现即可.
先把前面的pNKEnumExtensionDRAM注释掉,在init.c中实现OEMEnumExtensionDRAM函数:
BOOL OEMGetExtensionDRAM( LPDWORD lpMemStart, LPDWORD lpMemLen ) { *lpMemStart=0x80402000; *lpMemLen=0x01500000; return *lpMemStart|=NULL ? TRUE:FALSE; }
但这时候你编译会发现错误
error LNK2005: OEMGetExtensionDRAM already defined in oal_other.lib(memory.obj)
这是因为在WINCE500/PLATFORM/COMMON/SRC/COMMON/OTHER/memory.c实现了OEMGetExtensionDRAM的空函数.
BOOL OEMGetExtensionDRAM(UINT32 *pMemoryStart, UINT32 *pMemoryLength) { return FALSE; }
当然我们也可以直接在这里修改,但是这里是common目录,使用其他BSP时也会把这段代码编译进去,为了不必要的麻烦,将这里注释掉,实现在bsp OAL中的init.c里.

以上方法最终都可以在CE控制面板的system中看到我们的内存由原来的30M增加到了50M.

你可能感兴趣的:(c,struct,null,System,extension,WinCE)