暫存器定義

2021-09-30 05:24:05 字數 2723 閱讀 6187

arm程式設計:關於arm暫存器的巨集定義

[gf86530430] [136次] 2008-8-27

請問各位大蝦:

在arm的標頭檔案裡,對與暫存器的定義為什麼不跟51的一樣?**如下:

#define rutxh0 (*(volatile unsigned char *)0x1d00020)

#define rutxh1 (*(volatile unsigned char *)0x1d04020)

#define rurxh0 (*(volatile unsigned char *)0x1d00024)

#define rurxh1 (*(volatile unsigned char *)0x1d04024)

#define wrutxh0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch)

#define wrutxh1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch)

#define rdurxh0() (*(volatile unsigned char *)0x1d00024)

#define rdurxh1() (*(volatile unsigned char *)0x1d04024)

#define utxh0 (0x1d00020)     //byte_access address by bdma

#define utxh1 (0x1d04020)

#define urxh0 (0x1d00024)

#define urxh1 (0x1d04024)

對於暫存器 知道位址 直接 用#define urxh1 0x1d04024

就好了,幹什麼還用(*(volatile unsigned char *)0x1d00020)搞個強制型別轉化啊?

請知道的大俠,詳細的解答一下,小弟在這裡不勝感激!!!!!

可以簡化後面的程式[qllaoda] [80次] 2008-8-27 10:53:08

用這種方式定義後,你就可以直接用

rutxh0=***或***=rutxh0之類的方式來讀寫暫存器了

但是為什麼不直接用#define add呢?[gf86530430] [65次] 2008-8-28 8:39:54

但是,下面有些用於dma方式的暫存器就沒這麼寫,為什麼要有區別,

還有直接定義他的位址不是也可以麼?

#define uart 0x00000060

i = uart;

請qllaoda 大俠詳細解釋一下 ,麻煩!

這樣當然不行[qllaoda] [64次] 2008-8-28 9:20:37

#define uart 0x00000060

i = uart;

這樣的語句,經過巨集替換後,就相當於

i=0x00000060;

這樣的語句當然達不到讀寫暫存器的效果。

哦 那我這樣寫呢?[gf86530430] [64次] 2008-8-28 13:00:46

51有個sfr 這個關鍵字所以可以直接定義暫存器

如 sfr sbuf 0xc6;

arm不支援 這樣的方式,

但是 我這樣定義不行麼?

unsigned int sbuf _at_  0xc6;

如果不考慮 資源占用情況的化,也是可以實現對暫存器固定位址的訪問的?

請qllaoda 解釋

麻煩了!!

arm編譯器不支援sfr關鍵字。[qllaoda] [45次] 2008-8-28 16:11:33

但是按照變數的方式定義呢?[gf86530430] [52次] 2008-8-28 16:21:03

假如不考慮資源占用的情況

用變數定義是否可以?

unsigned char sbuf _at_ 0xc5;

暫存器不等同於普通變數,那種方法是通用的標準方法,你就別在這個問題上鑽牛角尖了[qllaoda] [52次] 2008-8-28 16:48:58

呵呵,謝謝qllaoda及anno![gf86530430] [36次] 2008-8-29 8:40:29

呵呵,謝謝qllaoda及anno的答覆

我就是不明白,知識應該是相通的,可能是有點轉牛

角尖了。

結貼吧!

是乙個位址指標的概念[anno] [62次] 2008-8-28 9:42:30

首先暫存器的話 肯定是定義為指標型別比較好的

51之所以可以那麼定義是keil編譯器的功能

而標準c的話是不能識別那樣的位址定義的

用了volatile是防止編譯器優化導致資料讀寫出錯

具體的你可以上網看看volatile的使用規則

你那麼定義也行,只不過用時加上[ddllxxrr] [50次] 2008-8-28 15:46:07

#define ddllxxrr 1000

(*(volatile unsigned char *)1000 = 33;

建議看看c語言的書[anno] [48次] 2008-8-28 17:56:06

不要把c51當標準c語言

你如果有機會接觸gcc的話(linux)

就會知道標準c是怎麼寫的

既然是在學arm

就接受新的知識

別拿51做比較

arm很多地方跟51是沒有可以相比之處的

硬是要分出所以然來

以為能承前啟後

其實是沒意義的事

暫存器定義

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

暫存器(通用暫存器)

因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...

暫存器,標誌暫存器

涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...