【发布时间】:2012-03-15 10:44:43
【问题描述】:
我需要一些帮助来提高我的循环缓冲区代码的效率。
我查看了stackoverflow,发现(几乎)所有关于循环缓冲区的主题都是关于这种缓冲区的使用或循环缓冲区的基本实现。我真的需要有关如何使其超级高效的信息。
计划将此缓冲器与具有单精度 FPU 的 STM32F4 微控制器一起使用。 我计划大量使用 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];
}
【问题讨论】:
-
readindex 确实没有在上面列出的函数中使用。它在 read() 函数中使用,可以在附加的 rar 文件中找到。此处列出的 readn() 函数用于从缓冲区中读取特定值(即倒数第二个写入的值)
标签: c embedded circular-buffer