Wince程序内存和存储内存
Wince 下的內(nèi)存實(shí)際上是分為三個(gè)部分的. 先說這幾部分的名字,對(duì)象存儲(chǔ), 系統(tǒng)內(nèi)存,程序內(nèi)存. 準(zhǔn)確來講,應(yīng)該用下面公式說明Wince內(nèi)存 = 系統(tǒng)內(nèi)存 + (對(duì)象存儲(chǔ) + 程序內(nèi)存).這里德內(nèi)存也就是我們平時(shí)說的SDRAM,而我們的平臺(tái)用的64M的SDRAM。
?在wince系統(tǒng)的控制面板系統(tǒng)中可以看到系統(tǒng)內(nèi)存在30M左右,但是硬件上SDRAM明明是64M,為什么這里只有30M呢?因?yàn)閣ince系統(tǒng)本身運(yùn)行要占用30M左右內(nèi)存。這里可以把這部分內(nèi)存稱為系統(tǒng)內(nèi)存。其實(shí)wince正常給我們用的內(nèi)存只有30M左右,前提是你用的SDRAM是64M。
下面我們就仔細(xì)分析下剩下的這30M。也就是程序內(nèi)存和儲(chǔ)存內(nèi)存(對(duì)象儲(chǔ)存)。
程序內(nèi)存不用解釋,就是可供我們的程序用的內(nèi)存。
對(duì)象存儲(chǔ)是wince里一個(gè)新的概念. 嵌入式wince操作系統(tǒng)一般是用在消費(fèi)電子上面, 比如pocket pc, 手機(jī), PDA等移動(dòng)設(shè)備上. 這一類的設(shè)備一般都是有兩個(gè)電源的, 一個(gè)是主電源(比如你的手機(jī)電池), 一個(gè)是后備電池(拆開手機(jī),電路板上可以找到那個(gè)小電池). 后備電池的作用就是在主電源沒電的情況下,維持操作系統(tǒng)的一些需要保存的數(shù)據(jù), 比如注冊(cè)表, 數(shù)據(jù)庫等. 而這些要保存的數(shù)據(jù)就是放在對(duì)象存儲(chǔ)里的,可以復(fù)制一個(gè)文件到wince下(SD卡,U盤除外),會(huì)發(fā)現(xiàn)對(duì)象存儲(chǔ)占用空間變大,到這里,你應(yīng)該理解對(duì)象存儲(chǔ)了。
現(xiàn)在整個(gè)wince內(nèi)存分配有個(gè)清楚的概念了,但是我們?cè)谄綍r(shí)運(yùn)用時(shí)經(jīng)常會(huì)遇到應(yīng)用程序開辟一段內(nèi)存導(dǎo)致應(yīng)用程序掛了的現(xiàn)象。這里不管你是動(dòng)態(tài)申請(qǐng)的還是干嗎。如果內(nèi)存分配中程序內(nèi)存過小。這里前提是你的應(yīng)用程序很大很復(fù)雜,這種現(xiàn)象肯定會(huì)有的。
?那么怎么才能申請(qǐng)到大的內(nèi)存空間呢?當(dāng)然你可以在控制面板中滑動(dòng)那個(gè)分配程序內(nèi)存和儲(chǔ)存內(nèi)存大小的滑動(dòng)條,但是這種情況在系統(tǒng)冷啟動(dòng)后有恢復(fù)成系統(tǒng)默認(rèn)的了。就是他們兩對(duì)半開。那么是不是我們不能修改這個(gè)值了呢?沒關(guān)系。既然微軟讓你看到這個(gè)玩意肯定有地方改的。上網(wǎng)google下很多辦法。這里我介紹兩種:
1.在config.bib中有個(gè)CONFIG 這里的詳細(xì)內(nèi)容可以參考何宗建老師的書。在CONFIG字段下面加入????? FSRAMPERCENT=0x20202020 。這里為什么是0x20202020。可以參考網(wǎng)上牛人的公式。FSRAMPERCENT是一個(gè)4byte長度的十六進(jìn)制數(shù), 我們用代數(shù)假設(shè) FSRAMPERCENT = 0xQXYZ, 其中Q,X,Y,Z都是十六進(jìn)制數(shù)
那么最終劃分給Storage Memory的大小 = ( Q + X + Y + Z ) / 0x400 * TOTAL_RAM_SIZE 以我平臺(tái)例子可以發(fā)現(xiàn)Storage Memory = (0x20+0x20+0x20+0x20)/0x400*64 = 3800KB.
2.網(wǎng)上也有人說動(dòng)態(tài)分配不過這個(gè)辦法我沒有試驗(yàn)過不知道是不是成功的。其實(shí)我個(gè)人覺得如果動(dòng)態(tài)分配很穩(wěn)定的話肯定是動(dòng)態(tài)的好了,這樣可以根據(jù)不同的應(yīng)用來分配不同的程序內(nèi)存大小。
typedef DWORD (*SETSYSTEMMEMORYDIVISION)(DWORD);
typedef BOOL (*GETSYSTEMMEMORYDIVISION)(LPDWORD,LPDWORD,LPDWORD);
void SetObjectMemorySpace(int nSize)
{
#ifdef _WIN32_WCE
??? //從動(dòng)態(tài)庫中獲取函數(shù)地址以設(shè)置對(duì)象存儲(chǔ)區(qū)的大小.
??? HINSTANCE hDll = LoadLibrary(_T("Coredll.dll"));
??? SETSYSTEMMEMORYDIVISION??? SetSystemMemoryDivisionProc = NULL;
??? GETSYSTEMMEMORYDIVISION??? GetSystemMemoryDivisionProc = NULL;
??? if( NULL != hDll )
??? {
??????? //獲取導(dǎo)出函數(shù)地址
??????? 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博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xuefeng_baggio/archive/2010/04/20/5505547.aspx
總結(jié)
以上是生活随笔為你收集整理的Wince程序内存和存储内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于WINCE6.0的nandflash
- 下一篇: 我的9年IT路