我有一个ADC,可读取中断值并将它们存储在FIFO中。
在主程序中,我希望像读取常规数组一样读取整个FIFO,并进行FFT和填充。经过一番思考,我意识到中断可能会在读取过程中发生,并且数据将不再准确。
可以在不禁用中断的情况下完成吗?
[我只找到了push,pop FIFO的示例,尽管我可以使用其中的一个,我想我想知道是否可能。
这是我的代码:
#define SP_FIFO_SIZE 4096
#define SP_BITMASK_SIZE (SP_FIFO_SIZE - 1)
struct sp_fifo_struct{
uint16_t array[SP_FIFO_SIZE];
uint16_t pointer;
};
typedef volatile struct sp_fifo_struct sp_fifo;
void sp_fifo_push(sp_fifo * fifo, uint16_t value){
fifo->array[fifo->pointer] = value;
fifo->pointer = ((fifo->pointer + 1) & SP_BITMASK_SIZE);
}
void sp_fifo_read(sp_fifo * fifo, float32_t array[]){
for(uint16_t i = 0; i < SP_FIFO_SIZE; i++){
array[i] = (float32_t) fifo->array[((fifo->pointer + i) & SP_BITMASK_SIZE)];
}
}
在这种情况下,您当然需要互斥锁定您的fifo。当可以保证对队列进行数据的原子读取/写入时,only并非如此。此外,根据您的硬件平台和数据类型,递增/递减索引变量可以或不可以是原子的。
关于数据处理,我不知道您的数据格式,所以很难说。我假设您有固定长度的数据。如果是这种情况,您的fifo可以是结构队列(定义固定长度的数据),而不是单个字节。这样就可以确保队列的读/写是“原子的”,从某种意义上来说,您总是要抓住一个“数据点”(无论如何定义)。