Простой циклический буфер: необходимо расширить функцию для перезаписи старых данных - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь реализовать простой циклический буфер с перезаписью старых данных (просто экспериментирую с буферами). На самом деле я реализовал буфер, но он не перезаписывает старые данные. Когда буфер заполнен, он не будет добавлять новые данные в массив.

У меня есть следующее:

//Struct with 8 bytes
typedef struct
{
   int8 data_A;                        
   int16 data_B;
   int8 data_C;
   int32 data_D; 
} MyData_Struct_t

//The Circular buffer struct
typedef struct {
   MyData_Struct_t  myData[10]; // 10 elemtns of MyData_Struct_t
   int8 write_idx
   int8 read_idx
   int8 NrOfMessagesinTheQue
} RingBuffer


static MyData_Struct_t  myDataVariable =  {0}; // Instance of MyData_Struct_t
static RingBuffer myRingBuffer= { 0 };      // Instance of myRingBuffer

myDataVariable.data_A = getData(A);  // Lets' say getData() function is called cyclic and new data is received
myDataVariable.data_B = getData(B);  
myDataVariable.data_C = getData(C);   
myDataVariable.data_D = getData(D); 

// Here I call a function to fill the array with data
writeDataToRingbuffer(&myRingBuffer, &myDataVariable); 

void writeDataToRingbuffer(RingBuffer *pBuf, MyData_Struct_t *Data)
{
   if (10 <= pBuf->NrOfMessagesinTheQue)
   {
        // Buffer is Full
   }

   else if (pBuf->write_idx < 10)
   {
      (void)memcpy(&pBuf->myData[pBuf->write_idx], Data, 
sizeof(MyData_Struct_t));  //myData will be read later by another function

      if ((10 - 1u) == pBuf->write_idx)
      {
         pBuf->write_idx = 0u;
      }

      else
      {
         pBuf->write_idx += 1;
      }

      pBuf->NrOfMessagesinTheQue++;
   }

   else
   {
      // Out of boundary
   }
}

Мне нужны некоторые идеи, как расширить эту функцию, чтобы перезаписать старые данные?

Буду очень благодарен!

1 Ответ

0 голосов
/ 28 октября 2019

Если вы просто хотите перезаписать самые старые данные, просто используйте индекс по модулю размера буфера:

#define BUFFER_SIZE 10  // size of myData

void writeDataToRingbuffer(RingBuffer *pBuf, MyData_Struct_t *Data)
{
    (void)memcpy(&pBuf->myData[pBuf->write_idx % BUFFER_SIZE], Data, 
         sizeof(MyData_Struct_t));  //myData will be read later by another function

    pBuf->write_idx += 1;
    pBuf->NrOfMessagesinTheQue++;
}

С помощью этого метода вы также можете комбинировать write_idx и NrOfMessageinTheQue, поскольку вам никогда не придется сбрасывать индексдо 0 сейчас.

...