Я работаю над двойным буфером для 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 */
}
}
}