STM32 MCU上DSP的中断安全“ FIFO”

问题描述 投票:0回答:1

我有一个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)];
    }
}
interrupt stm32 race-condition fifo critical-section
1个回答
0
投票

在这种情况下,您当然需要互斥锁定您的fifo。当可以保证对队列进行数据的原子读取/写入时,only并非如此。此外,根据您的硬件平台和数据类型,递增/递减索引变量可以或不可以是原子的。

关于数据处理,我不知道您的数据格式,所以很难说。我假设您有固定长度的数据。如果是这种情况,您的fifo可以是结构队列(定义固定长度的数据),而不是单个字节。这样就可以确保队列的读/写是“原子的”,从某种意义上来说,您总是要抓住一个“数据点”(无论如何定义)。

© www.soinside.com 2019 - 2024. All rights reserved.