---- EP9315关于使用32M以上RAM的系统设置 (http://www.devicegate.com/bbs/dispbbs.asp?boardid=2&id=664)
-- 作者:rickw
-- 发布时间:2006-12-22 21:02:56
-- EP9315关于使用32M以上RAM的系统设置
20:13 2006-12-22
EP9315关于使用32M以上RAM的系统设置
EP9315 SBC板子上有32M Nor Flash和64M的RAM。但是默认情况下即使NK设计得只有16M,系统启动后仍然只能使用到32M的RAM作为运行时内存。要使用所有可用的RAM,必须做些设置调整。
WINCE在平台的config.bib中定义了内存映射的设置。为了方便说明,我把对ep9307_1x的默认设置调整列出如下(此处举 例!IMGFLASH && !BSP_EP93XX_COPY_FLASH_TO_RAM ):
IF IMGFLASH !
IF BSP_EP93XX_COPY_FLASH_TO_RAM !
;**********************************************************************
;
; Boot from RAM
;
;**********************************************************************
MEMORY
RESERVED 80000000 00008000 RESERVED
DRV_GLB 80008000 00001000 RESERVED
CS8950 80010000 00030000 RESERVED
EDBG 80040000 00080000 RESERVED
FRAMEBUF 800C0000 00200000 RESERVED
;Rick: for debug
;注释A
; NK 802C0000 01D40000 RAMIMAGE
; RAM 82000000 02000000 RAM
NK 802C0000 01D00000 RAMIMAGE
RAM 81FC0000 00040000 RAM
;Rick: end
CONFIG
COMPRESSION=ON
PROFILE=OFF
ROMSTART=802C0000
;Rick: for debug
;注释B
; ROMSIZE=01D40000
ROMSIZE=01D00000
;Rick: end
ROMWIDTH=32
; NKStart + ROMOFFSET = Physical Memory Location.
; 0x802C0000 + 0x80000000 = 0x002C0000
ROMOFFSET=0x80000000
ROMFLAGS=0
KERNELFIXUPS=ON
;Rick: for debug
;注释C
; AUTOSIZE=OFF
AUTOSIZE=ON
;Rick: end
ENDIF
ENDIF
注释A:默认设置令NK的大小为Ox01D40000字节,从0x802C0000处开始,这样系统第一片32M RAM就刚好被用完,然后就将RAM映射到第二片32M RAM中。此处我将NK的内存尺寸缩小了256K字节。
注释B:默认的ROMSIZE与NK的长度是一致的。调整了NK的尺寸后,此处必须保持一致。
注释C:默认关闭了AUTOSIZE设置。我打开了AUTOSIZE
由于NK很少做到Ox01D40000(约29.25M)字节这么大,特别是在不使用中文字库的情况下,可能甚至可以做到 16M以下,如果使用XIP,则占用的RAM将更小,所以第一片32M RAM应该有很大的可用空间,按照默认设置运行非常浪费。WINCE的AUTOSIZE设置项在此就可以发挥作用了。AUTOSIZE设置为ON的话,系 统将自动把NK之后空余出来的RAM合并到后面的RAM段中,使得空闲内存可以被应用程序使用。但是,当我直接设置AUTOSIZE为ON的时候,系统无 法启动,在分配完内存,开始进行KernelInit后就当了。
经过研究,发现原来RAM段的设置有一个要求:bib文件中设定的整个RAM段的范围,必须位于一个物理内存芯片的连续空间内。如果RAM范围跨越物理芯 片范围,则只能在bib文件中设置其中一块RAM,剩下的其他芯片上的RAM必须留待系统启动时调用的两个函数中去向系统声明。这两个函数分别 是:OEMEnumExtensionDRAM 和 OEMGetExtensionDRAM,其中OEMEnumExtensionDRAM对于BSP开发商来说是可选实现,而 OEMGetExtensionDRAM是必须实现。如果开发商没有实现OEMEnumExtensionDRAM ,则系统将调用OEMGetExtensionDRAM,否则将忽略OEMGetExtensionDRAM。EDB9307_1X的BSP没有实现 OEMEnumExtensionDRAM,只实现了OEMGetExtensionDRAM,而且其中仅仅对EDB9307A做处理,以作为一个范例, 针对具体的板子,实际上是留给最后开发商去自行设置的。函数体的设置如下:
BOOL OEMGetExtensionDRAM(LPDWORD lpMemStart, LPDWORD lpMemLen)
{
BOOL bRet=FALSE;
lpWriteDebugStringFunc(TEXT("OEMGetExtensionDRAM//r//n"));
//Only implemented for EDB9307A as a sample, please double check config.bib before changing
//this function.
#ifdef EDB9307A
#ifdef IMGFLASH
*lpMemStart = (SDRAM_VIRTUAL_MEMORY + 0x2000000);
*lpMemLen = 0x2000000;
bRet=TRUE;
#else
*lpMemStart = (SDRAM_VIRTUAL_MEMORY + 0x1200000);
*lpMemLen = 0xE00000;
bRet=TRUE;
#endif
#else
//rick: for debug
#ifndef IMGFLASH
*lpMemStart = (SDRAM_VIRTUAL_MEMORY + 0x2000000);
*lpMemLen = 0x2000000;
bRet=TRUE;
lpWriteDebugStringFunc(TEXT("OEMGetExtensionDRAM Extend DRAM To 64M.//r//n"));
#endif
//rick: end
#endif
return bRet;
}
为了方便说明,我只对#ifndef IMGFLASH的情况列出。此处直接复制了原来BSP的代码,只是针对!IMGFLASH进行设置。
现在把前后所有设置串起来,说明我的思路:
1、要使用NK剩余的空闲内存,必须将config.bib中config段的AUTOSIZE设置为ON
2、由于EP9315有两片32M SDRAM,而默认config.bib设置已经将第一片32M SDRAM全部分配给系统驱动和NK,而RAM段占据另一片SDRAM全部32M空间,这样当其用AUTOSIZE后,系统将自动把NK剩余的空间与 RAM段合并,从而导致了RAM段跨越两片SDRAM,所以系统会当机。为了避免这个问题,我将NK缩小256K,把这256K留给RAM段,而原先的 32M RAM段则放弃,留到OEMGetExtensionDRAM函数中向系统进行声明。
3、修改OEMGetExtensionDRAM函数,使得剩下的32M SDRAM作为一个扩展RAM段全部提交给系统。
完成上述修改后,系统正常启动,并且拥有了超过32M的可用内存空间,正好是NK之后剩下的所有内存空间。
对于以下包含多片扩展内存芯片的系统,同样需要根据上面思路进行调整,而且需要注意的是,OEMGetExtensionDRAM只能声明一片扩展内存, 如果有多片扩展内存,则必须实现OEMEnumExtensionDRAM函数,并且将它挂接到pNKEnumExtensionDRAM指针,以便系统 调用,系统将忽略OEMGetExtensionDRAM。
具体可参考CE的手册:
ms-help://MS.WindowsCE.500/wcehardware5/html/wce50lrfOEMGetExtensionDRAM.htm
ms-help://MS.WindowsCE.500/wcehardware5/html/wce50lrfoeminit.htm
ms-help://MS.WindowsCE.500/wcehardware5/html/wce50lrfoemenumextensiondram.htm
http://hi.baidu.com/lft_8888/blog/item/8562e1dc37f08ad28c102973.html