循環バッファ コードの効率を改善するための助けが必要です。
stackoverflow を調べたところ、循環バッファーに関する (ほぼ) すべてのトピックが、そのようなバッファーの使用または循環バッファーの基本的な実装に関するものであることがわかりました。超効率的にする方法についての情報が本当に必要です。
このバッファは、単一の高精度 FPU を備えた STM32F4 マイクロコントローラで使用する予定です。特に write() と readn() 関数を多用する予定です。ここでは文字通り 1 秒間に数百万回の呼び出しを行っているため、数クロック サイクルを削ることで実際に違いが生まれます。
最も重要なコードをここに置きます。完全なバッファ コードは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];
}