在对ringbufer环形缓冲区(循环数组)读取或者写入数据,ringbufer状态会相应调整,这种调整通过对rb->read_mirror(读取)和rb->write_mirror(写入)作翻转变化体现出来
在函数rt_ringbuffer_status()判断ringbufer状态是否空RT_RINGBUFFER_EMPTY,满RT_RINGBUFFER_FULL,或者其他状态RT_RINGBUFFER_HALFFULL,那么ringbufer状态又是如何根据rb->read_mirror和rb->write_mirror关系判断ringbufer状态的呢?
rt_inline enum rt_ringbuffer_state rt_ringbuffer_status(struct rt_ringbuffer *rb)
{
if (rb->read_index == rb->write_index)
{
if (rb->read_mirror == rb->write_mirror)
return RT_RINGBUFFER_EMPTY;
else
return RT_RINGBUFFER_FULL;
}
return RT_RINGBUFFER_HALFFULL;
}
根据rb->read_mirror和rb->write_mirror是否相等,来判断ringbufer状态是否空RT_RINGBUFFER_EMPTY,满RT_RINGBUFFER_FULL
函数rt_ringbuffer_data_len()在返回ringbuffer数据长度需要判断ringbufer状态
rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb)
{
switch (rt_ringbuffer_status(rb))
{
case RT_RINGBUFFER_EMPTY:
return 0;
case RT_RINGBUFFER_FULL:
return rb->buffer_size;
case RT_RINGBUFFER_HALFFULL:
default:
{
rt_size_t wi = rb->write_index, ri = rb->read_index;
if (wi > ri)
return wi - ri;
else
return rb->buffer_size - (ri - wi);
}
}
}
RTM_EXPORT(rt_ringbuffer_data_len);
读取(rt_ringbuffer_get()还是rt_ringbuffer_getchar())ringbufer的数据需要调用rt_ringbuffer_data_len()函数
写入(rt_ringbuffer_put()或者rt_ringbuffer_putchar())ringbufer的数据间接调用
rt_ringbuffer_data_len()函数,直接调用rt_ringbuffer_space_len()函数获取ringbuffer空闲长度。
ringbuffer空闲长度是通过计算ringbuffer数据长度,和 ringbuffer的size作差获得
#define rt_ringbuffer_space_len(rb) ((rb)->buffer_size - rt_ringbuffer_data_len(rb))
因此get读取或put写入ringbuffer数据,首先需要判断ringbufer状态(判断rb->read_mirror和rb->write_mirror是否相等),再对rb->read_mirror和rb->write_mirror进行处理