Протопотоки 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);
}

Кто-нибудь считает что-то, что бросается в глаза, недостающим или неправильным?

, 👍0

Обсуждение

Что такое sleep()?, @Majenko


2 ответа


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


0

Зачем изобретать велосипед? Есть библиотеки, которые могут сделать это за вас. Например ArduinoThread. Я попробовал и мне не пришлось искать дальше. Также существуют Wiring и SoftTimer но я их не пробовал.

,