Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

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

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

GeorgNation
Copy link

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

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

Добавил перехватчики событий, а также функцию критического флага.
@GeorgNation GeorgNation marked this pull request as draft September 14, 2021 13:07
@GeorgNation GeorgNation marked this pull request as ready for review September 14, 2021 13:08
@GyverLibs
Copy link
Owner

GyverLibs commented Sep 14, 2021

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

@GeorgNation GeorgNation marked this pull request as draft September 15, 2021 05:48
@GeorgNation GeorgNation marked this pull request as ready for review September 15, 2021 05:48
@GeorgNation
Copy link
Author

Иногда, требуется делать вызовы процедур сразу перед выполнения какого либо действия над процессом. Это можно сделать путем вызова метода, а затем 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");
}

@demosspro
Copy link

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

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants