Протопотоки Arduino на примере
Я пытаюсь заставить Arduino работать с Protothreads и хочу убедиться, что основные настройки выполнены правильно. Если я правильно понял API, то мне нужен следующий код для запуска двух параллельных потоков из программы Arduino:
#include <pt.h>
static struct pt t1, t2;
void setup() {
PT_INIT(&t1);
PT_INIT(&t2);
}
void loop() {
doSomething(&t1, 500);
doSomethingElse(&t2, 500);
}
static int doSomething(struct pt *pt, int interval) {
PT_BEGIN(pt);
sleep(100);
PT_END(pt);
}
static int doSomethingElse(struct pt *pt, int interval) {
PT_BEGIN(pt);
sleep(250);
PT_END(pt);
}
Кто-нибудь считает что-то, что бросается в глаза, недостающим или неправильным?
@smeeb, 👍0
Обсуждение2 ответа
Проверьте этот пример: вместо sleep() он использует PT_WAIT_UNTIL
while(1) {
PT_WAIT_UNTIL(pt, millis() - timestamp > interval );
timestamp = millis();
doSomething();
}
Это должен быть протопотоковый способ ожидания: PT_WAIT_UNTIL гарантирует, что ваш поток будет спать таким образом, чтобы другие потоки могли работать.
Остальное выглядит хорошо, но я не пробовал запускать код.
Просто для того, чтобы добавить понимания (или путаницы), PT_WAIT_UNTIL блокирует выполнение или "уступает" другим потокам. Вы можете увидеть его отличие от sleep
, который блокирует всех. while(1)
снова "возвращает в действие" поток, как только dosomething()
завершает работу. Вот немного хакерства с switch-while на C. (см. http://dunkels.com/adam/pt/expansion.html), @Zhe Hu
Зачем изобретать велосипед? Есть библиотеки, которые могут сделать это за вас. Например ArduinoThread. Я попробовал и мне не пришлось искать дальше. Также существуют Wiring и SoftTimer но я их не пробовал.
- Как объявить массив переменного размера (глобально)
- Как создать несколько запущенных потоков?
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
Что такое
sleep()
?, @Majenko