Актуальные библиотеки ecoins здесь
Темы с описанием блоков здесь
RT_диспетчер
.
.
Блок диспетчера задач, пожалуй, основная фишка разработок ecoins, хотя и не является самым сложным. С помощью этого блока осуществляется базовая оптимизация работы программы в контроллере.
Для того что бы понимать, что же оптимизирует данный блок необходимо понимать основной принцип последовательности выполнения команд. Искушенные в этом вопросе могут пропустить следующие насколько абзацев.
Все команды, которые выполняет микропроцессор мы можем видеть в текстовом файле при компиляции скетча в Arduino IDE. Принцип последовательности их выполнения довольно прост. Процессор построчно сверху вниз считывает команду выполняет ее, только после этого считывает следующую, так же выполняет и так до конца скетча. После этого происходит возврат в начало, и процедура повторяется в бесконечном цикле.
Каждая команда занимает определенное процессорное время. К примеру считывание состояния дискретного пина – 4-6 мкс, вычисление синуса из числа с плавающей запятой 120 мкс, а очистка дисплея 1,5 мс (1500 мкс). Таким образом, чем больше программа, тем больше времени уходит на каждый цикл. Соответственно при перегруженности процессора он может к примеру, даже не увидеть нажатие кнопки, т.к. занимался в это время какими-то вычислительными задачами.
Основная идея оптимизации, заложенная в блоке «Диспетчер задач» это разбить программу на части и в каждом цикле выполнять только один ее фрагмент.
Условно говоря если у нас есть две задачи: следить за нажатием кнопки и рассчитать значение по формуле x=(a*(b-c))/d то без оптимизации мы проверим кнопку, потом вычислим значение формулы присвоим это значение переменной x и только потом снова (в новом цикле) проверим кнопку. Но нажатие кнопки могло произойти пока мы занимались расчетами и тогда мы об этом никогда не узнаем.
Оптимизированный процесс условно будет таков:
1 цикл – вычисляем b-c.
2 цикл – проверяем кнопку.
3 цикл – производим операцию умножения на a .
4 цикл – проверяем кнопку.
5 цикл – выполняем деление на d,
6 цикл – проверяем кнопку.
7 цикл – присваиваем переменной x результат вычислений.
8 цикл – проверяем кнопку.
В результате – нажатие кнопки мы не пропустили, но и во времени вычисления формулы потеряли совсем не много. Да и не требуется нам суперскоростное вычисление. Например, обновление дисплея нам достаточно делать 2 раза в секунду. Оптимизировав программу таким образом мы освободим много-много циклов для выполнения других задач.
Теперь непосредственно про блок «Диспетчер задач»
.
- 2.jpg (5.77 КБ) 3478 просмотров
.
У блока несколько выходов. На каждом выходе появляется высокий уровень, импульс длительностью в один цикл программы и с периодичностью определенной для каждого из выходов.
fast10 – импульс каждые 10 мс
fast – настраивается (по умолчанию 25 мс)
slow – настраивается (по умолчанию 250 мс)
back100 – импульс каждые 100 мс если нет импульсов на других выходах
back – имеет высокий уровень если нет импульсов на других выходах
Вот так все просто.
Подавая сигнал на вход En функциональных блоков, мы разрешаем им работу на один цикл программы каждые 25 мс например. Так же можно поступать и с целыми платами. В результате мы распределяем процессорное время между задачами по их приоритету. К примеру пин отслеживаем каждые 10 мс, а переменную отсылаем на LCD каждые 100 мс и то если нет других задач в это время.
.
- 3.jpg (39.13 КБ) 3478 просмотров
.
За внешней простотой блока скрывается достаточно четкий алгоритм поднятия флагов (подачи импульсов на выходы) благодаря которому флаг всегда поднят только на одном из выходов. В случае совпадения времени поднятия нескольких флагов. Одно из событий сдвигается на цикл и в следующий раз старается четко выдерживать время срабатывания. Приоритет выходам отдается согласно его расположению, сверху вниз.
Другие блоки этой серии отличаются лишь наличием отладочных выходов.