例:多次的间接指针引用
考察如下代码:
/* DMA buffer descriptor */
struct bd {
unsigned int state;
unsigned char *data_buff;
};
struct devregs {
unsigned int csr;
struct bd *tx_bd;
struct bd *rx_bd;
};
volatile struct devregs * const dvp = DEVADDR;
/* send buffer */
dvp->tx_bd->state = READY;
while ((dvp->tx_bd->state & (EMPTY | ERROR)) == 0)
; /* NULL - wait till done */
这样的代码常用在对一些DMA设备的发送Buffer处理上。通常这些Buffer Descriptor(BD)当中的状态会由硬件进行设置以告诉软件Buffer是否完成发送或接收。但是请注意,上面的代码中对dvp->tx_bd->state的操作实际上是non-volatile的!这样的操作有可能因为编译器对其读取的优化而导致后面陷入死循环。
因为虽然dvp已经被定义为volatile的指针了,但是也只有其指向的devregs结构才属于volatile object的范围。也就是说,将dvp声明为指向volatile数据的指针可以保障其所指的volatile object之内的tx_bd这个结构体成员自身是volatile变量,但是并不能保障这个指针变量所指的数据也是volatile