Vorrei aiuto per migliorare l'efficienza del mio codice buffer circolare.miglioramento dell'efficienza del buffer circolare C
Ho dato un'occhiata allo stackoverflow e ho scoperto che (quasi) tutti gli argomenti sui buffer circolari riguardano gli usi di tale buffer o l'implementazione di base di un buffer circolare. Ho davvero bisogno di informazioni su come renderlo super efficiente.
Il piano prevede l'utilizzo di questo buffer con il microcontrollore STM32F4 che ha una FPU a precettore singolo. Ho intenzione di fare un uso pesante soprattutto delle funzioni write() e readn(). Stiamo letteralmente parlando di qualche milione di chiamate al secondo qui, quindi la rasatura di alcuni cicli di clock qui e là farà davvero la differenza.
metterò i pezzi più importanti di codice qui, il codice di buffer completo è disponibile tramite http://dl.dropbox.com/u/39710897/circular%20buffer.rar
Qualcuno può fornirmi alcune indicazioni su come migliorare l'efficienza di questo buffer?
#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' non è utilizzato. – valdo
readindex non è effettivamente utilizzato nelle funzioni sopra elencate. È usato però nella funzione read() che può essere trovata nel file rar allegato. La funzione readn() elencata qui serve a leggere un valore specifico dal buffer (ovvero il penultimo valore scritto) – Gurba