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
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ GyverOS<5> OS; // указать макс. количество задач
void tick(); // тикер. Вызывать как можно чаще
void attach(int num, void (*handler)(), uint32_t prd = 0); // подключить функцию обработчик задачи
void detach(int num); // отключить функцию обработчик задачи
void attachHook(int num, uint32_t event, void (*hookHandler)()); // подключить функцию перехватчика (Для CRITICAL_FLAG_KILL нужно использовать номер задачи -1!!)
void detachHook(int num); // отключить функцию перехватчика
void criticalFlagSet(int num, bool critical); // флаг критической задачи
void setPeriod(int num, uint32_t prd); // установить период для задачи
void start(int num); // запустить задачу
void restart(int num); // перезапустить задачу
Expand All @@ -60,8 +63,14 @@ uint32_t getMaxLoopTime(); // получить максимальное
void enableLoad(uint32_t loadp); // включить измерение загруженности процессора за указанный период в мс
void disableLoad(); // отключить измерение загруженности процессора
int getLoad(); // получить загруженность процессора в процентах

// Константы
const uint32_t TASK_STOP = 0; // Перехватчик события закрытия задачи. Если задача прекращается, то будет выполнено действие и задача будет остановлена.
const uint32_t CRITICAL_FLAG_KILL = 1; // Глобальный перехватчик события закрытия задачи с критическим флагом.
```

**Критический флаг** позволяет отметить те задачи, остановка которых нежелательная. При наличии перехватчика, функционал критического флага будет работать. При завершении задачи, она не остановится, но будет вызван обработчик. Данный обработчик глобальный, если нужно что-бы он был местным, и задача останавливалась, использовать надо TASK_STOP.

<a id="example"></a>
## Пример
Остальные примеры смотри в **examples**!
Expand Down Expand Up @@ -127,4 +136,4 @@ void f3() {
<a id="feedback"></a>
## Баги и обратная связь
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [[email protected]](mailto:[email protected])
Библиотека открыта для доработки и ваших **Pull Request**'ов!
Библиотека открыта для доработки и ваших **Pull Request**'ов!
7 changes: 6 additions & 1 deletion keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ GyverOS KEYWORD1
tick KEYWORD2
attach KEYWORD2
detach KEYWORD2
attachHook KEYWORD2
detachHook KEYWORD2
criticalFlagSet KEYWORD2
setPeriod KEYWORD2
start KEYWORD2
restart KEYWORD2
Expand All @@ -33,4 +36,6 @@ disableLoad KEYWORD2
# Constants (LITERAL1)
#######################################

OS_BENCH LITERAL1
OS_BENCH LITERAL1
TASK_STOP LITERAL1
CRITICAL_FLAG_KILL LITERAL1
57 changes: 57 additions & 0 deletions src/GyverOS.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@
// раскомментировать для использования бенчмарка
//#define OS_BENCH

const uint32_t TASK_STOP = 0; // Перехватчик события закрытия задачи. Если задача прекращается, то будет выполнено действие и задача будет остановлена.

const uint32_t CRITICAL_FLAG_KILL = 1;

/* Глобальный перехватчик события закрытия задачи с критическим флагом.

Чтобы перехватчик работал, должны быть соблюдены следующие условия:
1. При создания перехватчика с событием CRITICAL_FLAG_KILL (1), номер задачи должен быть -1!
2. Флаг критической задачи работает только при наличии перехватчика, иначе смысла от него не будет.

При наличии флага и обработчика, при попытке низкоуровневой остановки задачи она не будет остановлена, но будет вызван обработчик.
*/

template < uint16_t _AMOUNT >
class GyverOS {
public:
Expand Down Expand Up @@ -76,8 +89,49 @@ class GyverOS {
// отключить функцию обработчик задачи
void detach(int num) {
if (num >= _AMOUNT) return;

if (criticalFlags[num] == true && criticalFlagHandler != NULL)
{
criticalFlagHandler();
return;
}

if (hookTaskStop[num] != NULL)
hookTaskStop[num]();

callbacks[num] = NULL;
hookTaskStop[num] = NULL;
criticalFlags[num] = false;
}

// подключить функцию перехватчика
void attachHook(int num, uint32_t event, void (*hookHandler)()) {
if (num >= _AMOUNT || num != -1) return;

switch (event) {
case TASK_STOP:
if (num >= _AMOUNT && num < 0) return;
hookTaskStop[num] = NULL;
break;

case CRITICAL_FLAG_KILL:
if (num >= 0 || num != -1) return;
criticalFlagHandler = event;
break;
}
}

// отключить функцию перехватчика
void detachHook(int num) {
if (num >= _AMOUNT) return;
hookTaskStop[num] = NULL;
}

// флаг критической задачи
void criticalFlagSet(int num, bool critical) {
if (num >= _AMOUNT) return;
criticalFlags[num] = critical;
}

// установить период для задачи
void setPeriod(int num, uint32_t prd) {
Expand Down Expand Up @@ -184,8 +238,11 @@ class GyverOS {

private:
void (*callbacks[_AMOUNT])() = {};
void (*hookTaskStop[_AMOUNT])() = {};
uint32_t tmrs[_AMOUNT], prds[_AMOUNT], loopTime = 0, loopTimeMax = 0;
bool states[_AMOUNT];
bool criticalFlags[_AMOUNT];
void (*criticalFlagHandler)();
#ifdef OS_BENCH
uint32_t loadP = 0, us = 0, loadTmr = 0, loadSum = 0;
int load = 0, loopTimeNum = -1;
Expand Down