1 Операционная система реального времени с периодической активизацией задач (ОСРВ-ПА)

В качестве введения в раздел сайта - видеоролик,
демонстрирующий работу многозадачной программы под управлением ОСРВ-ПА "Квантос"



	

1.1 ОСРВ-ПА "Квантос" на СИ под компилятор CodeVisionAVR

1.1.1 Назначение данного подраздела - публикация исходного кода ОСРВ-ПА "Квантос" для свободного использования, распространения и доработки под свои личные предпочтения. Исходному коду предшествует обширный начальный комментарий, содержащий информационно-технический материал по применения ОСРВ-ПА. С более строгим теоретическим обоснованием применения ОСРВ-ПА "Квантос" можно ознакомиться в подразделе
1.6. 1.1.2 Вы можете раскрыть исходник в своем браузере по ссылке QUANTOS.c или сохранить архивный файл QUANTOS.zip, а затем использовать в своих целях. Кстати, браузер Firefox раскрывает исходники с расширениями .c и .asm без искажений. Так что можете копировать и использовать текст, раскрытый браузером. 1.1.3 Разумеется, все файлы, предоставляемые в этом подразделе и далее, абсолютно безопасны для ваших компьютеров.

1.2 Новые версии ОСРВ-ПА на AVR-ассемблере

