在嵌入式中,會經常遇到暫存器、記憶體的資料傳輸,如何向暫存器中寫入資料呢?現舉例說明:
#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納秒的時間內,可...