在实现循环缓冲区时,我正在努力正确使用关键字volatile
.缓冲区在ISR中写入,并在主程序中读取.我运行的是裸机微控制器,所以没有多线程.
我目前的实现如下所示:
volatile char circ_buf[n] = {0};
volatile size_t head_index = 0;
volatile size_t tail_index = 0;
void buffer_input(const char c)
{
if((head_index+ 1) % n != tail_index) {
//Only if buffer is not full
circ_buf[head_index] = c;
head_index = (head_index + 1) % n;
}
}
char buffer_read(void)
{
if (tail_index != head_index)
{
char c = circ_buf[tail_index];
tail_index = (tail_index + 1) % n;
return c;
}
//Lets assume 0 will never be content of the buffer for this example
return 0;
}
从ISR调用BUFFER_INPUT,从主程序调用BUFFER_READ.
这个实现是有效的,但我在某处读到,不需要使缓冲区数组本身成为易失性的,因为内容只能通过易失性索引来访问.这是真的吗?内容是在中断和主程序中访问的,所以在我的理解中,缓冲区也应该是易失性的?