Wince 下的記憶體實際上是分為三個部分的. 先說這幾部分的名字,Object Storage Service, 系統記憶體,程式記憶體. 準確來講,應該用下面公式說明Wince記憶體 = 系統記憶體 + (Object Storage Service + 程式記憶體).這裡德記憶體也就是我們平時說的SDRAM,而我們的平台用的64M的SDRAM。
在wince系統的控制台系統中可以看到系統記憶體在30M左右,但是硬體上SDRAM明明是64M,為什麼這裡只有30M呢?因為wince系統本身運行要佔用30M左右記憶體。這裡可以把這部分記憶體稱為系統記憶體。其實wince正常給我們用的記憶體只有30M左右,前提是你用的SDRAM是64M。
下面我們就仔細分析下剩下的這30M。也就是程式記憶體和儲存記憶體(對象儲存)。
程式記憶體不用解釋,就是可供我們的程式用的記憶體。
Object Storage Service是wince裡一個新的概念. 嵌入式wince作業系統一般是用在消費電子上面, 比如pocket pc, 手機, PDA等行動裝置上. 這一類的裝置一般都是有兩個電源的, 一個是主電源(比如你的手機電池), 一個是後備電池(拆開手機,電路板上可以找到那個小電池). 後備電池的作用就是在主電源沒電的情況下,維持作業系統的一些需要儲存的資料, 比如註冊表, 資料庫等. 而這些要儲存的資料就是放在Object Storage Service裡的,可以複製一個檔案到wince下(SD卡,隨身碟除外),會發現Object Storage Service佔用空間變大,到這裡,你應該理解Object Storage Service了。
現在整個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
//從動態庫中擷取函數地址以設定Object Storage Service區的大小.
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