模拟器与真机的区别
模擬器是把symbian OS內(nèi)核移植到win32平臺(tái),大多數(shù)情況下模擬器環(huán)境和真機(jī)相似,但仍有以下區(qū)別,有些足以給開(kāi)發(fā)者帶來(lái)不少麻煩。字節(jié)對(duì)齊和內(nèi)存限制將著重介紹。
1. 引導(dǎo)程序
?? 真機(jī)上,首先運(yùn)行一個(gè)引導(dǎo)程序用來(lái)在啟動(dòng)內(nèi)核之前對(duì)一系列硬件初始化。模擬器就不需要進(jìn)行初始化硬件而是直接啟動(dòng)內(nèi)核(運(yùn)行epoc.exe)
2. 文件系統(tǒng)支持
3. 浮點(diǎn)類型
? symbian os通過(guò)TReal32(C++ float類型)和TReal64(C++ double類型)來(lái)支持浮點(diǎn)型,模擬器基于Intel x86處理器,所以在硬件上支持這種浮點(diǎn)類型。而真機(jī)硬件不一定支持。當(dāng)程序中大量使用浮點(diǎn)型函數(shù)的時(shí)候,你就需要注意由于真機(jī)沒(méi)有硬件支持額頭導(dǎo)致的性能上的巨大差距。
4. 機(jī)器字節(jié)對(duì)齊
? 為了降低成本和能耗,ARM采用32位 RISC架構(gòu)。因此32位的變量必須按32位機(jī)器字節(jié)邊界對(duì)齊,換言之,其地址必須是4的倍數(shù)。舉個(gè)例子,
? TInt* p; // pointer to integers
...
TInt i=*p; // get from a pointer
這段代碼只有當(dāng)P的地址是4的倍數(shù)時(shí)能正常工作,否則就會(huì)報(bào)訪問(wèn)沖突錯(cuò)誤。
? 一般來(lái)說(shuō),這種限制對(duì)程序員是透明的,因?yàn)榻Y(jié)構(gòu)體和類成員會(huì)被編譯器自動(dòng)補(bǔ)齊。而當(dāng)碰到下面這樣的代碼時(shí),字節(jié)對(duì)齊的限制就要注意了。
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?
??? }
這樣的代碼在模擬器工作沒(méi)問(wèn)題,在真機(jī)上編譯也沒(méi)問(wèn)題,但在循環(huán)到第2次時(shí)發(fā)生訪問(wèn)沖突,因?yàn)閜的地址比4的倍數(shù)大1.
為了避免這樣的問(wèn)題,你可以這樣寫(xiě):
? 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.內(nèi)存限制
? 模擬器默認(rèn)總的堆容量為64MB,這個(gè)值可用MegabytesOfFreeMemory關(guān)鍵字來(lái)設(shè)置??梢杂胢mp文件的epocheapsize關(guān)鍵字來(lái)設(shè)置程序的默認(rèn)堆的初始和最大尺寸,
? 在真機(jī)上程序默認(rèn)的棧大小只有8K,而模擬器上??梢源蟮絎indows的上限。因?yàn)槌绦蛟谀M器上濫用??臻g可能沒(méi)問(wèn)題,但在真機(jī)就會(huì)報(bào)棧溢出kern –exec 3錯(cuò)誤。在mmp里使用epocstacksize關(guān)鍵字設(shè)置程序使用的棧大小(模擬器不支持該關(guān)鍵字)
6.?進(jìn)程模擬
7.?時(shí)間表
8.?串口
9.?計(jì)時(shí)器
1. 引導(dǎo)程序
?? 真機(jī)上,首先運(yùn)行一個(gè)引導(dǎo)程序用來(lái)在啟動(dòng)內(nèi)核之前對(duì)一系列硬件初始化。模擬器就不需要進(jìn)行初始化硬件而是直接啟動(dòng)內(nèi)核(運(yùn)行epoc.exe)
2. 文件系統(tǒng)支持
3. 浮點(diǎn)類型
? symbian os通過(guò)TReal32(C++ float類型)和TReal64(C++ double類型)來(lái)支持浮點(diǎn)型,模擬器基于Intel x86處理器,所以在硬件上支持這種浮點(diǎn)類型。而真機(jī)硬件不一定支持。當(dāng)程序中大量使用浮點(diǎn)型函數(shù)的時(shí)候,你就需要注意由于真機(jī)沒(méi)有硬件支持額頭導(dǎo)致的性能上的巨大差距。
4. 機(jī)器字節(jié)對(duì)齊
? 為了降低成本和能耗,ARM采用32位 RISC架構(gòu)。因此32位的變量必須按32位機(jī)器字節(jié)邊界對(duì)齊,換言之,其地址必須是4的倍數(shù)。舉個(gè)例子,
? TInt* p; // pointer to integers
...
TInt i=*p; // get from a pointer
這段代碼只有當(dāng)P的地址是4的倍數(shù)時(shí)能正常工作,否則就會(huì)報(bào)訪問(wèn)沖突錯(cuò)誤。
? 一般來(lái)說(shuō),這種限制對(duì)程序員是透明的,因?yàn)榻Y(jié)構(gòu)體和類成員會(huì)被編譯器自動(dòng)補(bǔ)齊。而當(dāng)碰到下面這樣的代碼時(shí),字節(jié)對(duì)齊的限制就要注意了。
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?
??? }
這樣的代碼在模擬器工作沒(méi)問(wèn)題,在真機(jī)上編譯也沒(méi)問(wèn)題,但在循環(huán)到第2次時(shí)發(fā)生訪問(wèn)沖突,因?yàn)閜的地址比4的倍數(shù)大1.
為了避免這樣的問(wèn)題,你可以這樣寫(xiě):
? 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.內(nèi)存限制
? 模擬器默認(rèn)總的堆容量為64MB,這個(gè)值可用MegabytesOfFreeMemory關(guān)鍵字來(lái)設(shè)置??梢杂胢mp文件的epocheapsize關(guān)鍵字來(lái)設(shè)置程序的默認(rèn)堆的初始和最大尺寸,
? 在真機(jī)上程序默認(rèn)的棧大小只有8K,而模擬器上??梢源蟮絎indows的上限。因?yàn)槌绦蛟谀M器上濫用??臻g可能沒(méi)問(wèn)題,但在真機(jī)就會(huì)報(bào)棧溢出kern –exec 3錯(cuò)誤。在mmp里使用epocstacksize關(guān)鍵字設(shè)置程序使用的棧大小(模擬器不支持該關(guān)鍵字)
6.?進(jìn)程模擬
7.?時(shí)間表
8.?串口
9.?計(jì)時(shí)器
總結(jié)
- 上一篇: 网易mumu模拟器老版本下载地址/历史版
- 下一篇: FPV穿越机飞行入门练习