Для написания программ для микроконтроллера RP2040 я использую среду Arduino IDE. Это возможно, благодаря этому проекту, в котором реализована поддержка всех плат, основанных на RP2040 и RP2350. И частью этого проекта является порт операционной системы FreeRTOS.
Я вчера до глубокой ночи рубился с этим всем, пытаясь понять, почему не получают управление задачи, назначенные на core 0. Все задачи по-умолчанию запускаются на ядре core 1, а если попробовать явно назначит задачу на другое ядро, то она просто не получает управление. И в документации на FreeRTOS, и в исходных кодах написано, что задачи могут работать на обоих ядрах, т.к. в данном случае реализована поддержка FreeRTOS SMP (Symmetric Multi-Processing).
В реальности оказалось, что нужен лёгкий костыль, в виде функции vTaskDelay() или delay(), вызванной из основного «ардуинного» цикла loop() (см. рис. 1). В этом случае всё начинает работать, как заявлено. (Вообще, годится наверное любая функция из состава FreeRTOS API; я на этот эффект наткнулся, отправляя сообщения в очередь прямо из цикла loop()).
Пожалуй, заведу багу на github для этого проекта, чтобы привлечь внимание разработчиков в такой особенности. Оно-же, судя по документации, обязано работать без этого костыля.