1.2.1 При разработке ОСРВ-ПА "Квантос" на СИ была изменена структура системного массива адресов функциональных блоков, которая использовалась в первых ассемблерных версиях ОСРВ-ПА (см.1.3, 1.4). Потребовалось объявление этого массива, как массива духбайтных адресов, тогда как в первых версиях массивы младших и старших байтов адресов объявлялись по отдельности (возможно напрасно, но это не принципиально). Изменилась и структура системного массива периодов и счетчиков активизации задач - ячейки счетчиков и периодов активизации каждой задачи связаны в пары. Кроме того, из кода ОСРВ-ПА "Квантос" исключен код обработчика прерываний от квантователя. Теперь в качестве квантователя может быть определен любой доступный источник. 1.2.2 В соответствии с этими изменениями разработаны новые ассемблерные версии ОСРВ-ПА. Наименования директив новых ассемблерных версий приведены в соответствие с наименованиями директив ОСРВ-ПА "Квантос" (см. подраздел 1.5). Подобно ОСРВ-ПА "Квантос" директивы в ассемблерных версиях реалированы в двух взаимозаменяемых формах макросов - с использованием подпрограмм (для сокращения программного кода макросов) и без использования подпрограмм (для сокращения времени исполнения макросов). Если в макросе используется подпрограмма, он обозначается без начального двойного подчеркивания, подобно обозначению директив ОСРВ-ПА "Квантос", определенных в форме СИ-функций. 1.2.3 Как известно, AVR-ассемблер допускает два способа определения макроса - классический (через пару директив .MACRO и .ENDMACRO) и объектно-функциональный (через директиву препроцессора #define). Объектно-функциональный способ очень удобен для определения параметров и задания их фактических значений при "вызове" макроса. Исходный код с ассемблерной версией ОСРВ-ПА, в которой макросы определены директивой #define, можно раскрыть по ссылке
QUANTOS_ASM.asm. Ассемблерная версия с классическим способом определения макросов раскрывается по ссылке QUANTOS-ASM-ASM.asm. Архивный файл QUANTOS_ASM.zip содержит обе ассемблерные версии ОСРВ-ПА.

1.3 ОСРВ-ПА на AVR-ассемблере с переменным числом задач

1.3.1 При написании и внедрении первых версий ОСРВ-ПА, в начале 2000-х годов, не хватало духа для произнесения "сокровенного" - Операционная система реального времени. Поэтому все первые версии ОСРВ-ПА назывались скромно - Мониторы функциональных блоков или Function Blocks Monitors. С этим связана аббревиатура FBM в именах файлов, на которые далее приведены ссылки, а также имена меток в кодах различных версий ОСРВ-ПА. 1.3.2 После успешного применения первых версий ОСРВ-ПА в серьезных заказах была опубликована статья "Операционная система реального времени для микроконтроллеров"
Chip News №7, 2008 г. В статье описана версия ОСРВ-ПА с переменным числом задач. Число используемых задач задается в качестве параметра @0 макроса OSRESET (установка начального состояния ОСРВ-ПА). Версии с переменным числом задач, в отличие от версий с фиксированным числом задач (см.подраздел 1.4), позволяют исключить лишние временные затраты на опрос счетчиков активизации неиспользуемых задач. 1.3.3 ОСРВ-ПА с переменным и фиксированным числом задач, содержат код обработчика прерываний от квантователя (таймера-счетчика TCNT0). Поэтому они жестко привязаны к типу используемого микроконтроллера. Кроме того, эти версии привязаны и к рабочей частоте микроконтроллера, поскольку содержат макрос CLOCK, задающий длительность кванта отсчета периодов активизации задач. Несколько версий ОСРВ-ПА с переменным числом задач для различных микроконтроллеров и рабочих частот собраны в архиве ОСРВ-ПА-N.zip. Следует отметить, что в файле FBM162_N7.asm, включенном в этот архив, приведен комментарий по применению ОСРВ-ПА. В архив включен также файл FBM162_N7S.asm, в котором для сокращения кода программ используются подпрограммы. Кроме того, можно обратить внимание на файл MultiCLOCK.txt , где представлены версии макросов CLOCK для частот от 1 до 14 МГц.

1.4 ОСРВ-ПА на AVR-ассемблере с фиксированным числом задач

1.4.1 Версии с фиксированным числом задач используются в ранее разработанных изделиях. Фиксированное число задач выбрано равным 16. Даже если используется меньшее число задач, обработчик прерываний и активизатор функциональных блоков осуществляют опрос всех 16 задач. Опыт эксплуатации таких ОСРВ-ПА показал, что наличие "холостых" циклов опроса не влияет на работоспособность изделий, хотя и придает некоторую "нелогичность" алгоритму работы ОСРВ-ПА. При желании, можно использовать по тексту ОСРВ-ПА определяемую в заголовке константу и тем самым исключить "холостые" циклы опроса. 1.4.2 В архиве
ОСРВ-ПА-16.zip собраны версии ОСРВ-ПА на 16 задач для AVR-микроконтроллеров ATmega 16,32,162,8515,8535, ATtiny 2313, под частоты 8 МГц и 7,3728 МГц. При использовании других рабочих частот можно воспользоваться файлом MultiCLOCK.txt .

1.5 Примеры использования ОСРВ-ПА

1.5.1 Для демонстрации работы ОСРВ-ПА "Квантос" использовалась макетная плата промышленного управляющего контроллера на 32 выходных канала. В каждом канале отдельное оптореле из состава микросхемы РКП3А управляется с отдельного выхода микроконтроллера ATmega162 через светодиод индикации. Светодиоды индикации выведены на лицевую планку управляющего контроллера. Именно они, по традиции, используются для демонстрации работы программ. Работу 8-ми задачной СИ-программы
8-TASKS_DEMO.c на указанной плате управляющего контроллера демонстрирует видеоролик 8-TASKS_DEMO в преамбуле к данному разделу сайта. В программе использовался Automatic Program Generator компилятора CodeWizardAVR V2.05.0 Professional. Программа может быть взята в качестве шаблона для разработки собственных программ на СИ. 1.5.2 Ассемблерные версии QUANTOS_ASM.asm и QUANTOS-ASM-ASM.asm также проверялись на управляющем контроллере, указанном в п.1.5.1. Использовались демонстрационные программы LK-32UA_QU.asm и LK-32UA_Q.asm . Эти программы для наглядности переключают светодиоды контроллера "четверками". 1.5.3 В таблице 1 представлены директивы ОСРВ-ПА "Квантос" в двух взаимозаменяемых формах - макроса и функции. Аналогичные обозначения директив используются и в новых ассемблерных версиях ОСРВ-ПА. При этом функциональная форма обозначения директив применяется для обозначения ассемблерных макросов, в которых используются подпрограммы, сокращающие код многозадачной программы.

1.6 Принципы разработки многозадачных программ

1.6.1 Попытка теоретического обоснования ОСРВ-ПА "Квантос" сделана в статье
"ПРИНЦИПЫ РАЗРАБОТКИ МНОГОЗАДАЧНЫХ ПРОГРАММ ДЛЯ ОПЕРАЦИОННОЙ СРЕДЫ ОСРВ "КВАНТОС". Хотелось бы обратить внимание на введенное в этой статье терминологическое разделение "глобального" понятия объект на объект контроля и субъект - задачу, осуществляющую контроль соответствующего объекта контроля. 1.6.2 Для разработчиков цифровой аппаратуры, знакомых с теорией конечных автоматов, не без интересна будет аппаратная модель задачи, предложенная в данной статье.

1.7 Новые версии ОСРВ-ПА КВАНТОС-F, КВАНТОС-М, КВАНТОС-СРР

1.7.1 Постоянно сталкиваясь в сети с бесчисленными материалами по ОСРВ и мультипрограммированию, я часто задаю себе вопрос, почему я так "запал" на ОСРВ-ПА ? И каждый раз отвечаю, что это наиболее понятный мне и доступный "инструмент" для решения реальных инженерно-технических проблем. Многие годы он не подводил и меня и коллектив фирмы ВиТаИ, где я работаю. Стоило бы только "влезть" в освоение какой-либо ОСРВ известного бренда, и - крах, не с кем проконсультироваться, все коды скрыты, а если и найдешь, то вряд ли разберешься. Да и заказчики наши такой подход не то чтобы не одобрили, а просто бы категорически запретили. Как я уже отмечал выше, в реальных проектах я использовал ассемблерные версии ОСРВ-ПА. Ассемблер мне "ближе", да и удобных макросов я "создал" не счетное количество (см.раздел 2). Конечно, понимаю тех, кто справедливо скажет, что программирование на ассемблере это "атавизм". Поэтому и появилась ОСРВ-ПА "Квантос" для создания многозадачных программ на СИ. А в последнее время, я в каком-то смысле "помучился" с адаптацией "Квантос" под язык СИ++. Возможность создавать программы на СИ++ под компилятор WinAVR(GCC C++) обеспечивают новые AVR-студии, в частности Atmel Studio 6.2. В процессе этой работы пришлось, естественно, слегка "подправить" и "Квантос". В результате появились три новые версии ОСРВ-ПА: - КВАНТОС-F (директивы-функции, любой С/С++ компилятор, в том числе CodeVisionAVR, WinAVR(GCC C), WinAVR(GCC C++)); - КВАНТОС-М (директивы-макросы, любой С/С++ компилятор, в том числе CodeVisionAVR, WinAVR(GCC C), WinAVR(GCC C++)); - КВАНТОС-СРР (директивы-функции,любой С++ компилятор, в том числе WinAVR(GCC C++)). 1.7.2 КВАНТОС-F и КВАНТОС-М фактически являются разделением "Квантоса" на два отдельных файла
QUANTOS-F.c и QUANTOS-M.c, в одном из которых собраны директивы ОСРВ-ПА, определенные в форме СИ-функций, а в другом - определенные в форме СИ-макросов. При желании использовать разные формы директив можно подключать к основной программе оба файла. КВАНТОС-F и КВАНТОС-М теперь не зависят от используемого СИ-компилятора, поскольку из директив активизации задач TASK__ACTUATION() и __TASK__ACTUATION исключено ассемблерное "окно" разрешения прерываний. Прерывания по умолчанию разрешаются "глобально". Чтобы исключить возможные конфликты между задачами и обработчиками прерываний, управляющими этими задачами через директивы ОСРВ-ПА (такое управление допускается, хотя и используется достаточно редко), предлагается включать в обработчики фрагменты проверки состояния задачи перед использованием директив управления. По значениям счетчика активизации задачи и переменной active_task однозначно устанавливается активна ли в данный момент задача или нет: if(period_counter_list[2*taskNumber+1]==0 && active_task==taskNumber) // Задача taskNumber в данный момент активна. // Допускается только косвенное управление задачей (через другую задачу или // через почтовый ящик). else // Задача taskNumber в данный момент пассивна. // Допускается прямое управление задачей (через директивы ОСРВ-ПА). Следует отметить, что такая проверка работает и во время исполнения директив выхода из ФБ, и во время исполнения директив активизации задач, поскольку в версиях КВАНТОС-F и КВАНТОС-М число задач ограничено верхним пределом 256, а значения счетчиков активизации задач не превышают 0хFF. Обработчик прерывания не может "вклиниваться" с проверкой состояния задачи в незавершенные операции изменения этих значений, а следовательно и принимать ошибочное решение. Отдельно необходимо сказать об обработчике прерывания от квантователя. Он проверяет значение счетчика активизации каждой задачи на 0 и на 0хFF и декрементирует все другие значения. Это никоим образом не может нарушить процессы исполнения ФБ активизированных задач. Даже если квантователь прерывает ФБ активной задачи во время исполнения директивы выхода из ФБ, он может лишь уменьшить на 1 значение, записанное в байт счетчика активизации задачи, что не повлияет на работу системы, так как эта поправка укладывается в погрешность отсчета периодов. В версиях ОСРВ-ПА, допускающих использование числа задач, превышающих 256, и периодов активизации, превышающих 0хFF, следует защищать директивы ОСРВ-ПА ассемблерными запретами прерываний. А в КВАНТОС-F и КВАНТОС-М это делать не требуется. В результате исключения ассемблерных вставок, КВАНТОС-F и КВАНТОС-М как бы обрели "независимость" от используемого С/С++ компилятора и типа используемых микроконтроллеров. 1.7.4 Теперь о главном - ОСРВ-ПА КВАНТОС-СРР. Никаких проблем с определением задач как объектов соответствующих классов, контекстов задач - как элементов данных (или полей классов), а ФБ задач – как методов классов не возникает. А вот активизация задач-объектов и передача управления следующему ФБ задачи имеет свою специфику. В СИ++ невозможно создать единый массив адресов следующих исполняемых ФБ задач, такой как создается в СИ. Пришлось распределять по классам задач переменные nxtFB, хранящие адреса следующих исполняемых ФБ задач и переменные taskNumber, хранящие номера задач-объектов. Кроме того, для каждого класса задач пришлось определять и отдельный метод активизации ФБ и отдельные методы выхода из ФБ. В подключаемом файле ОСРВ-ПА КВАНТОС-СРР QUANTOS-CPP.cpp определения метода-директивы активизации ФБ задач и методов-директив выхода из ФБ приведены в виде "шаблонов" в завершающем комментарии файла. Создаваемые классы задач необходимо дополнять указанными методами-директивами и переменными taskNumber и nxtFB. 1.7.5 Для проверки и демонстрации работы новых версий ОСРВ-ПА была разработана 9-ти задачная программа управления гирляндой из 8-ми светодиодов. Следующий видеоролик демонстрирует работу этой программы.
В 9-ти задачной демонстрационной программе, использующей КВАНТОС-СРР, к файлу основной программы 9-TASK-3CPP-2.cpp подключается "блок" заголовочных файлов: classManager.h, classForeman.h, classSkilledWorker.h, classWorker.h, addFunction.h. После объявления объектов-задач подключается "блок" файлов реализации: classManagerImp.cpp, classForemanImp.cpp, classSkilledWorkerImp.cpp, classWorkerImp.cpp, addFunctionImp.cpp. В комментариях файла основной программы подробно описан алгоритм работы демонстрациюнной задачи. По самим текстам файла основной программы и подключаемых файлов можно составить представление о технологии применения КВАНТОС-СРР. 1.7.6 В 9-ти задачных демонстрационных программах, использующих КВАНТОС-F и КВАНТОС-М, прототипы ФБ задач и реализации ФБзадач приведены в текстах файлов демонстрационных программ: 9-TASK-CVF.c - файл демонстрационной программы под компилятор CodeVisionAVR, использующей КВАНТОС-F. 9-TASK-CVM.c - файл демонстрационной программы под компилятор CodeVisionAVR, использующей КВАНТОС-М. 9-TASK-WAF.c - файл демонстрационной программы под компилятор WinAVR(GCC C), использующей КВАНТОС-F. 9-TASK-WAM.c - файл демонстрационной программы под компилятор WinAVR(GCC C), использующей КВАНТОС-М. Все эти программы работают точно так же, как демонстрирует видеоролик из предыдущего пункта. Но размеры hex-файлов, формируемых компиляторами, отличаются: 9-TASK-CVF.hex - 1892 байта; 9-TASK-CVM.hex - 2012 байт; 9-TASK-WAF.hex - 1930 байт; 9-TASK-WAM.hex - 2698 байт. Для сравнения отдельной строкой приведу размер hex-файла, формируемого компилятором WinAVR(GCC C++) для файла 9-ти задачной демонстрационной программы в которой используется ОСРВ-ПА КВАНТОС-СРР: 9-TASK-3CPP-2.hex - 2424 байта. Результаты отличаются, поэтому есть выбор.