Сейф прерывания "FIFO" для DSP на микроконтроллере STM32 - PullRequest
0 голосов
/ 21 октября 2019

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

1 Ответ

0 голосов
/ 23 октября 2019

В этом случае вам, безусловно, нужно заблокировать мьютекс в вашем fifo. Это не тот случай только , когда вы можете гарантировать атомарное чтение / запись данных в очередь. Кроме того, увеличение / уменьшение вашей индексной переменной может или не может быть атомарным в зависимости от вашей аппаратной платформы и типа данных.

Что касается обработки данных, я не знаю формат ваших данных, поэтому сложно сказать. Я предполагаю, что у вас есть данные фиксированной длины. В этом случае ваш fifo может представлять собой очередь структур (определение данных фиксированной длины) вместо отдельных байтов. Это будет гарантировать, что чтение / запись очереди являются «атомарными» в том смысле, что вы всегда захватываете одну «точку данных» (как бы вы ее ни определяли).

...