-
- Следите! Уже сделано так. Все имеют доступ к printf(), внутри него,
когда сообщение готово, вызывается _write() в котором сообщение
отправляется в завернутый в критическую обертку StreamBufferSend().
В задаче из завернутого в критическую обертку StreamBufferRecieve()
это сообщение копируется, его длина и адрес передается в DMA, пуск
DMA, начинается транзакция в UART, задача ставится на ожидание,
пока от прерывания DMA не придет уведомление о завершении
транзакции. C приходом petrd(503 знак., Вчера, 11:47)
- Начало новой транзакции никак не мешает завершению передачи
предыдущего символа. Вы же, по опустошению буфера DMA, UART не
выключаете? Nikolay_Po(213 знак., Вчера, 12:59)
- Нет, конечно, ничего не выключаю. Похоже на воду дую ....
размышляю, пришло уведомление о завершении транзакции ДМА, а UART
еще передает, задача успела вытащить следующее сообщение, засунула
адрес и длину в ДМА, стартует, а от UART запроса к ДМА еще не
поступало, ну и, значит, стоп, ДМА ждет когда придет запрос от
него. - petrd(Вчера, 13:21)
- Поясню: DMA можно запускать при неготовности периферии. Всего делов-то - DMA будет стоять на первой транзакции, не выполняя её, сохраняя исходное значение счётчика транзакций. Как только ранее положенный в буфер самого UARTа символ протолкнётся в освободившийся сдвиговый регистр, сразу же, по флагу transmit empty, DMA положит первый символ следующей транзакции. Nikolay_Po(372 знак., Вчера, 13:34)
- Стоп DMA никак не влияет на передачу уже поступившего и переданного в свдиговый регистр символа. Так что не переживайте. - Nikolay_Po(Вчера, 13:26)
- Нет, конечно, ничего не выключаю. Похоже на воду дую ....
размышляю, пришло уведомление о завершении транзакции ДМА, а UART
еще передает, задача успела вытащить следующее сообщение, засунула
адрес и длину в ДМА, стартует, а от UART запроса к ДМА еще не
поступало, ну и, значит, стоп, ДМА ждет когда придет запрос от
него. - petrd(Вчера, 13:21)
- Начало новой транзакции никак не мешает завершению передачи
предыдущего символа. Вы же, по опустошению буфера DMA, UART не
выключаете? Nikolay_Po(213 знак., Вчера, 12:59)
- Изобретаем journald вместе. Люблю такое :) - Cкpипaч(Вчера, 10:55)
- Следите! Уже сделано так. Все имеют доступ к printf(), внутри него,
когда сообщение готово, вызывается _write() в котором сообщение
отправляется в завернутый в критическую обертку StreamBufferSend().
В задаче из завернутого в критическую обертку StreamBufferRecieve()
это сообщение копируется, его длина и адрес передается в DMA, пуск
DMA, начинается транзакция в UART, задача ставится на ожидание,
пока от прерывания DMA не придет уведомление о завершении
транзакции. C приходом petrd(503 знак., Вчера, 11:47)