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

2021-04-25 20:05:57 字數 2817 閱讀 7674

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是沒有可以相比之處的

硬是要分出所以然來

以為能承前啟後

其實是沒意義的事

結帖成功,感謝[qllaoda]的回答[gf86530430] [27次] 2008-8-29 8:43:35

感謝qllaoda,答案已接受,您獲得20分專家分

ARM暫存器整理

arm有37個暫存器,31個通用暫存器 r0 r15 32位 和6個狀態暫存器 1.通用暫存器 使用者模式 系統模式 特權模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式。可分為 未備份暫存器r0 r7 備份暫存器 r8 r14 程式計數器 pc r15 注 r0 r7在所有模式下指的同一...

ARM暫存器介紹

arm微處理器支援7種執行模式,分別為 1.使用者模式 usr arm處理器正常的程式執行狀態 2.快速中斷模式 fiq 用於高速資料傳輸或通道管理 3.外部中斷模式 irq 用於通用的中斷處理 4.管理模式 svc 作業系統使用的保護模式 5.資料訪問終止模式 abt 當資料或指令預取終止時進入該...

arm暫存器別名

apcs,arm 過程呼叫標準 arm procedure call standard 提供了緊湊的編寫例程的一種機制,定義的例程可以與其他例程交織在一起。最顯著的一點是對這些例程來自 沒有明確的限制。它們可以編譯自 c pascal 也可以是用組合語言寫成的。apcs 對我們通常稱為 r0 到 r...