Мучаюсь с millis()

И что мешает вызывать только функции с четырьмя параметрами, и каждой из них возвращать булевый результат?

Во-первых это могут быть не твои функции. А функции из стороннего кода (библиотеки), сигнатуру которых разрабатываешь не сам.

Во-вторых - в чем выигрыш? switch-case компилируется в тот же самый прыжок по адресу в массиве, а читабельность конструкции лучше.

Не всегда. Сильно зависит от содержания case.

А зачем? Ради спортивного интереса?

Товарищи ученые…

а RTOS не предлагать?

Почему бы и нет? Выкладывай :grinning_face_with_smiling_eyes:

не проверял, не на чем сейчас

#include <Arduino_FreeRTOS.h>

void TaskBlink1(void *pvParameters);
void TaskBlink2(void *pvParameters);
void TaskBlink3(void *pvParameters);

void setup() {

  Serial.begin(9600);
  
  xTaskCreate(TaskBlink1, "Task1", 128, NULL, 1, NULL);
  xTaskCreate(TaskBlink2, "Task2 ", 128, NULL, 1, NULL);
  xTaskCreate(TaskBlink3, "Task3 ", 128, NULL, 1, NULL);

  vTaskStartScheduler();
}

void loop() {
}

void TaskBlink1(void *pvParameters) {
  while (1) {
    vTaskDelay(5000 / portTICK_PERIOD_MS);
    Serial.println("Task1");
  }
}
void TaskBlink2(void *pvParameters) {
  while (1) {
    vTaskDelay(10000 / portTICK_PERIOD_MS);
    Serial.println("Task2");
  }
}
void TaskBlink3(void *pvParameters) {
  while (1) {
    vTaskDelay(15000 / portTICK_PERIOD_MS);
    Serial.println("Task3");
  }
}

это так, без проверок всяких коллизий и т.д.

3 лайка

На нано не компилируется

Detecting libraries used...
/home/vladimir/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -I/home/vladimir/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino -I/home/vladimir/.arduino15/packages/arduino/hardware/avr/1.8.6/variants/eightanaloginputs /tmp/arduino/sketches/918D4EC6730BC9146D8484343029FA23/sketch/test.ino.cpp -o /dev/null
Alternatives for Arduino_FreeRTOS.h: []
ResolveLibrary(Arduino_FreeRTOS.h)
  -> candidates: []

Used platform Version Path
arduino:avr   1.8.6   /home/vladimir/.arduino15/packages/arduino/hardware/avr/1.8.6
Error during build: exit status 1
[Warning] Failed to generate IntelliSense configuration.
[Error] Verifying sketch 'test.ino': Exit with code=1

Такое впечатление, что библиотеки нет

Предупреждать надо ))

1 лайк

Но можно и проще ))

#include <shTaskManager.h> // https://github.com/VAleSh-Soft/shTaskManager

#define timer_1 5000ul // первый интервал
#define timer_2 5000ul // второй интервал
#define timer_3 5000ul // третий интервал

void print_1();
void print_2();
void print_3();

shTaskManager tasks(3);

shHandle timer1;
shHandle timer2;
shHandle timer3;

void print_1()
{
  tasks.stopTask(timer1);
  tasks.startTask(timer2);
  Serial.print("Print_1");
}

void print_2()
{
  tasks.stopTask(timer2);
  tasks.startTask(timer3);
  Serial.print("Print_2");
}

void print_3()
{
  tasks.stopTask(timer3);
  tasks.startTask(timer1);
  Serial.print("Print_3");
}

void setup()
{
  Serial.begin(9600);

  timer1 = tasks.addTask(timer_1, print_1);
  timer2 = tasks.addTask(timer_2, print_2, false);
  timer3 = tasks.addTask(timer_3, print_3, false);
}

void loop()
{
  tasks.tick();
}

Мда, а память как не в себя жрет :sweat_smile:

скока?
покажи вывод.
у Деда вроде еще был сшуделер.

FreeRTOS

Скетч использует 7922 байт (25%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 377 байт (18%) динамической памяти, оставляя 1671 байт для локальных переменных. Максимум: 2048 байт.

Мой вариант с диспетчером задач

Скетч использует 2758 байт (8%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 224 байт (10%) динамической памяти, оставляя 1824 байт для локальных переменных. Максимум: 2048 байт.

Тоже многовато, но не настолько же ))

Там свои заморочки…

:rofl: Когда дойдешь до уровня отправки-получении данных по https через wifi, например в телегу, ты сильно удивишься, сколько там жрёт памяти.

но этож задачи для других МК.
а что ЕСП, с ее мегабайтами, уже не справляется?

Так оно и без отправки в телегу жрет почти столько же.

1 лайк

Ни капли не удивлюсь. Ибо такие вещи не на 328 атмеге делаются, а на esp совсем другие объемы