ДИСПЕТЧЕР ЗАДАЧ:
В каждый момент времени генерирует только один отличный от нуля номер задач одного из типов задач (оперативные,
быстрые,медленные,фоновые,свободные).
В проектах FLprog рекомендуется размещать диспетчер на одной из первых плат FLProg (выше только платы настройки с однократным выполнением).
Эта плата должна вызываться в каждом цикле loop (платы без условий вызова).
ОСНОВНЫЕ выходы диспетчера (подключаемые):
control - изменяется значение (0/1) в каждом цикле loop() для наблюдения логическим анализатором.
quick – номера оперативных задач (по умолчанию 5 задач, период смены задачи 10 мс);
fast – номера быстрых задач (по умолчанию 4 задач, период смены задачи 25 мс);
slow – номера медленных задач (по умолчанию 4 задачи, период смены задачи 250 мс);
back – номера фоновых задач (по умолчанию 5 задач, период смены задачи 100 мс);
frdm - номера свободных задач (по умолчанию 25 задач). Эти задачи без периода, номера последовательно
изменяются в циклах, когда номера предыдущих задач равны 0;
Кол-во задач каждой из задач могут быть изменены.
ДОПОЛНИТЕЛЬНЫЕ выходы диспетчера (секундные):
eventSec - cекундные события;
timeSec(uint32_t) - количество секунд, прошедших с начала работы программы;
Speed(uint32_t) - быстродействие проекта в количестве циклов loop()/sec;
speed(uint16_t) - быстродействие проекта в количестве циклов loop()/sec;
Параметры быстродействия могут быть отфильтрованы фильтром "Бегущего среднего".
Фильтр включается установкой значения параметра "Фильтр бегущего среднего" >1(2,4,6,8,10 и т.д.).
При включенном фильтре вместо выходов Speed,speed, будут выходы SpeedFilter,speedFilter.
ДОПОЛНИТЕЛЬНЫЕ выходы диспетчера (меандры):
меандр - 10ms;
меандр - 25ms;
меандр - 50ms;
меандр - 100ms;
меандр - 250ms;
меандр - 1000ms;
Указаны длительности полупериодрв меандров.
ДОПОЛНИТЕЛЬНЫЕ выходы диспетчера (консоль):
console.ok - флаг готовности консоли для вывода;
console.head - флаг готовности вывода заголовков на консоль(событие). Устанавливается на один цикл loop();
Может быть использован для однократного вывода на консоль различных текстов с параметрами,
например используемые в проекте номера пинов, адресов, констант, параметров контроллера и т.п.;
console.all - флаг готовности консоли для вывода в следующем цикле loop() после собыьтя console.head
Имеются дополнительные блоки FLProg по каждой группе ДОПОЛНИТЕЛЬНЫХ ВЫХОДОВ.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Описание используемого фильтра "Бегущего среднего"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Фильтр бегущего среднего.
Алгоритм фильтра работает по принципу буфера, в котором для усреднения хранятся N последних измерений.
При каждом вызове фильтра буфер сдвигается, в него добавляется новое значение и убирается самое старое,
далее буфер усредняется по среднему арифметическому.
При первых четырех вызовах(настраиваемый параметр) буфер заполняется только текущим принятым значением.
Рекомендуется выбирать N четным.
Фильтр быстрый. Ниже приведены замеры для N=32:
Arduino Nano int16_t=44-48 мкс; float= 32 мкс;
ESP32S int16_t=2-4 мкс; float=4-6 мкс;
STM32F103C int16_t=1-2 мкс; float=4-5 мкс;
STM32F401CC int16_t=1-2 мкс; float=1-2 мкс;
RaspBerry Pi Pico int16_t<1 мкс; float=2 мкс;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Краткое описание диспетчера задач (для разработчиков блоков FLProg)
RT_HW_Base.sheduler() в библиотеке RT_HW_BASE.h
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Используемые термины:
Номер задачи - байтовая переменная (uint8_t).
Событие - значение, которое сохраняет значение в течении текущего цикла loop(),
В начале следующего цикла значение сбрасывается(=0).
Диспетчер - функция RT_HW_Base.sheduler() из библиотеки RT_HW_BASE.h.
Задача - законченная совокупность запрограммируемых пользователем действий.
Проект - совокупность задач.
Программное прерывание - микрооперация функции с выходом из неё с фиксацией точки прерывания.
При следующем функции она возобновляет работу с точки прерывания.
Диспетчер генерит номера 5-ти типов задач(перечень по приоритету): оперативные,быстрые,медленные,фоновые,свободные.
Номера задач используется для управления вызовом задач.
Диспетчер должен вызываться в каждом цикле loop().
При каждом вызове диспетчер генерит отличный от нуля один из 5-ти номеров задачи.
Это значение которого сохраняется в течении текущего цикла loop(), в начале следующего цикла все номера задач
сбрасываются(=0).
Номера задач (перечнь по приоритету) изменяюся периодически или в случае со свободными задачами последовательно:
Оперативная задача(RT_HW_Base.shed.num.quick) - периодически( 10ms) от 1 до RT_HW_Base.shed.quick.qnt(default=5);
Быстрая задача(RT_HW_Base.shed.num.fast) - периодически( 25ms) от 1 до RT_HW_Base.shed.fast.qnt (default=4);
Медленная задача(RT_HW_Base.shed.num.slow) - периодически(250ms) от 1 до RT_HW_Base.shed.slow.qnt (default=4);
Фоновая задача(RT_HW_Base.shed.num.fast) - периодически(100ms) от 1 до RT_HW_Base.shed.back.qnt (default=5);
Свободная задача(RT_HW_Base.shed.num.frdm) - последовательно от 1 до RT_HW_Base.shed.frdm.qnt (default=25);
Для сохранения логики работы диспетчера не следует создавать задачи, которые с управлением более чем 7-8ms
при вызове задачи. Для этого в задачах следует использовать функции с программным прерыванием.
Номера свободных задач изменяются в каждом цикле loop() если уже не назначен номер другой задачи.
Исходя из логики работы диспетчера чаще всего вызываются свободные задачи.
Свободным номерам задач рекомендуется подключать задачи, которые не привязаны жестко ко времени выполнения
и/или содержат функции с программными прерываниями.
Применение диспетчера позволяет существенно увеличить скорость выполнения пользовательских проектов.
Для эффективного использования диспетчера используемые функции не должны содержать функций delay()
или иных узлов, которые приводят к длительному выполнению функций. Обычно это достигается через применение программных прерываний.
Этим требованиям удовлетворяют библиотеки разработчика
ecoins@mail.ru, их названия начинаются с префикса "RT_HW_".
Использования библиотек других разработчиков могут привезти к существенному снижению скорости проектов и это не зависит
от того используется диспетчер или нет.
---------------------------------------------------------------------------------------------------
Дополнительные выходы диспетчера:
RT_HW_Base.shed.control(uint8_t) - каждый цикл loop() меняет инвертирует значение (0/1). Если значение control выводить на пин,
то с помощью логического анализатора можно получить много полезной информации о работе проекта.
RT_HW_Base.shed.eventSec(uint8_t)- событие 1 раз в сек.
RT_HW_Base.shed.blinkSec(uint8_t)- меандр с полупериодом 1 сек.
RT_HW_Base.shed.cycle(uint32_t) - быстродействие в loop()/сек.
RT_HW_Base.shed.smallCycle(uint16_t) - быстродействие в loop()/сек/1000.
RT_HW_Base.shed.cntSec(uint32_t) - время наработки в сек;
bitRead(RT_HW_Base.shed.eventBlink,0)- событие loop().
bitRead(RT_HW_Base.shed.eventBlink,1)- событие 10ms.
bitRead(RT_HW_Base.shed.eventBlink,2)- событие 25ms.
bitRead(RT_HW_Base.shed.eventBlink,3)- событие 50ms.
bitRead(RT_HW_Base.shed.eventBlink,4)- событие 100ms.
bitRead(RT_HW_Base.shed.eventBlink,5)- событие 250ms.
bitRead(RT_HW_Base.shed.eventBlink,7)- событие 1000ms.
---------------------------------------------------------------------------------------------------
ecoins@mail.ru 20.12.2022г.