对rh-thread中ringbufer环形缓冲区关于rb->read_mirror 和rb->write_mirror的梳理

在对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进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值