Был уже этот несложный вопрос: http://forum.amperka.ru/threads/Программирование.6429/page-3#post-87385
Под "по-честному" имелось в виду, что поток прерывается для возможности выполнения другого потока "в любое время" (есть нюансы), не зависимо от пожеланий прерываемого потока. Т.е. если в потоке выполняется 'delay(1000)', то поток будет прерван не смотря на ожидание, и контроллер займётся выполнением другого потока. Потом, когда наступит очередь выполнения "ожидающего" потока, функция 'delay()' продолжит своё выполнение. В других "не честных" библиотеках, поток сам должен сказать -- "я немного поработал, теперь пусть поработают другие". И если в таком потоке встретиться 'delay', то остальные потоки будут ждать, пока этот 'delay' не завершиться -- вроде бы многопоточность, но на самом деле нет.
Если имеются ввиду вычислительные потоки, без прерывания и только в среде Ардуино, то вот один из вариантов Код (C++): //#1 //#2 //#3 void setup() { //#1 //#2 //#3 } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 1000 миллисекунд вычислит. поток 1 static uint8_t PC_1 = 1 ; static uint32_t future1 = 0 ; if (MILLIS >= future1) { switch (PC1) { case 1: PC_1 = 2; future1 = MILLIS + 1000 ; // сам код break; case 2: PC_1 = 3; future1 = MILLIS + 1000 ; // сам код break; case 3: PC_1 = 1; future1 = MILLIS + 1000 ; // сам код break; } MILLIS = millis() ; } //#2 200 миллисекунд вычислит. поток 2 static uint32_t future2 = 0 ; if (MILLIS >= future2) { future2 = MILLIS + 200 ; // сам код MILLIS = millis() ; } //#3 100 миллисекунд вычислит. поток 3 static uint32_t future3 = 0 ; if (MILLIS >= future3) { future3 = MILLIS + 100 ; // сам код } }
А вам точно нужны именно потоки? Для большинства задач обычно вполне хватает простенького конечного автомата. Лично я бы не стал тянуть к себе в проект какую-нибудь реализацию потоков без серьезной на то необходимости из соображений производительности и экономии памяти. В качестве примера простейшего конечного автомата могу привести свой, который я написал для одного своего проекта: Реализация: https://github.com/KonishchevDmitry/flatmon/blob/master/lib/Util/Util/TaskScheduler.hpp https://github.com/KonishchevDmitry/flatmon/blob/master/lib/Util/Util/TaskScheduler.cpp Пример использования: https://github.com/KonishchevDmitry/flatmon/blob/master/sensor/src/Buzzer.hpp https://github.com/KonishchevDmitry/flatmon/blob/master/sensor/src/Buzzer.cpp
Видел где то описание и реализацию тк называемой ОС для МК, там вот реально потоки и как бы виртуальные машины со своими изолированными кодами и данными. Искать не буду, все есть у гугла. Прикольно и познавательно, но для реальной жизни по мне так расход ресурсов. Работать может и будет, но медленно и непредсказуемо. Да и памяти надо 32Кб минимум, если не ошибаюсь, на козявках типа Тини 13 или 2313 и мечтать нечего. В общем, прерывания и millis() наше все. Мнение изменю, если покажут, что виртуал может то, чего немогут стандартные методы.