From 314d689b8b18841b43d94734d6d9dcc6ad51b807 Mon Sep 17 00:00:00 2001 From: GeorgNation <55389952+GeorgNation@users.noreply.github.com> Date: Tue, 14 Sep 2021 18:45:47 +0600 Subject: [PATCH 1/4] Update GyverOS.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил перехватчики событий, а также функцию критического флага. --- src/GyverOS.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/GyverOS.h b/src/GyverOS.h index 04b17e8..2f31613 100644 --- a/src/GyverOS.h +++ b/src/GyverOS.h @@ -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: @@ -76,8 +89,47 @@ 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; } + + // подключить функцию перехватчика + 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) { @@ -184,8 +236,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; From 2a6110fad4f5082bdf3e171737fb842be004487f Mon Sep 17 00:00:00 2001 From: GeorgNation <55389952+GeorgNation@users.noreply.github.com> Date: Tue, 14 Sep 2021 18:52:38 +0600 Subject: [PATCH 2/4] Update README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ef2d69b..06e56f4 100644 --- a/README.md +++ b/README.md @@ -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); // перезапустить задачу @@ -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. + ## Пример Остальные примеры смотри в **examples**! @@ -127,4 +136,4 @@ void f3() { ## Баги и обратная связь При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru) -Библиотека открыта для доработки и ваших **Pull Request**'ов! \ No newline at end of file +Библиотека открыта для доработки и ваших **Pull Request**'ов! From ae05f7b305d3ab379a9e11ae8b58084bff4a3e18 Mon Sep 17 00:00:00 2001 From: GeorgNation <55389952+GeorgNation@users.noreply.github.com> Date: Tue, 14 Sep 2021 19:08:26 +0600 Subject: [PATCH 3/4] Update keywords.txt --- keywords.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/keywords.txt b/keywords.txt index c892e20..5b10358 100644 --- a/keywords.txt +++ b/keywords.txt @@ -15,6 +15,9 @@ GyverOS KEYWORD1 tick KEYWORD2 attach KEYWORD2 detach KEYWORD2 +attachHook KEYWORD2 +detachHook KEYWORD2 +criticalFlagSet KEYWORD2 setPeriod KEYWORD2 start KEYWORD2 restart KEYWORD2 @@ -33,4 +36,6 @@ disableLoad KEYWORD2 # Constants (LITERAL1) ####################################### -OS_BENCH LITERAL1 \ No newline at end of file +OS_BENCH LITERAL1 +TASK_STOP LITERAL1 +CRITICAL_FLAG_KILL LITERAL1 From b91980c50814ced17c0abce9a1c74b4bf68fd2bb Mon Sep 17 00:00:00 2001 From: GeorgNation <55389952+GeorgNation@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:48:55 +0600 Subject: [PATCH 4/4] Update GyverOS.h --- src/GyverOS.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/GyverOS.h b/src/GyverOS.h index 2f31613..2ac1b18 100644 --- a/src/GyverOS.h +++ b/src/GyverOS.h @@ -100,6 +100,8 @@ class GyverOS { hookTaskStop[num](); callbacks[num] = NULL; + hookTaskStop[num] = NULL; + criticalFlags[num] = false; } // подключить функцию перехватчика