Сравнение планировщика для Arduino Uno
Я понимаю, что официальный планировщик Arduino не поддерживает Uno, и есть несколько сторонних планировщиков, чтобы заполнить этот пробел , в частности Scheduler, Arduino-Scheduler и TaskScheduler. Вероятно, их гораздо больше, хотя я вижу, что многие так называемые "планировщики задач" на самом деле являются просто периодическими вызовами функций, которые не обрабатывают контекст (то есть не поддерживают yield()
).
Мне нужно сделать выбор планировщика для использования в проекте (реальный, с выходом
, а не периодический вызывающий функцию). Есть ли какое-нибудь сравнение планировщиков задач Arduino? Меня особенно интересуют следующие аспекты:
- время переключения контекста (самое важное)
- Оценка потребления оперативной памяти/ПЗУ
- список поддерживаемых плат
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, поэтому буду благодарен, если кто-то опубликует ответ с участием планировщиков, которые я не тестировал.
- Метод должен запускаться каждый час
- Оценка загрузки ЦП планировщика задач
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
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