Skip to content

Commit 2388392

Browse files
jepenven-silabspull[bot]
authored andcommitted
Fix blocking uart (#25919)
1 parent 15e3bd2 commit 2388392

File tree

1 file changed

+6
-20
lines changed

1 file changed

+6
-20
lines changed

examples/platform/silabs/efr32/uart.cpp

+6-20
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,13 @@ uint8_t sUartTxQueueBuffer[UART_MAX_QUEUE_SIZE * sizeof(UartTxStruct_t)];
130130
static StaticQueue_t sUartTxQueueStruct;
131131
static QueueHandle_t sUartTxQueue;
132132

133-
static EventGroupHandle_t sUartEventGroup;
134-
static StaticEventGroup_t sUartEventGroupStruct;
135-
136133
// Rx buffer for the receive Fifo
137134
static uint8_t sRxFifoBuffer[MAX_BUFFER_SIZE];
138135
static Fifo_t sReceiveFifo;
139136

140137
static void UART_rx_callback(UARTDRV_Handle_t handle, Ecode_t transferStatus, uint8_t * data, UARTDRV_Count_t transferCount);
141-
// static void UART_tx_callback(struct UARTDRV_HandleData * handle, Ecode_t transferStatus, uint8_t * data,
142-
// UARTDRV_Count_t transferCount);
138+
static void UART_tx_callback(struct UARTDRV_HandleData * handle, Ecode_t transferStatus, uint8_t * data,
139+
UARTDRV_Count_t transferCount);
143140
static void uartSendBytes(uint8_t * buffer, uint16_t nbOfBytes);
144141

145142
static bool InitFifo(Fifo_t * fifo, uint8_t * pDataBuffer, uint16_t bufferSize)
@@ -266,17 +263,10 @@ void uartConsoleInit(void)
266263
UARTDRV_Receive(vcom_handle, sRxDmaBuffer, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
267264
UARTDRV_Receive(vcom_handle, sRxDmaBuffer2, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
268265

269-
uint32_t struct_size = sizeof(UartTxStruct_t);
270-
271-
sUartTxQueue = xQueueCreateStatic(UART_MAX_QUEUE_SIZE, struct_size, sUartTxQueueBuffer, &sUartTxQueueStruct);
272-
273-
sUartEventGroup = xEventGroupCreateStatic(&sUartEventGroupStruct);
274-
275-
// Start App task.
266+
sUartTxQueue = xQueueCreateStatic(UART_MAX_QUEUE_SIZE, sizeof(UartTxStruct_t), sUartTxQueueBuffer, &sUartTxQueueStruct);
276267
sUartTaskHandle = xTaskCreateStatic(uartMainLoop, UART_TASK_NAME, UART_TASK_SIZE, nullptr, 30, uartStack, &uartTaskStruct);
277268

278269
assert(sUartTaskHandle);
279-
assert(sUartEventGroup);
280270
assert(sUartTxQueue);
281271

282272
// Enable USART0/EUSART0 interrupt to wake OT task when data arrives
@@ -322,10 +312,7 @@ void UART_tx_callback(struct UARTDRV_HandleData * handle, Ecode_t transferStatus
322312
{
323313
BaseType_t xHigherPriorityTaskWoken;
324314

325-
if (xEventGroupSetBitsFromISR(sUartEventGroup, UART_TX_COMPLETE_BIT, &xHigherPriorityTaskWoken) == pdPASS)
326-
{
327-
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
328-
}
315+
vTaskNotifyGiveFromISR(sUartTaskHandle, &xHigherPriorityTaskWoken) portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
329316
}
330317

331318
/*
@@ -485,9 +472,8 @@ void uartSendBytes(uint8_t * buffer, uint16_t nbOfBytes)
485472
pre_uart_transfer();
486473
#endif /* EFR32MG24 && WF200_WIFI */
487474

488-
// TODO FIXME Swap to iostream driver since UARTDRV is deprecated.
489-
// TODO Do no use blocking transmit (hotfix).
490-
UARTDRV_TransmitB(vcom_handle, (uint8_t *) buffer, nbOfBytes);
475+
UARTDRV_Transmit(vcom_handle, (uint8_t *) buffer, nbOfBytes, UART_tx_callback);
476+
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
491477

492478
#if (defined(EFR32MG24) && defined(WF200_WIFI))
493479
post_uart_transfer();

0 commit comments

Comments
 (0)