Немного продвинулся. Подробности на форуме 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. Поэтому следующие поступления данных в буфер остаются не обработанными - некому посылать уведомления.