как вариант реализации, можно и на статическом буфере __attribute__((used)) int _write(int fd, char *buf, int size)
{
if (size <= 0) return 0;
size_t sent = xStreamBufferSend( uart_tx_stream, buf, size, 0 );
xTaskNotify(UART1_Task_Handler, 0x10, eSetBits);
return sent;
}
........................................................................
void UART1_task(void *pvParameters)
{
uint32_t notif_bits;
while (1)
{
xTaskNotifyWait(0, 0x10, & notif_bits, portMAX_DELAY);
while (xStreamBufferBytesAvailable(uart_tx_stream) > 0){
uint32_t len = xStreamBufferBytesAvailable(uart_tx_stream);
if (len > 0) {
uint8_t *dma_buf = pvPortMalloc(len);
xStreamBufferReceive(uart_tx_stream, dma_buf, len, 0);
DMA1_Channel4->CFGR &= ~DMA_CFG4_EN;
DMA1->INTFCR = DMA_CTCIF4;
DMA1_Channel4->MADDR = (uint32_t)dma_buf;
DMA1_Channel4->CNTR = (uint16_t)len;
DMA1_Channel4->CFGR |= DMA_CFG4_EN | DMA_CFG4_TCIE;
do {
xTaskNotifyWait(0, 0x08, & notif_bits, portMAX_DELAY);
} while ((notif_bits & 0x08) == 0);
vPortFree(dma_buf);
}
}
}
}
.................................................................