Skip to content

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

New issue

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

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

Already on GitHub? Sign in to your account

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

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

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

Successfully merging this pull request may close these issues.

3 participants