我想要一些帮助提高循环缓冲区代码的效率.
我看了一下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就是所需要的.