Wince 下的内存实际上是分为三个部分的. 先说这几部分的名字,对象存储, 系统内存,程序内存. 准确来讲,应该用下面公式说明Wince内存 = 系统内存 + (对象存储 + 程序内存).这里德内存也就是我们平时说的SDRAM,而我们的平台用的64M的SDRAM。
在wince系统的控制面板系统中可以看到系统内存在30M左右,但是硬件上SDRAM明明是64M,为什么这里只有30M呢?因为wince系统本身运行要占用30M左右内存。这里可以把这部分内存称为系统内存。其实wince正常给我们用的内存只有30M左右,前提是你用的SDRAM是64M。
下面我们就仔细分析下剩下的这30M。也就是程序内存和储存内存(对象储存)。
程序内存不用解释,就是可供我们的程序用的内存。
对象存储是wince里一个新的概念. 嵌入式wince操作系统一般是用在消费电子上面, 比如pocket pc, 手机, PDA等移动设备上. 这一类的设备一般都是有两个电源的, 一个是主电源(比如你的手机电池), 一个是后备电池(拆开手机,电路板上可以找到那个小电池). 后备电池的作用就是在主电源没电的情况下,维持操作系统的一些需要保存的数据, 比如注册表, 数据库等. 而这些要保存的数据就是放在对象存储里的,可以复制一个文件到wince下(SD卡,U盘除外),会发现对象存储占用空间变大,到这里,你应该理解对象存储了。
现在整个wince内存分配有个清楚的概念了,但是我们在平时运用时经常会遇到应用程序开辟一段内存导致应用程序挂了的现象。这里不管你是动态申请的还是干吗。如果内存分配中程序内存过小。这里前提是你的应用程序很大很复杂,这种现象肯定会有的。
那么怎么才能申请到大的内存空间呢?当然你可以在控制面板中滑动那个分配程序内存和储存内存大小的滑动条,但是这种情况在系统冷启动后有恢复成系统默认的了。就是他们两对半开。那么是不是我们不能修改这个值了呢?没关系。既然微软让你看到这个玩意肯定有地方改的。上网google下很多办法。这里我介绍两种:
1.在config.bib中有个CONFIG 这里的详细内容可以参考何宗建老师的书。在CONFIG字段下面加入 FSRAMPERCENT=0x20202020 。这里为什么是0x20202020。可以参考网上牛人的公式。FSRAMPERCENT是一个4byte长度的十六进制数, 我们用代数假设 FSRAMPERCENT = 0xQXYZ, 其中Q,X,Y,Z都是十六进制数
那么最终划分给Storage Memory的大小 = ( Q + X + Y + Z ) / 0x400 * TOTAL_RAM_SIZE 以我平台例子可以发现Storage Memory = (0x20+0x20+0x20+0x20)/0x400*64 = 3800KB.
总体内存 TOTAL_RAM_SIZE
存储空间大小 StorageMemeory =(Q+X+Y+Z)×TOTAL_RAM_SIZE/0x400
程序空间大小 ProgramMemeory =TOTAL_RAM_SIZE-StorgeMemeory
假设开发板剩余的SDRAM空间是32MB,那么存储空间为6MB,程序空间为26MB,计算如下:
StorgeMemeory = (0x20+0x20+0x40+0x40)×32/0x400=6MB
ProgramMemeory = 32 -6=26MB
这是理论计算值,实际值略有偏差。
2.网上也有人说动态分配不过这个办法我没有试验过不知道是不是成功的。其实我个人觉得如果动态分配很稳定的话肯定是动态的好了,这样可以根据不同的应用来分配不同的程序内存大小。
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
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xuefeng_baggio/archive/2010/04/20/5505547.aspx