Имеется несколько задач, содержащих задержки. Эти задачи желательно выполнять параллельно (почти), чтобы сократить общее время выполнения. Нужно при входе в функцию задержки времени передавать управление другой задаче.
Посоветуйте какой-нибудь простой планировщик типа кооперативной ОС. Чтоб память особо не грузила. Таймеры не требуются, только ручное переключение между задачами.
Прощу прощения, если кого задел. Никакого спама.
Функции задержки на millis() реализованы. Нужно при входе в задержку отдать управление другой задаче. В которой тоже есть свои задержки. Общее время выполнения задач хочу сократить.
Судя по ТЗ - реализованы криво. Наверно через цикл while ?
При правильной реализации задержек на миллис, автоматически будет запускаться та функция, чья задержка кончилась, для этого никакой ОС не требуется
Раскрою немного тему. Это что-то типа метеостанции. Датчики bmp280, aht20, ds18b20 (3 шт.). Питание от батарейки. Включаю их 2 раза в минуту, получаю от них данные, передаю по NRF и снова отрубаю питание. МК в спячке около 1 мкА. При пробуждении датчики инициализирую, запускаю измерение и считываю данные. При инициализации и измерении каждый датчик имеет свои задержки (большие, до 100 мсек, ds18b20 - 750 мсек (их одновременно запускаю на измерение)). Хотел сократить время активности МК за счет выполнения измерения (инициализации) других датчиков в режиме задержек. Батарейка тогда жить дольше будет в разы.
да мы и так поняли.
И что вам мешает запускать одновременно несколько датчиков с разными задержками? Если вы и правда используете миллис, а не только говорите об этом - они все будут работать одновременно, никакой планировщик задач для этого не нужен.
задержек несколько у каждого датчика и все разные: после подачи питания, сброса, ст арта измерения и т.д. не хочется все это городить в одном потоке (хотя и можно заморочиться)
это пример того КАК НЕ НАДО использовать миллис.
Ваш цикл while ПОЛНОСТЬЮ аналогичен оператору delay() той же длительности. Аналогичен в том смыcле, что он блокирует контроллер - точно так же как и во время delay(), контроллер в это время ничего выполнять не может.
И, кстати, не надейтесь - с такими циклами вам никакой софтовый планировщик задач не поможет - например код из сообщения 4 с делеями не работает.
я понимаю. идея этого цикла, чтобы в нем передавать управление другому потоку (задаче), которые в своих циклах задержки будут передавать управление следующей задаче. и так по кругу, пока все задачи не завершатся.
В общем, как я и подозревал - у вас код написан на одних делеях, миллис тут только видимость… Потому вам планировщик и понадобился, что вы смысла миллис не поняли. Лучше разберитесь, вместо того чтоб костыли городить.
ЖДАТЬ выполнение работы каждого датчика - это блокирующий код. Тут не один планировщик не спасет.
Для каждого датчика должен работать экземпляр конечного автомата. Тогда они не будут мешать друг другу и окружающим.
хорошо, как бы вы идейно реализовали инициализацию и измерение на нескольких датчиках?
на семафорах и ивентах? можно, но тяжелый код будет. и мне не нужно выделять временные интервалы для обработки данных. инициализировал, измерил, отправил спать.
нет, идея правильного использования миллис - это при простое (задержке) передавать управление обратно в основной цикл программы - loop(). А основной цикл уже решает, что запустить - то ли еще одну задачу, если время пришло, то ли просто повисеть в пустом цикле, пока делать нечего.
И это все пишется элементарно на основе примера blink without delay из Ардуино ИДЕ
я не понимаю. почему пока первый датчик ждет завершения какого-то процесса, я не могу заниматься вторым датчиком? например, aht20 после старта измерения требует задержки 80 мсек. За это время я успею стартовать и получить данные с bmp280, например