ЖУРНАЛ СТА 2/1997

• Возможность создания приложений RTKernel в виде резидентных про- грамм. • Возможность запуска других DOS программ, в том числе Windows 3.0/3.1, из приложения RTKernel. • Удобство отладки приложений пу- тем использования встроенной возможности компиляции с добав- лением отладочной информации, необходимой для Turbo Debugger или CodeView. • Возможность создания приложений, загружаемых из ПЗУ. • Возможность поставки версии с пол- ным комплектом исходных текстов ядра. • Отсутствие ограничений на количе- ство разрабатываемых приложений. Структура и принцип функционирования Задачи RTKernel Задачи RTKernel являются обычными Pascalпроцедурами или Сифункция- ми без параметров, методы создания которых ничем не отличаются от тра- диционных. При старте программы на исполнение запускается только одна функция main. Несмотря на то что в состав программы входит мультиза- дачная система реального времени, ее выполнение происходит последова- тельно, как в традиционных приложе- ниях DOS. После обращения к ядру пу- тем вызова функции RTKernel (RTKer- nelInit(MainPriority)) на основе функ- ции main формируется главная задача приложения. Далее главная задача с помощью функции RTKCreateTask пре- образует функции (процедуры) про- граммы, которые должны исполняться одновременно, в задачи RTKernel. Простейшая структура приложения RTKernel и результат его исполнения приведены на рис. 1. Каждой задаче присваивается при- оритет, значение которого может быть установлено в диапазоне от 1 до 64, а также выделяется собственная область стека. Самый высокий приоритет со- ответствует значению 64. Самый ни- зкий — 1. Все локальные переменные (за исключением статических), объяв- ленные в пределах преобразованных в задачи функций (процедур), помеща- ются в собственные области стека каж- дой задачи. Это же относится и к фун- кциям, вызываемым из задач RTKernel. Поскольку для каждой задачи форми- руется собственный стек, имеется воз- можность одновременного выполне- ния разными задачами одних и тех же участков кода. Структура приложения RTKernel показана на рис. 2. Взаимодействие задач Термин «взаимодействие задач» от- носится ко всем способам обмена ин- формацией между задачами и методам синхронизации. RTKernel представля- ет три различных механизма взаимо- действия. Семафоры Семафорные примитивы являются одним из наиболее популярных средств синхронизации параллельно исполняющихся процессов и могут рассматриваться в качестве счетчиков событий, значение которых никогда не может быть отрицательным. Основ- ным свойством семафора считается неделимость (непрерываемость) вы- полняемых по отношению к нему операций. Семафоры позволяют зада- чам обмениваться сигналами для акти- визации и приостановки исполнения. RTKernel поддерживает двоичные и счетные семафоры, а также семафоры ресурсов. Семафоры ресурсов предна- значены для эффективного управления доступом к ресурсам. Семафор ресур- са гарантирует, что приоритет задачи, занимающей ресурс, будет всегда на- ивысшим среди приоритетов других задач, ожидающих данный ресурс. Данное свойство ресурсных семафо- ров, известное под названием «насле- дование приоритета», делает невоз- можным блокирование текущей задачи менее приоритетной задачей. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ 85 2/97 #include “RTKernel.h” #define MainPriority 3 //Приоритет главной задачи TaskHandle HandleA; //Определение дескриптора задачи A Semaphore S; //Определение семафора void TaskA(void) { printf(“Зада÷а A:ожидание семафора S\n”); RTKWait(S); printf(“\nЗадача A:возобновление исполнения\n”); } void main(void) { printf(“\n”); //Инициализация RTKernel, создание главной задачи и «пустой» задачи RTKernelInit(MainPriority); //Создание счетного семафора S = RTKCreateSemaphore(Counting, 0, “Semaphore S”); //Преобразование функции A в задачу printf(“Main : создание задачи A\n”); HandleA = RTKCreateTask(TaskA, MainPriority + 1, 1024, “Task-A”); //Освобождение семафора printf(“Main : освобождение семафора S\n”); RTKSignal(S); printf(“Main : завершение приложения\n”); } Результат: Main : создание задачи A Задача A:ожидание семафора S Main : освобождение семафора S Задача A:возобновление исполнения Main : завершение приложения Рис. 1. Законченная программа RTKernel с двумя задачами. Применен способ активизации с использованием счетного семафора

RkJQdWJsaXNoZXIy MTQ4NjUy