GyverOS icon indicating copy to clipboard operation
GyverOS copied to clipboard

Функционал критического флага и перехватчиков событий

Open GeorgNation opened this issue 3 years ago • 3 comments

Я решил пополнить библиотеку возможностью указания критического флага и хуков. Изменения есть в коммитах.

У меня нету отладочной платы, так что если кто-то протестирует и укажет на ошибки, я их поправлю.

GeorgNation avatar Sep 14 '21 12:09 GeorgNation

А можно поподробнее о том, как это будет работать? С коротеньким примером. Пока не очень понял

GyverLibs avatar Sep 14 '21 20:09 GyverLibs

Иногда, требуется делать вызовы процедур сразу перед выполнения какого либо действия над процессом. Это можно сделать путем вызова метода, а затем stop(номер). Однако, в моей реализации такое можно сделать иначе. Я сделал перехватчики вызовов (хуки), каждые из них которые имеют свое предназначение. У меня пока что только две задачи которые эта штука может исполнить (TASK_STOP и критический флаг). TASK_STOP - событие перехватчика, при котором выполняется задание, после чего задача выключается. Есть и CRITICAL_FLAG_KILL. Это более высокоуровневое событие, которое можно нацепить на абсолютно любое событие, но и еще мешает закрытию самой задачи. Теоретически, имея к примеру 5 рабочих задач, можно на одно из них поставить событие TASK_STOP, а на самые важные установить обработчик для CRITICAL_FLAG_KILL, и установить критический флаг на задачу. Установка обработчика CRITICAL_FLAG_KILL необратимое, само событие глобальное.

Пример TASK_STOP:

#include <GyverOS.h>
GyverOS<5> OS;	// указать макс. количество задач

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  
  // подключаем задачи (порядковый номер, имя функции, период в мс)
  OS.attach(0, f1, 400);
  OS.attachHook(0, TASK_STOP, hook);

}

void loop() {
  OS.tick();	// вызывать как можно чаще, задачи выполняются здесь
  OS.stop(0);
}

// обработчики задач
void f1() {
  // выводит свой период в порт
  static uint32_t ms;
  Serial.println(millis() - ms);
  ms = millis();
}

// TASK_STOP обработчик
void hook() {
  Serial.println("Task is stopped.");
}

Пример CRITICAL_FLAG_KILL:

#include <GyverOS.h>
GyverOS<5> OS;	// указать макс. количество задач

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  
  // подключаем задачи (порядковый номер, имя функции, период в мс)
  OS.attach(0, f1, 400);
  OS.attachHook(-1, CRITICAL_FLAG_KILL, hook);
  OS.criticalFlagSet(0, true);
}

void loop() {
  OS.tick();	// вызывать как можно чаще, задачи выполняются здесь
  OS.stop(0);
}

// обработчики задач
void f1() {
  // выводит свой период в порт
  static uint32_t ms;
  Serial.println(millis() - ms);
  ms = millis();
}

// CRITICAL_FLAG_KILL обработчик
void hook() {
  Serial.println(":DDDDDDDDDDDDDDDDDDDDD");
}

GeorgNation avatar Sep 15 '21 06:09 GeorgNation

Нифига не понятно. Можете более нормально по-русски и развернуто объяснить зачем это нужно, для чего, в чем польза?

demosspro avatar Jun 20 '22 06:06 demosspro