記憶體或暫存器定義和賦值

2021-06-03 00:18:53 字數 1429 閱讀 4292

在嵌入式中,會經常遇到暫存器、記憶體的資料傳輸,如何向暫存器中寫入資料呢?現舉例說明:

#define rdisrc0     (*(volatile unsigned *)0x4b000000) //dma 0 initial source
這是s3c2410的dma的初始源位址暫存器的定義。disrc0是dma0的初始源位址暫存器,s3c2410為其分配的位址為:0x4b000000 ;上面的預定義是將0x4b000000先強制轉換成指標((volatile unsigned *)0x4b000000),然後再對其進行 * 操作,這樣就將rdisrc0變成了變數。

rdisrc0 = 0x38000000  //將0x38000000資料賦值給rdisrc0

這個例子延伸到乙個很好的用法:

1、記憶體位址可以直接由

c語言指標操作,如:

unsigned char *p=(unsigned char*)0xf000ff00;

*p=11;

2、

typedef void (*lpfunction)(); /*定義乙個無引數、無返回型別的函式指標型別*/

lpfunction lpreset =(lpfunction)(0xf000fff0) ;/*定義乙個函式指標,指向cpu啟動後所執行第一條指令的位置*/

lpreset(); /*呼叫函式*/

以上程式中,沒有定義任何乙個函式實體,但是程式中卻執行了這樣的函式呼叫:

lpreset(),

它實際上起到了「軟重啟」的作用,跳轉到

cpu啟動後第一條要執行的指令的位置。因此,可以通過函式指標呼叫乙個沒有函式體的「函式」,本質上只是換乙個位址開始執行。

3、linux程式中,核心鍊錶的訪問資料的操作有乙個很重要的巨集:

list_entry()
其實現如下:

#define list_entry(ptr, type, member) \

container_of(ptr, type, member)

//得到type結構體的位址

#define container_of(ptr, type, member) ()

//顯然type結構體的位址肯定比member變數的位址低

//於是減去它們的差值就得到真實type結構體的位址

#define offsetof(type, member) ((size_t) &((type *)0)->member)

//得到member和type結構體位址之間的差值

理解的關鍵是(type *)0,就是將0位址強制轉換為指向type型別的資料,即0位址為起始位址存放的資料時type型別的。

暫存器定義

暫存器是 處理器內的組成部分。暫存器是有限存貯容量的高速存貯部件,它們可用來暫存指令 資料和位址。在 處理器的控制部件中,包含的暫存器有指令暫存器 ir 和程式計數器 pc 在 處理器的算術及邏輯部件中,包含的暫存器有累加器 acc 暫存器是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。暫...

暫存器定義

arm程式設計 關於arm暫存器的巨集定義 gf86530430 136次 2008 8 27 請問各位大蝦 在arm的標頭檔案裡,對與暫存器的定義為什麼不跟51的一樣?如下 define rutxh0 volatile unsigned char 0x1d00020 define rutxh1 v...

儲存 暫存器和記憶體

計算機儲存塔狀結構,暫存器最快,記憶體其次,最慢的是硬碟 同樣是電晶體儲存裝置,為什麼暫存器比記憶體快?一 距離不同 距離不是主要因素,但是最好理解,記憶體離cpu比較遠,所以要耗費更長時間讀取。以3ghz的cpu為例,電流每秒鐘 可以振盪30億次,每次耗時大約為0.33納秒。光在1納秒的時間內,可...