gpt4 book ai didi

c - 如何声明指向 volatile 结构的指针

转载 作者:行者123 更新时间:2023-12-04 02:39:05 24 4
gpt4 key购买 nike

假设我有以下定义:

/* 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 访问寄存器,一切都很好,但是如果我使用指向结构的指针怎么办,我应该如何声明它以指定指向的整个 aera 是 volatile ?
volatile UART * hw = &UART1;

这可以吗 ?

最佳答案

如果你声明

extern volatile UART UART1;

那么从该变量派生的任何指针的类型都是 volatile UART *事实上,如果您尝试将其分配给任何其他类型的变量,您的编译器应该发出警告。

如果您愿意 UART永远是 volatile然后你可以这样 typedef
typedef volatile struct {...} tagUART UART;

或者就像 unwind 所说的将特定字段声明为 volatile
typedef struct tagUART {
volatile unsigned int uxmode;
unsigned int uxsta;
volatile unsigned int uxtxreg;
unsigned int uxrxreg;
unsigned int uxbrg;
} UART, *PUART;
volatile的内联使用IE。
while (*(volatile int *)&a) ;

不鼓励使用,只应用于通常不是 volatile 但必须在此上下文中的变量。

另一种方法是拥有一个 union访问一个版本是不稳定的,另一个不是:
union {
volatile UART volatile_version;
UART normal;
};

关于c - 如何声明指向 volatile 结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20288151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com