ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
16 августа
1535765 Топик полностью
Nikolay_Po (14.08.2025 13:55, просмотров: 58) ответил EmbedProg на Перечитайте еще раз документацию на xStreamBufferReceive() где сразу же сверху написано NOTE: Судя по вашему коду выполянется vTaskSuspendAll(), но это ничего не дает и не является сериализацией доступа ("последовательнизацией" для записывающих потоков). Судя по всему, xStreamBuffer не потокобезопасный и у вас просто "ломается", приходит во внутреннее неконсистентное состояние. И там же, прямо написано как нужно сделать чтобы он работал нормально. "One way to achieve such
Есть и другое мнение: 

https://t.me/riscv_mcu/170203

а почему здесь вместо critical section не используется vTaskSuspendAll() и xTaskResumeAll() ?
просто critical section выключает прерывания, а в xStreamBufferSend() происходит копирование из одного буфера в другой
приостановка планировщика только на время отключает смену контекста, но прерывания обрабатываться будут
и разве самой функцией xStreamBufferSend() не гарантируется атомарность копирования? Наверняка там уже внутри копирование производится с помощью этого механизма


Ну и, собственно, всё началось с реализации, где я действительно использовал критические секции. Но проблема с непробуждением задачи была изначально.

Я шагаю отладчиком по инструкциям кода. Никаких прерываний, с момента входа в xStreamBufferSend(), никаких переключений контекста не случается - всё укладывается во время одного тика. Тем не менее, задача не пробуждается.