ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
16 августа
1535329 Топик полностью
petrd (12.08.2025 08:25, просмотров: 206) ответил Nikolay_Po на FreeRTOS. Вывод отладочной информации в UART. Что-то я не справляюсь. Сделал функцию быстрого вывода блока символов в буфер с последующей передачей при помощи DMA. Отладил, работает отлично. Потокобезопасно - быстро и блокирует прерывания в критической секции.
как вариант реализации, можно и на статическом буфере 
__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); } } } } .................................................................