ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
20 августа
1536795 Топик полностью
Nikolay_Po (18.08.2025 19:46, просмотров: 92) ответил Nikolay_Po на FreeRTOS. Вывод отладочной информации в UART. Что-то я не справляюсь. Сделал функцию быстрого вывода блока символов в буфер с последующей передачей при помощи DMA. Отладил, работает отлично. Потокобезопасно - быстро и блокирует прерывания в критической секции.
Немного продвинулся. Подробности на форуме FreeRTOS. 

https://forums.freertos.org/t/xstreambufferreceive-portmax-delay-task-moved-to-suspended-and-never-wakes-on-data/23723


Вкратце:


1. Механизм буферов и очередей, не работает потому, что не всегда (по факту - только первый раз) срабатывает механизм блокирующих уведомлений

xTaskGenericNotifyWait().

2. Когда планируется ожидание события с бесконечным таймаутом (в моём случае - ожидание поступления данных из буфера), текущая задача переводится в состояние eSuspended. Так как текущая задача не будет выполняться дальше, требуется переключение контекста (на другую задачу). Вызывается taskYIELD_WITHIN_API().

3. taskYIELD_WITHIN_API() реализовано принудительным вызовом программного прерывания прерывания, буквально NVIC_SetPendingIRQ(Software_IRQn).

4. Оно не срабатывает, так как мы уже (какого хрена?) находимся в прерывании SysTick!


Получается, задача, которая должна быть подвешена на ожидание уведомления из буфера, не останавливается, а продолжает выполняться. А так как по плану, продолжение должно быть уже после уведомления и поступления данных, из ожидания она выключается. Но остаётся eSuspended. Поэтому следующие поступления данных в буфер остаются не обработанными - некому посылать уведомления.