wince動態記憶體對映實現訪問IO埠或物理記憶體

2021-05-10 04:31:36 字數 1231 閱讀 7691

原理:在應用程式中直接把控制電源的埠置低。這個原理可以用在其他需要直接訪問物理記憶體的地方。

wince5.0

平台測試通過,其他平台沒驗證。

第一步:

這一步可以包含

s3c2440a_ioport.h

標頭檔案代替。

定義結構:

typedef struct s3c2440a_ioport_reg, *ps3c2440a_ioport_reg;

定義io

#define s3c2440a_base_reg_pa_ioport(0x56000000)//

實體地址

第二步:

虛擬位址與實體地址動態對映。

開始動態對映:

volatile s3c2440a_ioport_reg *v_piopregs;

v_piopregs = (volatile s3c2440a_ioport_reg *)virtualalloc(0, sizeof(s3c2440a_ioport_reg), mem_reserve, page_noaccess);

virtualcopy((pvoid)v_piopregs, (pvoid)(s3c2440a_base_reg_pa_ioport >> 8), sizeof(s3c2440a_ioport_reg), page_physical|page_readwrite|page_nocache ); 使用

virtualalloc

,virtualcopy

兩個函式,需要包含下面兩個標頭檔案:

#include

#include

"pkfuncs.h"

第三步:控制

io關機

做完上面的工作後,

v_piopregs

指標已經對映到埠的實體地址上了。直接控制其關閉系統電源。注:

gpg11

埠控制系統總電源。

v_piopregs->gpgdat &= ~(0x1<<11);

gpg11

是硬體平台電源控制埠。後來我把這個功能放在

setsystempowerstate( null, power_state_off, power_force )

函式中實現了,這樣操作起來穩定安全。改天再寫個

blog

說明setsystempowerstate( null, power_state_off, power_force )

實現關機的方法,謝謝關注……

wince 記憶體對映

gpio暫存器的讀寫方法。不過我看了還是很多疑惑,為什麼在記憶體對映表裡面這樣定義 dcd 0x91600000,0x56000000,1 i o port register 而在s2410.h中又會這樣 define iop base 0xb1600000 0x56000000 明明定義了是0x9...

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道。這些往往會使人受盡折磨,所以如果你想深入c c 程式設計,你必須靜下心來好好苦一番。現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞。並且在軟體開發中很多專業人...