加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

提高C循环缓冲效率

发布时间:2020-12-16 03:12:41 所属栏目:百科 来源:网络整理
导读:我想要一些帮助提高循环缓冲区代码的效率. 我看了一下Stackoverflow,发现(几乎)循环缓冲区中的所有主题都是关于使用这样的缓冲区或循环缓冲区的基本实现.我真的需要有关如何使其超级有效的信息. 该计划是将这个缓冲区与STM32F4微控制器一起使用,该单片机具有
我想要一些帮助提高循环缓冲区代码的效率.

我看了一下Stackoverflow,发现(几乎)循环缓冲区中的所有主题都是关于使用这样的缓冲区或循环缓冲区的基本实现.我真的需要有关如何使其超级有效的信息.

该计划是将这个缓冲区与STM32F4微控制器一起使用,该单片机具有单一的FPU.
我打算大量使用write()和readn()函数.我们在这里说几百万个电话,这里剃须了几个时钟周期,真的会有所作为.

我将把最重要的代码放在这里,完整的缓冲区代码可以通过http://dl.dropbox.com/u/39710897/circular%20buffer.rar

任何人都可以提供一些关于如何提高这个缓冲区效率的指针?

#define BUFF_SIZE 3             // buffer size set at compile time

typedef struct buffer{
    float buff[BUFF_SIZE];
    int readIndex;
    int writeIndex;
}buffer;

/********************************
* void write(buffer* buffer,float value)
* writes value into the buffer
* @param buffer* buffer
*   pointer to buffer to be used
* @param float value
*   valueto be written in buffer
********************************/
void write(buffer* buffer,float value){
    buffer->buff[buffer->writeIndex]=value;
    buffer->writeIndex++;
    if(buffer->writeIndex==BUFF_SIZE)
        buffer->writeIndex=0;
}

/********************************
* float readn(buffer* buffer,int Xn)
* reads specified value from buffer
* @param buffer* buffer
*   pointer to buffer to be read from
* @param int Xn
*   specifies the value to be read from buffer counting backwards from the most recently written value
*   i.e. the most recently writen value can be read with readn(buffer,0),the value written before that with readn(buffer,1)
********************************/
float readn(buffer* buffer,int Xn){
    int tempIndex;

    tempIndex=buffer->writeIndex-(Xn+1);
    while(tempIndex<0){
        tempIndex+=BUFF_SIZE;
    }

    return buffer->buff[tempIndex];
}

解决方法

正如“Oli Charlesworth”所建议的那样 – 如果你的缓冲区大小是2的权力,你可以简化一些事情.我想写入读/写功能体,这样就更清楚了.
#define BUFF_SIZE 4
#define BUFF_SIZE_MASK (BUFF_SIZE-1)

typedef struct buffer{
    float buff[BUFF_SIZE];
    int writeIndex;
}buffer;

void write(buffer* buffer,float value){
    buffer->buff[(buffer->writeIndex++) & BUFF_SIZE_MASK] = value;
}

float readn(buffer* buffer,int Xn){
    return buffer->buff[(buffer->writeIndex + (~Xn)) & BUFF_SIZE_MASK];
}

一些解释.请注意,根本没有分支(if).我们不将数组索引限制到数组边界,而是将其与掩码进行AND进行对比.

在readn而不是计算访问索引

writeIndex – (Xn 1)

我们正在使用:

writeIndex(?Xn)

这是假设2补体算术.也就是说,为了使整数为负数,我们不是所有的位,而是添加1.但是,由于你想从数字中减去1,所以只需要NOT就是所需要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读