我的第一个想法是使用循环缓冲区。这是一些示例代码。随意调整它以适应您自己的用途。您可能不想要全局变量。你可能不想要#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() 复制到循环缓冲区中。
这段代码的主要特点是它如何处理 add 和 rmv ptr。
一旦你使用上面的代码工作。我建议在某个时候切换所有从硬件读取的内容,以使用平台的直接内存访问API。
切换到直接内存访问很重要,因为上述代码相对于使用几乎零周期的 DMA 使用了很多周期。