2012-07-27 48 views
-1

如何寫入設備驅動程序或寄存器上的特定位置/地址?硬件編程

我想我們應該做一個無符號的指針指向給定的寄存器的地址,以訪問寄存器的內容。

#define REG *(unsigned int *)&0xABCBBABA 

任何人都可以告訴我一些關於硬件級編程的基礎知識/先決條件嗎?

如果有人對Qualcom中的軟件配置文件作業有一些瞭解。請告訴我

+4

@perreal CPU寄存器不會,但許多其他設備具有內存映射的配置,也稱爲「寄存器」。 – 2012-07-27 07:28:26

+0

@perreal:那麼你將如何訪問這些......? – 2012-07-30 05:07:50

+0

@AmitSingh,我的壞,在一些cpus他們被命名。 – perreal 2012-07-30 05:21:24

回答

2

是的,基本上就是這樣,除了你的例子中無關的&操作符。您只需創建一個指向特定地址的指針,然後您就可以通過該指針進行讀取或寫入。

當然,它不是可移植的,但是,由於您處於嵌入式空間,這不是一個問題。

什麼你往往看到的是含有指定爲您的各種地址的頭文件有:

// Bit masks for control, and control/data locations. 

#define UART_CTRL_READREADY 0x01 
#define UART_CTRL_WRITREADY 0x01 

#define UART_CTRL  (*((unsigned char *)(0xcafebabe))) 
#define UART_DATA_READ (*((unsigned char *)(0xdeadbeef))) 
#define UART_DATA_WRIT (*((unsigned char *)(0xca11ab1e))) 

(和volatile關鍵字可以在這裏派上用場),這樣就可以簡單地編寫了起來:

// Wait for data to become available. 

while (!(UART_CTRL & UART_CTRL_READREADY)) 
    ; 

// Get it then clear flag for next byte 

databyte = UART_DATA_READ; 

UART_CTRL &= ~UART_CTRL_READREADY; 

當然,您也可以考慮隱藏函數內部的複雜性,以便您可以在沒有太大影響的情況下更改它。事情是這樣:

int getFlag (char *location, unsigned char mask); 
void setFlag (char *location, unsifgned char mask, int setFlag); 
unsigned char getData (char *location); 

雖然這可能慢,這將大大緩解你的任務,如果你需要更改代碼。

就像這樣的低級編碼指針而言,它與C中的「常規」編碼沒有區別。您可能需要閱讀bitwise operators,因爲某些低級設備可能需要這種級別的操作。