-
- Обычно при попытке открыть во втором терминале порта, открытого в
первом терминале второй терминал будет ругаться. Что не так?
Отсутствие "одновременного" доступа к чему? К UART? Так он только с
каналом ДМА взаимодействует, больше ни с кем. А данные в ДМА
поставляет единственный приемник
xStreamBufferReceive(uart_tx_stream....) завернутый в критическую
секцию, в который данные шлет единственный передатчик
xStreamBufferSend( uart_tx_stream, .....) тоже завернутый в petrd(126 знак., 14.08.2025 10:38)
- не хотите понимать. во время передачи (пока речь о) в USART из
буфера, как с FIFO, так и с DMA, весь этот ресурс должен быть
заблокирован. дальше можно не развивать. кто-то блокирует
заворачиванием в критическую секцию. ТС пишет о дебаг-выхлопе из
тучи задач. хорошо хоть не из обработчиков прерываний. если ресурс
захвачен одной задачей, то в другой можно либо отказаться, либо
ждать освобождения ресурса, либо отправить в программное устройство
отложенной отправки в. когда Vit(62 знак., 14.08.2025 11:34)
- Хочу понимать! Но не все понятно. Вы говорите "во время передачи
(пока речь о) в USART из буфера, как с FIFO, так и с DMA, весь этот
ресурс должен быть заблокирован" о каком ресурсе? О ДМА? Он
заблокирован. Я не теоретически, а практический разговор веду в
железе, независимо от топикстартера. - petrd(14.08.2025 11:49)
- ваша аналогия насчёт принтера не учитывает наличие службы спулера
печати (в винде Print Spooler). да были prn и lptx, а с ними как-то
употреблялись copy/type/print, но уже давно перешли на
использование именно службы печати - Vit(14.08.2025 12:33)
- Хорошо, без аналогий. Цель, изо всех мест программы, где требуется
вывод, без оглядки на FreeRTOS, писать printf() и получать вывод в
терминале. Говорю исключительно про МК. - petrd(14.08.2025 15:26)
- никто не мешает так писать:). но есть нюансы. при использовании без вытеснения (в т.ч. всяких вызовов в обработчиках прерываний) нужно, чтобы уход последнего байта контроллировался по TXC (если RS485 - аналогично снятию DE). при использовании DMA это не всегда решаемо без дополнительных сложностей, потому как событие окончания отправки по DMA возникает чуть раньше факического ухода байта. потому возникают варианты с расчетными таймаутами и т.п.. при вытеснении же всё то же, Vit(503 знак., Вчера, 08:38)
- Хорошо, без аналогий. Цель, изо всех мест программы, где требуется
вывод, без оглядки на FreeRTOS, писать printf() и получать вывод в
терминале. Говорю исключительно про МК. - petrd(14.08.2025 15:26)
- ваша аналогия насчёт принтера не учитывает наличие службы спулера
печати (в винде Print Spooler). да были prn и lptx, а с ними как-то
употреблялись copy/type/print, но уже давно перешли на
использование именно службы печати - Vit(14.08.2025 12:33)
- Хочу понимать! Но не все понятно. Вы говорите "во время передачи
(пока речь о) в USART из буфера, как с FIFO, так и с DMA, весь этот
ресурс должен быть заблокирован" о каком ресурсе? О ДМА? Он
заблокирован. Я не теоретически, а практический разговор веду в
железе, независимо от топикстартера. - petrd(14.08.2025 11:49)
- не хотите понимать. во время передачи (пока речь о) в USART из
буфера, как с FIFO, так и с DMA, весь этот ресурс должен быть
заблокирован. дальше можно не развивать. кто-то блокирует
заворачиванием в критическую секцию. ТС пишет о дебаг-выхлопе из
тучи задач. хорошо хоть не из обработчиков прерываний. если ресурс
захвачен одной задачей, то в другой можно либо отказаться, либо
ждать освобождения ресурса, либо отправить в программное устройство
отложенной отправки в. когда Vit(62 знак., 14.08.2025 11:34)
- Обычно при попытке открыть во втором терминале порта, открытого в
первом терминале второй терминал будет ругаться. Что не так?
Отсутствие "одновременного" доступа к чему? К UART? Так он только с
каналом ДМА взаимодействует, больше ни с кем. А данные в ДМА
поставляет единственный приемник
xStreamBufferReceive(uart_tx_stream....) завернутый в критическую
секцию, в который данные шлет единственный передатчик
xStreamBufferSend( uart_tx_stream, .....) тоже завернутый в petrd(126 знак., 14.08.2025 10:38)