自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Windows CE應(yīng)用程序可移植性淺析

開(kāi)發(fā)
本文對(duì)Windows CE應(yīng)用程序的可移植性進(jìn)行了分析。由于運(yùn)行在四大架構(gòu)上,WinCE可移植性是編寫(xiě)過(guò)程中需要重點(diǎn)考慮的因素。

由于桌面Windows絕大多數(shù)情況下運(yùn)行于X86平臺(tái)上,也就不存在不同平臺(tái)的可移植性問(wèn)題。然而Windows CE運(yùn)行在四大架構(gòu)(X86,SHx,MIPS,ARM)的CPU上,編寫(xiě)應(yīng)用程序時(shí)就需要考慮它的移植。

以下通過(guò)在wince系統(tǒng)下訪(fǎng)問(wèn)物理地址,來(lái)看看如何編寫(xiě)可移植性較好的Windows CE應(yīng)用程序。

首先必須明確兩個(gè)概念。

1. 在X86平臺(tái)下才有I/O地址這一說(shuō),在其他體系的CPU(如ARM/MIPS)下是沒(méi)有I/O端口的。因?yàn)閄86下把I/O和存儲(chǔ)器分開(kāi)編址,導(dǎo)致其有兩種地址;而別的CPU是把兩者統(tǒng)一編址,即把I/O映射到存儲(chǔ)器上。

2. WinCE的存儲(chǔ)管理是通過(guò)MMU實(shí)現(xiàn)的,在系統(tǒng)啟動(dòng)后,我們只能訪(fǎng)問(wèn)虛擬存儲(chǔ)空間,必須經(jīng)過(guò)MMU。但是在X86下,訪(fǎng)問(wèn)I/O口和存儲(chǔ)器走的地址總線(xiàn)不同,不用經(jīng)過(guò)MMU。

比如我們想要訪(fǎng)問(wèn)掛在某總線(xiàn)上物理地址為360h的端口,對(duì)于X86平臺(tái)我們可以直接嵌入?yún)R編操作物理地址, 或者使用地址指針訪(fǎng)問(wèn)物理地址。但對(duì)于其他平臺(tái),我們必須先作一個(gè)物理地址到虛擬地址的映射,然后操作其虛擬地址。這樣顯然程序的可移植性不好,我們需要定義  #ifdef __x86....#elif defined __arm  使得在不同平臺(tái)下程序能夠順利運(yùn)行。

如果使用下面的代碼我們就可以不用這么費(fèi)勁的定義不同平臺(tái)了:

先定義

  1.      inIoSpace = 1;  
  2.     ioPhysicalBase.QuadPart = 0x360;   
  3.  
  4. if( HalTranslateBusAddress( Isa, //此函數(shù)把ISA總線(xiàn)上物理地址映射為系統(tǒng)物理地址  
  5.     0,  
  6.     ioPhysicalBase,  
  7.     &inIoSpace,  //此參數(shù)=1說(shuō)明轉(zhuǎn)化的是I/O空間地址,=0時(shí)存儲(chǔ)器地址  
  8.     &ioPhysicalBase ) )  
  9. {  
  10.     if( !inIoSpace )   ////如果是存儲(chǔ)器地址,針對(duì)非X86 平臺(tái)  
  11.  
  12.     {  
  13.     ioPortBase = ( PUCHAR ) MmMapIoSpace(    //此函數(shù)把系統(tǒng)物理地址轉(zhuǎn)化為虛擬地址  
  14.     ioPhysicalBase,  
  15.     IoLen,  
  16.     FALSE );  
  17. if( ioPortBase == NULL )  
  18. {  
  19.     //TODO: Error handling  
  20. }  
  21.     }  
  22.     else //如果是I/O,即X86 下,不需要做地址映射  
  23.     {  
  24. ioPortBase = ( PUCHAR ) ioPhysicalBase.LowPart;  
  25.     }  
  26. }  
  27. else 
  28. {  
  29.     //TODO: Error Handling  
  30. }  

隨后對(duì)于端口的操作( ioPortBase),我們也可以充分挖掘它的可移植性。通過(guò)使用READ_PORT_UCHAR,
WRITE_PORT_UCHAR這些wince下的宏來(lái)實(shí)現(xiàn)端口讀寫(xiě)。而不是在X86下用指針操作(不僅移植性差,而且容易產(chǎn)生問(wèn)題)。CE下的宏在內(nèi)部是封裝好的API函數(shù)。例如WRITE_PORT_UCHAR這個(gè)宏在X86 處理器上轉(zhuǎn)化為一條OUT的匯編指令;而在ARM處理器上會(huì)轉(zhuǎn)化成一條對(duì)虛擬地址的寫(xiě)指令。

WinCE5.0下可以使用CreateBusAccessHandle(總線(xiàn)注冊(cè)表路徑)+BusTransBusAddrToVirtual來(lái)實(shí)現(xiàn)總線(xiàn)物理地址到系統(tǒng)虛擬地址的直接變換。這種方式比起使用OEMAddressTable+VirtualAlloc+VirtualCopy方式更具不同平臺(tái)的可移植性。

本文為Windows Embedded征文比賽獲獎(jiǎng)文章。

【編輯推薦】

  1. 在WinCE中獲取設(shè)備ID
  2. WinCE編譯過(guò)程的四個(gè)階段
  3. WinCE中觸摸屏驅(qū)動(dòng)開(kāi)發(fā)詳解
  4. 基于WinCE的液位遙測(cè)系統(tǒng)軟件設(shè)計(jì)
  5. WinCE中串口驅(qū)動(dòng)及接口函數(shù)介紹
責(zé)任編輯:yangsai 來(lái)源: 網(wǎng)絡(luò)
相關(guān)推薦

2012-12-14 09:35:03

私有云應(yīng)用程序可移植性OpenStack

2009-08-17 10:17:01

C# Windows

2012-09-24 09:31:28

應(yīng)用移植性云計(jì)算云平臺(tái)應(yīng)用程序

2011-06-14 14:18:08

可移植性測(cè)試

2016-08-02 09:45:59

云計(jì)算

2012-11-16 15:34:35

Cloud FoundVMware PaaS平臺(tái)即服務(wù)

2013-04-02 09:25:20

PaaS 應(yīng)用可移植性PaaS提供商平臺(tái)即服務(wù)

2011-07-22 17:41:02

java

2011-07-11 17:33:25

JAVA可移植性

2009-08-25 09:39:21

創(chuàng)建C# Window

2013-05-28 10:33:06

虛擬化虛擬機(jī)移植

2011-07-20 16:59:07

2022-12-25 18:03:13

Debug原理軟件

2009-07-10 17:24:07

Swing應(yīng)用程序

2012-09-07 09:51:07

云互操作性云可移植性云計(jì)算服務(wù)

2024-11-22 09:00:00

云原生云計(jì)算云應(yīng)用

2009-07-20 16:08:04

ASP.NET應(yīng)用程序

2009-09-24 17:21:17

加速Hibernate

2009-07-09 16:47:26

Servlet的Web

2010-01-26 13:29:46

VC++應(yīng)用程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)