GyverOS
GyverOS copied to clipboard
Функционал критического флага и перехватчиков событий
Я решил пополнить библиотеку возможностью указания критического флага и хуков. Изменения есть в коммитах.
У меня нету отладочной платы, так что если кто-то протестирует и укажет на ошибки, я их поправлю.
А можно поподробнее о том, как это будет работать? С коротеньким примером. Пока не очень понял
Иногда, требуется делать вызовы процедур сразу перед выполнения какого либо действия над процессом. Это можно сделать путем вызова метода, а затем 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");
}
Нифига не понятно. Можете более нормально по-русски и развернуто объяснить зачем это нужно, для чего, в чем польза?