У меня есть АЦП, который читает значения в прерывании и сохраняет их в 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)];
}
}