повышение эффективности циклического буфера C

Мне нужна помощь в повышении эффективности моего кода кольцевого буфера.

Я просмотрел 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];
}

10
задан alexkasko 14 April 2013 в 13:23
поделиться