Обработка UART ISR во время двойной замены буфера - PullRequest
1 голос
/ 14 мая 2019

Я работаю над двойным буфером для UART на процессоре STM32F.В приведенном ниже примере данные добавляются в буфер каждый раз при запуске UART ISR.Затем этот буфер заменяется, когда основной процесс хочет извлечь из него данные.

Меня беспокоит возможное состояние угла.ISR может сработать после того, как я поменял местами буферы, но до того, как сбросил счетчик приемных буферов.Это будет означать, что мой размер буфера и число будут не синхронизированы.

Каков наилучший способ обработки этого углового случая?

uint8_t rxBufferA[MAX_RX_BUFFER_SIZE];
uint8_t rxBufferB[MAX_RX_BUFFER_SIZE];
uint8_t *receivingBuffer;
uint8_t *processingBuffer;
volatile uint32_t rxBufferSize;

uart_isr() {
  receivingBuffer[rxBufferSize++] = RECEIVE_DATA_REGISTER
}


main() {

  receivingBuffer = &rxBufferA;
  processingBuffer = &rxBufferB;

  while(1) {

    if (rxBufferSize > 0) {
      uint32_t i = 0;
      uint8_t *ptemp = receivingBuffer;
      uint8_t bufferSize = 0;

      /* zero out processing buffer */
      memset(processingBuffer, 0, MAX_RX_BUFFER_SIZE);

      /* swap receiving and processing buffers */
      receivingBuffer = processingBuffer
      processingBuffer = ptemp;

      /* WHAT IF THE ISR FIRES HERE??? */         

      /* save off buffer size and reset count */
      bufferSize = rxBufferSize;
      rxBufferSize = 0;

      /* process rx data */
    } 
  }
}

1 Ответ

4 голосов
/ 15 мая 2019

вам нужен критический раздел.отключить пользовательское прерывание при замене буфера.

Кстати обнуление не требуется

...