=============================================================
标题:如何分配存储内存和程序内存
摘要:
备注:Windows CE
日期:2010.4.25
姓名:朱铭雷
=============================================================
Windows CE的系统内存通常只有几十M,我们公司的设备除去系统运行时占用的内存之外,还剩余50几M留给用户使用。这50几M的内存是存储内存和程序内存的总和。关于两者比例大小的调节可以利用“控制面板 | 系统 | 内存”中的滑块来调节。
程序内存无非就是我们的程序可以使用的内存。如果程序内存分配的很小,很可能你使用CreateThread建立一个线程都会失败。
存储内存用来保存一些系统的重要数据。其实具体的功能我也还没清楚,等有时间的时候再仔细研究下。反正当通过VS2005在线调试程序的时候,VS需要先将程序部署到CE下,这时候就需要使用存储内存。调试程序的时候,如果提示“磁盘空间不足”,导致部署失败。这个时候看看那个控制内存的滑动条,很可能是移到了最左边。
关于程序内存和存储内存,系统默认的是对等分。但是这样做不怎么合理,会导致我们程序可以使用的内存较少。所以通常我们需要自己修改下。
微软提供给我们三种方法:
(1) statically using FSRAMPERCENT
(2) during boot using pOEMCalcFSPages
(3) using api SetSystemMemoryDivision
①
最常用的是修改FSRAMPERCENT的值。
以如下config.bib文件中的定义为例:
CONFIG
AUTOSIZE=ON
…
IF IMGTINYFSRAM
FSRAMPERCENT=0x10203040
ENDIF
存在如下关系式:
假设 FSRAMPERCENT = 0xQXYZ, 其中Q,X,Y,Z都是十六进制数。则Storage Memory的大小 = ( Q + X + Y + Z ) / 0x400 * TOTAL_RAM_SIZE。假设TOTAL_RAM_SIZE为64M。则Storage Memory = (0x10 + 0x20 + 0x30 + 0x40) / 0x400 * 64M = 10M。
②
在OAL中调用pOEMCalcFSPages,pOEMCalcFSPages的定义在
/PRIVATE/WINCEOS/COREOS/NK/KERNEL下loader.c文件中:
DWORD (*pOEMCalcFSPages)(DWORD dwMemPages, DWORD dwDefaultFSPages);
③
使用SetSystemMemoryDivision系统API函数动态修改,这个在网络上流传着这样一段代码,具体的自己也没有试过:
- typedef DWORD
- (*SETSYSTEMMEMORYDIVISION)(DWORD);
- typedef BOOL
- (*GETSYSTEMMEMORYDIVISION)(LPDWORD,LPDWORD,LPDWORD);
- void SetObjectMemorySpace(int nSize)
- {
- #ifdef _WIN32_WCE
- //从动态库中获取函数地址以设置对象存储区的大小.
- HINSTANCE hDll =
- LoadLibrary(_T("Coredll.dll"));
- SETSYSTEMMEMORYDIVISION SetSystemMemoryDivisionProc = NULL;
- GETSYSTEMMEMORYDIVISION GetSystemMemoryDivisionProc = NULL;
- if( NULL != hDll )
- {
- //获取导出函数地址
- SetSystemMemoryDivisionProc
- =
- (SETSYSTEMMEMORYDIVISION)GetProcAddress(hDll,_T("SetSystemMemoryDivision"));
- GetSystemMemoryDivisionProc
- =
- (GETSYSTEMMEMORYDIVISION)GetProcAddress(hDll,_T("GetSystemMemoryDivision"));
- if(SetSystemMemoryDivisionProc
- && GetSystemMemoryDivisionProc)
- {
- DWORD
- dwStorePages = 0;
- DWORD
- dwRamPages = 0;
- DWORD
- dwPageSize = 0;
- BOOL bRet =
- (*GetSystemMemoryDivisionProc)(&dwStorePages,&dwRamPages,&dwPageSize);
- if(bRet)
- {
- int
- nPageCount = nSize/dwPageSize;
- if(nSize%dwPageSize
- != 0)
- {
- nPageCount++;
- }
- (*SetSystemMemoryDivisionProc)(nPageCount);
- }
- }
- SetSystemMemoryDivisionProc
- = NULL;
- GetSystemMemoryDivisionProc
- = NULL;
- FreeLibrary(hDll);
- hDll = NULL;
- }
- #endif
- }
关于FSRAMPERCENT的介绍,也可以查看下Windows CE的帮助文档:
[url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conDevelopingOperatingSystem.htm]Developing an Operating System[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conBuildSystem.htm]Build System[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conPlatformConfigurationFiles.htm]OS Design Configuration Files[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conImageConfigurationFiles.htm]Run-Time Image Configuration Files[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conBinaryImageBuilderFile.htm]Binary Image Builder File[/url] > [url=ms-help://MS.WindowsCE.500/wceosdev5/html/wce50conCONFIGSection.htm]CONFIG Section[/url]