-- 作者: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 |