如何声明C语言volatile结构体数组?现有数组写法是否正确?
问题:为结构体数组整体添加volatile是否会让每个结构体元素都具备volatile属性?
我定义了如下结构体rawRx_t,因为其他实例可能不需要volatile(比如RAM缓存场景),所以没有把volatile嵌入结构体定义中:
typedef struct{ uint8_t rxPacket[FIFO_SIZE]; uint8_t length; int8_t rssi; uint8_t lqi; }rawRx_t;
现在我需要将该结构体的特定数组设置为volatile,请问使用static volatile rawRx_t rawRxBuffer[NB_MAX_RX_FRAME]; 是否能让数组的每个结构体元素都具备volatile属性?
回答
没问题,这么写完全能达到你想要的效果!
当你在数组类型前加上volatile修饰符时,这个修饰符会直接作用于数组里的每一个结构体元素——也就是说rawRxBuffer数组中的每一个rawRx_t实例,都会被编译器当作volatile rawRx_t类型来处理。
具体来说:
- 数组里的每一个结构体(比如
rawRxBuffer[0]、rawRxBuffer[1]一直到rawRxBuffer[NB_MAX_RX_FRAME-1])都带上了volatile属性 - 连结构体内部的所有成员(像
rxPacket数组、length、rssi这些)也都会被视为volatile的。因为整个结构体实例是volatile的,编译器不会对这些成员的读写做任何优化,会严格按照代码的顺序执行内存访问,完全符合你需要避免优化的场景(比如中断里访问、和外设DMA交互这类情况)。
这种写法刚好契合你的需求:既保留了结构体本身不带volatile的灵活性(方便在RAM缓存这类不需要的场景直接用),又给这个特定的数组实例加上了volatile属性,一举两得。
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

