簡體   English   中英

如何聲明易失性結構的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM