shTaskManager - легкий диспетчер задач для Arduino

Вопщем, это не наша тема, а v258, и не про Даллас, а про задачи. Надо Алехандру сказать, чтоб всё лишнее апчистил

Дет! Мне очень неловко, но на RP2040 есть FreeRTOS, на которой есть треды и очереди уже искаропки. А исчо семафоры мутексы блэкджек и шахматистки!
Там тот же даллас в отдельном потоке просто так, с delay(750) пишеццо. ;)))

Я ж про то и говорю постоянно.Когда помрет последний монстр, с навыками “бега в мешке” и на заводах в урну полетит последний лейаут с 8-ми битником, то куда умище девать станем? ;))

Я так не умею.

Как я понимаю, ОСь это просто удобство. Хотя и свои заморочки тоже.

ну и нахрена городить огород когда можно паразитировать на millis() ?
На C++ я не умею этого делать, но написать в коде ваапще нет проблем…
PS точность условная одна миллисекунда, ну иногда две вполне устроит отцов русской демократии

Так тут и есть “паразитирование на миллис” :wink:

@v258 , а как обстоит дело с пропущенными задачами? Например, задача должна запускаться каждую 1 мс , но вторая задача крутит цикл аж 1.5 мс. Или такого не бывает?
Спросил просто из интереса…

Запустится с опозданием. Но такое лучше не проектировать изначально. Тем более что у миллиса, емнип, дискретность более 1 мс соврал, таки одна единица

Спойлер
void setup() {
  Serial.begin(115200);

}

void loop() {
  static uint32_t data[10];
  static uint32_t timer = 0;
  static uint32_t cur_time;
  cur_time = millis();
  static byte n = 0;
  if(cur_time - timer >= 1)
  {
    timer = cur_time;
    data[n] = cur_time;
    if (++n >= 10)
    {
      n = 0;
      for (byte i = 0; i < 10; i++)
      {
        Serial.print(data[i]);
        Serial.print(",");
      }
      Serial.println();
    }
  }

}

Вывод в сериал

1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,
1015,1016,1017,1018,1019,1020,1021,1022,1024,1025,
1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,
1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,
1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,

Но это на 328 атмеге, да и тут может проскакивать (см. вторую строку вывода)

1 лайк

Я шутки понимаю только свои!!!
Я ж ведь и в самом деле показывать начну ;))). Тока на ЕСП, у меня PR нет сейчас.

Давеча крутил индикацию, зарядил таймер на 500 мкс, отлично. Но, нужно следить за кнопкой и считать время при этом. И всё бы хорошо, но нужно ещё сохраняться в ЕЕПРОМ ежеминутно. А вот тут нужно и подумать.) Какие решения?

Например:

shTaskManager tasks(1);

shHandle save_eeprom; // идентификатор задачи, по которому ею можно управлять; по сути это индекс задачи в списке

void saveEEPROM()
{
// здесь сохраняешься
}

void setup()
{
  save_eeprom = tasks.addTask(60000, saveEEPROM);
}

void loop()
{
  tasks.tick()
}

ОК. Вижу что автоматом сохраняешься каждые 60 сек?
А время на сохранение учитываешь? А мне ведь общее время ещё нужно считать.

Как напишешь, так и будет

Ну да, и я ведь про то же.)
Микроса нет. Заряжаю таймер на 500 мкс, по нему делаю индикацию, он же системный тик. Однако, при записи в ЕЕПРОМ получается что тик замедляется. Ага?

Нужен механизм хранения состояния для каждой задачи. Глобальные переменные убивают весь смысл.

Каждая задача имеет свой флаг. Доступ только через геттеры и сеттеры. Никаких глобальных переменных.

печально

Почему?

Тик срабатывает при каждом проходе лупа. Если что-то замедляет этот проход, то и тик сработает чуть позже. Тут как бэ выше головы не прыгнешь.

Ну да, это понятно. Когда есть что то типа millis() проблем нет, но если приходится считать самому…