[英]how to declare pointer to volatile struct
假設我有以下定義:
/* Generic structure of entire SFR area for each UART module */
typedef struct tagUART {
unsigned int uxmode;
unsigned int uxsta;
unsigned int uxtxreg;
unsigned int uxrxreg;
unsigned int uxbrg;
} UART, *PUART;
/* SFR blocks for each UART module */
extern volatile UART UART1 __attribute__((__sfr__));
extern volatile UART UART2 __attribute__((__sfr__));
現在,如果我通過UART1訪問寄存器,那么一切都很好,但是如果我使用一個指向該結構的指針,該如何聲明它以指定所指向的整個區域是易失的呢?
volatile UART * hw = &UART1;
這可以嗎 ?
如果您聲明
extern volatile UART UART1;
然后,從該變量派生的任何指針將屬於volatile UART *
類型,實際上,如果嘗試將其分配給任何其他類型的變量,則編譯器應發出警告。
如果您希望UART
總是volatile
則可以這樣鍵入def
typedef volatile struct {...} tagUART UART;
或如放松所說將特定字段聲明為volatile
typedef struct tagUART {
volatile unsigned int uxmode;
unsigned int uxsta;
volatile unsigned int uxtxreg;
unsigned int uxrxreg;
unsigned int uxbrg;
} UART, *PUART;
內聯使用volatile
while (*(volatile int *)&a) ;
不鼓勵使用,並且僅應將其用於通常不是易失性的變量,而必須在這種情況下使用。
另一種方法是有一個union
,其中訪問一個版本是揮發性另一個不是:
union {
volatile UART volatile_version;
UART normal;
};
我認為那是錯誤的方式; 如果有人(=三個月后您)使用指向USART
的指針但忘記了volatile
部分怎么辦?
正確的方法是將每個字段聲明為volatile
。 有點混亂,但是更好,因為它捕獲了您正在代碼中嘗試建模的更多內容。
您經常會看到諸如__IO
的宏用於對硬件寄存器建模的結構的字段,並且通常在擴展中包括volatile
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.