Jump to content
FLProg.PRO

Диспетчеризация тяжелых задач


Dryundel
 Share

Recommended Posts

     Поговорим о том как оптимизировать работу тяжелых задач в проекте. Тема эта довольно обширная и подходы могут быть разные. Одним из вариантов оптимизации является диспетчеризация. 

     Что же такое диспетчер задач, на каких принципах он работает и как его организовать? 

     Не смотря на всю пафосность своего названия, диспетчер задач это всего навсего распределитель основного цикла. Т.е. в каждом цикле не обязательно выполнять все задачи, а можно распределить их по времени и в каждом из циклов будет выполняться одна из нескольких задач.

     Еще одно непонятное слово, особенно для новичка - ЗАДАЧА. Все очень просто. Чтение аналогового пина - это задача. Отправка данных в UART это тоже задача.  Да все операции, будь то получение данных с датчика или вывод информации на дисплей являются задачами. Каждая такая задача имеет время выполнения и общее время цикла это сумма времени выполнения отдельных задач. Однако если задача имеет низкий приоритет, то совсем не обязательно запускать ее в каждом цикле. Например получать данные с датчика температуры достаточно раз в секунду, а выводить информацию на дисплей можно один раз в 10 циклов и от этого для пользователя ничего не поменяется, а процессор разгрузится ощутимо.

     Во некоторых штатных блоках Автор указывает на то, что выполнение в каждом цикле не рекомендуется.

 

348385859_.thumb.jpg.8eb125926e2b4e4a192e7024eb67cf8d.jpg

 

     Однако далеко не все блоки и особенно пользовательские имеют настройку выполнения по времени. Но очень часто блоки имеют вход En, при наличии на котором true блок выполняется. При false на таком входе, код блока пропускается и не участвует в основном цикле проекта.

 

208532250_En.jpg.3377770cd60ca09b27067a4b52c1d013.jpg

     Вот с помощью этого входа и можно разрешать работу блока периодически. Например с помощью штатного генератора. А для того, чтобы ограничить выполнение одним циклом через определенные промежутки времени используется R-триггер. Получается генератор коротких импульсов в один цикл.

 

660600031_.jpg.0e8f1af1448a0f97086a0e6d7068ecec.jpg

 

      Есть и другие способы диспетчеризации. И в каждом конкретном случае их выбор зависит от логики разработчика проекта. Рассмотрим пример с чтением аналоговых входов. Время выполнения чтения такого входа составляет около 1,2 мс для Atmega328, а это по меркам процессорного времени совсем не мало. И если в проекте задействовано несколько таких входов, то время выполнения таких задач суммируется и количество основных циклов в секунду резко сокращается.

     Один из простых способов диспетчеризации двух задач, это распределение циклов через один. Для этого добавляем в проект переменную boolean и изменяем ее значение на противоположное в каждом цикле, а чтение аналоговых входов обуславливаем состоянием такой переменной.

 

410788567_-.jpg.a35ff45789c16c05e7324ba34342c0fe.jpg

 

     Теперь в каждом цикле будет происходить чтение только одного аналогового входа из  двух. А что же делать если таких входов больше? Выход тоже простой. Делаем диспетчер задач на необходимое количество распределенных циклов. Для этого потребуются штатный счетчик, который настраиваем так.

 

1076626378_.thumb.jpg.d54fe1f122e3dacf57fda5c523cf12fd.jpg

 

     Счетчик будет менять значение каждые 2 цикла от 0 до 2 по кругу. Это значение и используем. 

 

1432691778_1.jpg.b85bae5ce9383e1aba26e144b6544d8c.jpg

 

 

     Можно использовать многовыходной переключатель или дешифратор и сделать так. Результат будет тот же.

 

 

359839212_2.jpg.26682124be97f29f7e94433de9732f1b.jpg

 

     Если же требуется выполнение не в каждом цикле, а по таймеру, добавляем генератор и R-триггеры.

 

1080150136_3.jpg.f4360d1f6e215adb98278acbf061b148.jpg

 

     Можно и комбинировать эти варианты. Все зависит от логики проекта и фантазии разработчика. Изобретайте, пробуйте разный подход. И самое главное, не верьте в суперсилу авторских диспетчеров задач. Они могут быть удобны, но основаны на тех же принципах. Основная задача это понимать что и для чего. :улыбка:

 

PS    Вместо штатного счетчика с "вертолетом Тик-так", который считает через 2 цикла, можно использовать простой и легкий Счетчик циклов из репозитория.

 

 

  • Thanks 7
  • Haha 2
Link to comment
Share on other sites

32 минуты назад, cmept-27 сказал:

Ошибочка. Или счетчик без генератора тоже работает ?

 

Да, спасибо за поправку. Совсем забыл что для подсчета циклов я делал пользовательский счетчик. Поэтому для того что бы работал штатный надо сделать так...

 

image.png.c3b2cef43cd8c9652f2cc8104e0cc8ee.png

 

Поправлю в статье. Благодарю за внимательность.

 

 

  • Thanks 1
Link to comment
Share on other sites

6 часов назад, Dryundel сказал:

Можно использовать многовыходной переключатель или дешифратор и сделать так. Результат будет тот же.

Немного не такой.
По картинке выше опрос переменной, либо другое условие, будет выполнятся два раза из-за тик-така за два цикла.
А по картинке ниже R-trig уберёт тик от второго цикла, опрос один раз.
Дополню. Если Вам необходимо выполнить несколько задач в одном цикле, расположите их на одной плате, которая будет выполнятся по условию совпадения счётной переменной с заданным значением.
Я также использую простой счётчик, как и ТС, но из кубиков FBD. Считает циклы до n.

Спойлер

644099414_1.jpg.e20db128d9fe5c3d8056e571c2de4150.jpg


 

Link to comment
Share on other sites

15 часов назад, Sevast сказал:

А какую установить частоту генератора для пяти аналоговых входов?

Всё зависит от того, как часто Вам требуются обновление данных. Можно же собирать данные например в таблицу (график) каждую секунду, а можно раз в час. Исходя из потребностей и частота выбирается. 

Link to comment
Share on other sites

Если у нас большой код ,выполняется длительное время,то его можно разбить на несколько циклов.

Спойлер

264085248_.thumb.png.c58284340a2431d56c27221339c7e834.png

 

 

Edited by ViktorPetrov
поткориктировал надписи на скриншоте
  • Haha 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...