首页 > 解决方案 > 从环形缓冲区索引计算“经过”元素的数量

问题描述

抱歉,如果我错过了任何类似的帖子...
我有一个BUFFER_SIZE存储事件数据的元素环形缓冲区,所以每个事件都会增加buffer_index,从索引 0 开始。
现在我有一个check_cyclic()函数需要计算自上次调用以来的事件数.
该函数只知道 current buffer_index,它静态存储该值以计算差异。
保证BUFFER_SIZE超过循环时间内可能发生的最大事件数。
所以我们必须考虑在两次循环调用之间可能只有一次溢出。我的实现如下:

void check_cyclic(int buffer_index)
{
    static unsigned int last_buffer_index = 0;
    static unsigned int events_since_last_call = 0;

    if (buffer_index < last_buffer_index)
    { // overflow occured
        events_since_last_call = buffer_index + 1 + BUFFER_SIZE - last_buffer_index;
    }
    else
    { 
        events_since_last_call = buffer_index + 1 - last_buffer_index;
    }

    last_buffer_index = buffer_index;

    //... do something
}

当然,让事件例程本身增加一个计数器并将其重置check_cyclic()会更有效,但我们假设接口如上所示。
是否有一些更有效的计算方法events_since_last_call,也许如果我们对环形缓冲区定义一些要求?“大小必须是二的幂”还是什么?

标签: calgorithm

解决方案


推荐阅读