模拟器与真机的区别
模擬器是把symbian OS內核移植到win32平臺,大多數情況下模擬器環境和真機相似,但仍有以下區別,有些足以給開發者帶來不少麻煩。字節對齊和內存限制將著重介紹。
1. 引導程序
?? 真機上,首先運行一個引導程序用來在啟動內核之前對一系列硬件初始化。模擬器就不需要進行初始化硬件而是直接啟動內核(運行epoc.exe)
2. 文件系統支持
3. 浮點類型
? symbian os通過TReal32(C++ float類型)和TReal64(C++ double類型)來支持浮點型,模擬器基于Intel x86處理器,所以在硬件上支持這種浮點類型。而真機硬件不一定支持。當程序中大量使用浮點型函數的時候,你就需要注意由于真機沒有硬件支持額頭導致的性能上的巨大差距。
4. 機器字節對齊
? 為了降低成本和能耗,ARM采用32位 RISC架構。因此32位的變量必須按32位機器字節邊界對齊,換言之,其地址必須是4的倍數。舉個例子,
? TInt* p; // pointer to integers
...
TInt i=*p; // get from a pointer
這段代碼只有當P的地址是4的倍數時能正常工作,否則就會報訪問沖突錯誤。
? 一般來說,這種限制對程序員是透明的,因為結構體和類成員會被編譯器自動補齊。而當碰到下面這樣的代碼時,字節對齊的限制就要注意了。
TText8 array[200];
for (TInt i=0; i<=196; i++)
??? {
??? TInt* p=(TInt*) array[i]; // needs a cast
??? TInt n=*p; // four bytes from the array makes one integer?
??? }
這樣的代碼在模擬器工作沒問題,在真機上編譯也沒問題,但在循環到第2次時發生訪問沖突,因為p的地址比4的倍數大1.
為了避免這樣的問題,你可以這樣寫:
? TText8 array[200];
for (TInt i=0; i<196; i++)
??? {
??? TAny* p=array[i]; // really a TAny*, so no cast needed!
??? TInt n;
??? Mem::Copy(&n, p, sizeof(TInt)); // copy byte by byte
}
5.內存限制
? 模擬器默認總的堆容量為64MB,這個值可用MegabytesOfFreeMemory關鍵字來設置。可以用mmp文件的epocheapsize關鍵字來設置程序的默認堆的初始和最大尺寸,
? 在真機上程序默認的棧大小只有8K,而模擬器上棧可以大到Windows的上限。因為程序在模擬器上濫用棧空間可能沒問題,但在真機就會報棧溢出kern –exec 3錯誤。在mmp里使用epocstacksize關鍵字設置程序使用的棧大小(模擬器不支持該關鍵字)
6.?進程模擬
7.?時間表
8.?串口
9.?計時器
1. 引導程序
?? 真機上,首先運行一個引導程序用來在啟動內核之前對一系列硬件初始化。模擬器就不需要進行初始化硬件而是直接啟動內核(運行epoc.exe)
2. 文件系統支持
3. 浮點類型
? symbian os通過TReal32(C++ float類型)和TReal64(C++ double類型)來支持浮點型,模擬器基于Intel x86處理器,所以在硬件上支持這種浮點類型。而真機硬件不一定支持。當程序中大量使用浮點型函數的時候,你就需要注意由于真機沒有硬件支持額頭導致的性能上的巨大差距。
4. 機器字節對齊
? 為了降低成本和能耗,ARM采用32位 RISC架構。因此32位的變量必須按32位機器字節邊界對齊,換言之,其地址必須是4的倍數。舉個例子,
? TInt* p; // pointer to integers
...
TInt i=*p; // get from a pointer
這段代碼只有當P的地址是4的倍數時能正常工作,否則就會報訪問沖突錯誤。
? 一般來說,這種限制對程序員是透明的,因為結構體和類成員會被編譯器自動補齊。而當碰到下面這樣的代碼時,字節對齊的限制就要注意了。
TText8 array[200];
for (TInt i=0; i<=196; i++)
??? {
??? TInt* p=(TInt*) array[i]; // needs a cast
??? TInt n=*p; // four bytes from the array makes one integer?
??? }
這樣的代碼在模擬器工作沒問題,在真機上編譯也沒問題,但在循環到第2次時發生訪問沖突,因為p的地址比4的倍數大1.
為了避免這樣的問題,你可以這樣寫:
? TText8 array[200];
for (TInt i=0; i<196; i++)
??? {
??? TAny* p=array[i]; // really a TAny*, so no cast needed!
??? TInt n;
??? Mem::Copy(&n, p, sizeof(TInt)); // copy byte by byte
}
5.內存限制
? 模擬器默認總的堆容量為64MB,這個值可用MegabytesOfFreeMemory關鍵字來設置。可以用mmp文件的epocheapsize關鍵字來設置程序的默認堆的初始和最大尺寸,
? 在真機上程序默認的棧大小只有8K,而模擬器上棧可以大到Windows的上限。因為程序在模擬器上濫用棧空間可能沒問題,但在真機就會報棧溢出kern –exec 3錯誤。在mmp里使用epocstacksize關鍵字設置程序使用的棧大小(模擬器不支持該關鍵字)
6.?進程模擬
7.?時間表
8.?串口
9.?計時器
總結
- 上一篇: 网易mumu模拟器老版本下载地址/历史版
- 下一篇: FPV穿越机飞行入门练习