gpt4 book ai didi

c - 提高 C 循环缓冲区效率

转载 作者:太空狗 更新时间:2023-10-29 16:45:57 26 4
gpt4 key购买 nike

我需要一些帮助来提高我的循环缓冲区代码的效率。

我查看了 stackoverflow,发现(几乎)所有关于循环缓冲区的主题都是关于此类缓冲区的使用或循环缓冲区的基本实现。我真的需要有关如何使其 super 高效的信息。

计划将此缓冲器与具有单精度 FPU 的 STM32F4 微 Controller 一起使用。我计划大量使用 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 (4U)
#define BUFF_SIZE_MASK (BUFF_SIZE-1U)

struct buffer {
float buff[BUFF_SIZE];
unsigned writeIndex;
};

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

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

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

关于c - 提高 C 循环缓冲区效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9718116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com