Посоветуйте простой планировщик задач

Добрый день!

Имеется несколько задач, содержащих задержки. Эти задачи желательно выполнять параллельно (почти), чтобы сократить общее время выполнения. Нужно при входе в функцию задержки времени передавать управление другой задаче.
Посоветуйте какой-нибудь простой планировщик типа кооперативной ОС. Чтоб память особо не грузила. Таймеры не требуются, только ручное переключение между задачами.

Спасибо!

И рыбку съесть, как говорится.

Прощу прощения, если кого задел. Никакого спама.
Функции задержки на millis() реализованы. Нужно при входе в задержку отдать управление другой задаче. В которой тоже есть свои задержки. Общее время выполнения задач хочу сократить.

Спасибо, попробую. Вроде есть все что нужно. И даже с избытком.

Судя по ТЗ - реализованы криво. Наверно через цикл while ?
При правильной реализации задержек на миллис, автоматически будет запускаться та функция, чья задержка кончилась, для этого никакой ОС не требуется

Раскрою немного тему. Это что-то типа метеостанции. Датчики bmp280, aht20, ds18b20 (3 шт.). Питание от батарейки. Включаю их 2 раза в минуту, получаю от них данные, передаю по NRF и снова отрубаю питание. МК в спячке около 1 мкА. При пробуждении датчики инициализирую, запускаю измерение и считываю данные. При инициализации и измерении каждый датчик имеет свои задержки (большие, до 100 мсек, ds18b20 - 750 мсек (их одновременно запускаю на измерение)). Хотел сократить время активности МК за счет выполнения измерения (инициализации) других датчиков в режиме задержек. Батарейка тогда жить дольше будет в разы.

да мы и так поняли.
И что вам мешает запускать одновременно несколько датчиков с разными задержками? Если вы и правда используете миллис, а не только говорите об этом - они все будут работать одновременно, никакой планировщик задач для этого не нужен.

Да, задержка через while

если упрощенно, то:

uint32_t msec = millis();
while (millis() - msec < DELAY) {
// вот тут надо что-то типа next_task();
}

Это никак не отличается от delay(). Ато, что под комментом- вообще за гранью, ибо будет бесконечно выполняться, пока не истечет задержка

задержек несколько у каждого датчика и все разные: после подачи питания, сброса, ст арта измерения и т.д. не хочется все это городить в одном потоке (хотя и можно заморочиться)

это пример того КАК НЕ НАДО использовать миллис.
Ваш цикл while ПОЛНОСТЬЮ аналогичен оператору delay() той же длительности. Аналогичен в том смыcле, что он блокирует контроллер - точно так же как и во время delay(), контроллер в это время ничего выполнять не может.

И, кстати, не надейтесь - с такими циклами вам никакой софтовый планировщик задач не поможет - например код из сообщения 4 с делеями не работает.

я понимаю. идея этого цикла, чтобы в нем передавать управление другому потоку (задаче), которые в своих циклах задержки будут передавать управление следующей задаче. и так по кругу, пока все задачи не завершатся.

это бредятина…

В общем, как я и подозревал - у вас код написан на одних делеях, миллис тут только видимость… Потому вам планировщик и понадобился, что вы смысла миллис не поняли. Лучше разберитесь, вместо того чтоб костыли городить.

ЖДАТЬ выполнение работы каждого датчика - это блокирующий код. Тут не один планировщик не спасет.
Для каждого датчика должен работать экземпляр конечного автомата. Тогда они не будут мешать друг другу и окружающим.

хорошо, как бы вы идейно реализовали инициализацию и измерение на нескольких датчиках?
на семафорах и ивентах? можно, но тяжелый код будет. и мне не нужно выделять временные интервалы для обработки данных. инициализировал, измерил, отправил спать.

нет, идея правильного использования миллис - это при простое (задержке) передавать управление обратно в основной цикл программы - loop(). А основной цикл уже решает, что запустить - то ли еще одну задачу, если время пришло, то ли просто повисеть в пустом цикле, пока делать нечего.
И это все пишется элементарно на основе примера blink without delay из Ардуино ИДЕ

я не понимаю. почему пока первый датчик ждет завершения какого-то процесса, я не могу заниматься вторым датчиком? например, aht20 после старта измерения требует задержки 80 мсек. За это время я успею стартовать и получить данные с bmp280, например

конечно можете. И сможете, если избавитесь от своих while циклов

Читайте про конечные автоматы. Это на ардуино делается элементарно.

Именно так и нужно. Вы просто не понимаете как это сделать простыми средствами С++ без всяких планировщиков?