2011-09-26 81 views
0

#define PORTC *(unsigned char volatile *)(0x1003)地址=通過宏觀數據定義

#define DDRC *(unsigned char volatile *)(0x1007)

所以我一直想讀一些東西有關嵌入式C.起初我還以爲這個宏是一個指針到指針類型,但後來我很快就假設最後的明星實際上是一個解引用而不是一個類型演員,我是否正確?解引用位置0x1003/0x1007。

它用於這樣的:PORTC = <some hex value>

的問題是什麼使一個指針型鑄造這有什麼不同? C規範中是否有某種「規定」?還是我只是一個白癡...

我也不太知道如何短語這一點,所以我不能做一個快速搜索第一...

回答

0

這只是C語法定義的方式。

作爲演員,表達需要括號:(type)sub-expression演員sub-expression到類型type

你的榜樣,*(unsigned char volatile *)(0x1003)由2子表達式:

  • 一個 「孤獨」 的明星:*
  • 鑄造:(unsigned char volatile *)(0x1003)

演員組成的類型的內部()和一個值。

因此,整個表達式被解釋爲一個指針,然後解除引用來設置指向的內存區域。

+0

所以它需要有一個括號作爲演員,呃?謝謝。回想起來,沒有括號的演員就沒那麼有意義了。 – lightburst

+0

對。沒有括號就是聲明或非法構造。 – pmg

+0

實際上,你需要在整個表達式中使用更多的括號來明確最外層'*'的優先級。即'#define PORTC(*(unsigned char volatile *)(0x1003))' – JeremyP

0

不,這是一個相當演員。首先,將內存位置(作爲整數)轉換爲適當的指針,然後解除引用。

0

該代碼基本上等同於:將<some hex value>置於內存中的地址(0x1003)(或任何值)。在一些嵌入式設備中(不僅是)端口映射到內存位置。

0

鑄造指示所述存儲器地址0x10030x1007是被當作unsigned char volatile *指針編譯器,並在該指針的*解引用操作者作用來獲取被指向的值,在這種情況下爲1個字節。

應用一元*使這個表達式成爲一個有效的左值(它不會沒有它),這意味着它是你可以分配的東西。