Wince程序内存和存储内存
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.
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
總結
以上是生活随笔為你收集整理的Wince程序内存和存储内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于WINCE6.0的nandflash
- 下一篇: 我的9年IT路