Моей первой мыслью было бы использовать круговые буферы. Вот пример кода. Не стесняйтесь адаптировать это к своим собственным потребностям. Вы, вероятно, не хотели бы глобальные переменные. И вы можете не захотеть #defines:
#define LENGTH (1024)
#define MASK (LENGTH-1)
uint8 circularBuffer[ LENGTH ];
int circularBuffer_add = 0;
int circularBuffer_rmv = 0;
void copyIn( uint8 * circularBuffer, uint8 * inputBuffer, int n ) {
int i;
for( i = 0; i < n; i++ ) {
circularBuffer[ circularBuffer_add ] = inputBuffer[ i ];
circularBuffer_add = ( circularBuffer_add + 1 ) & MASK;
}
}
void copyOut( uint8 * circularBuffer, uint8 * outputBuffer, int n ) {
int i;
for( i = 0; i < n; i++ ) {
outputBuffer[ i ] = circularBuffer[ circularBuffer_rmv ];
circularBuffer_rmv = ( circularBuffer_rmv + 1 ) & MASK;
}
}
Также в приведенном выше коде предполагается, что ваша единица данных имеет тип данных "uint8". Вы можете изменить его, чтобы он использовал другой тип данных. Или вы даже можете сделать его универсальным и использовать memcpy () для копирования в циркулярный буфер.
Главной особенностью этого кода является то, как он обрабатывает ptr для add и rmv.
Как только вы начнете работать с приведенным выше кодом. Я предлагаю в какой-то момент переключить все ваши операции чтения с аппаратного обеспечения, чтобы использовать прямой доступ к памяти API .
вашей платформы.
Важно переключиться на прямой доступ к памяти, поскольку в приведенном выше коде используется много циклов относительно DMA , который использует почти нулевые циклы.