Сравнение планировщика для Arduino Uno

Я понимаю, что официальный планировщик Arduino не поддерживает Uno, и есть несколько сторонних планировщиков, чтобы заполнить этот пробел , в частности Scheduler, Arduino-Scheduler и TaskScheduler. Вероятно, их гораздо больше, хотя я вижу, что многие так называемые "планировщики задач" на самом деле являются просто периодическими вызовами функций, которые не обрабатывают контекст (то есть не поддерживают yield()).

Мне нужно сделать выбор планировщика для использования в проекте (реальный, с выходом, а не периодический вызывающий функцию). Есть ли какое-нибудь сравнение планировщиков задач Arduino? Меня особенно интересуют следующие аспекты:

  • время переключения контекста (самое важное)
  • Оценка потребления оперативной памяти/ПЗУ
  • список поддерживаемых плат

, 👍4

Обсуждение

Arduino опубликовал это в Facebook несколько недель назад https://hackaday.com/2021/03/17/running-57-threads-at-once-on-the-arduino-uno/?fbclid=IwAR0r7ot5Yz6MYjDLW6d5_rPAbfLXv_bCqoO869QKmjz0qN1zvYtmUw1Wf8U, @Juraj

@Juraj Это, похоже, еще один бегун с циклическими функциями без обработки контекста. Вы просто не можете разместить 57 отдельных стеков в 2k оперативной памяти., @Dmitry Grigoryev


1 ответ


1

Я только что протестировал vbextreme/Scheduler и Arduino-Scheduler, используя следующий код:

#include <Scheduler.h> 

void setup() {
  pinMode(3, OUTPUT);
  Scheduler.startLoop(loop2);
}

void loop() {
  digitalWrite(3, LOW);
  yield();
  digitalWrite(3, HIGH);
  yield();
}

void loop2() {
  yield();
}

Без каких-либо строк планировщика код занимает 734 байта ПЗУ, 9 байт ОЗУ, а вывод переключается с периодом 8,5 us (117 кГц). Приведенные ниже цифры представляют собой дополнительное время ПЗУ/ОЗУ/выполнения:

  • vbextreme/Scheduler занимает дополнительные 1676 байт ПЗУ, 70 байт оперативной памяти, а контекстный переключатель занимает 15,5 us (частота переключения 14,18 кГц). Похоже, он поддерживает только платы AVR/SAMD.

  • vbextreme/Scheduler с CONFIG_AVR_OPTIMIZE_COOPERATIVE, установленным на 1, занимает дополнительные 1568 байт ПЗУ, 70 байт ОЗУ, а контекстный переключатель занимает 11 us (частота переключения 19,07 кГц).

  • Arduino-Планировщик занимает дополнительно 578 байт ПЗУ, 44 байта оперативной памяти, а контекстный переключатель занимает 10,6 us (частота переключения 19,59 кГц). Он поддерживает AVR/SAMD и некоторые платы Teensy/STM32. Похоже, что этот планировщик несовместим с задачами, использующими malloc().

  • CopyThreads занимает дополнительные 2148 байт ПЗУ, 41 байт ОЗУ, а контекстный переключатель занимает 54,5 us (частота переключения 4,417 кГц). Этот планировщик утверждает, что имеет преимущество использования одного стека, поэтому до тех пор, пока задачи не уступают друг другу во время пикового использования стека, каждая задача имеет в своем распоряжении практически весь стек.

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

,