СОВРЕМЕННАЯ ЭЛЕКТРОНИКА 2011-1
дится постоянно тратить время на со хранение стека кооперативных задач. Отведём для кооперативных задач адреса в стеке с 2 по 11, а для задач монотонной частоты – от 12 и выше. Таким образом, при вытеснении ко оперативной задачи задачей монотон ной частоты с новым периодом пла нировщик должен сохранить только её регистры, установить указатель сте ка на 12 й адрес в стеке и начать вы полнение новой задачи. Схема исполь зования стека задачами приведена на рисунке 2. Рассмотрим алгоритм работы дан ного расширения в микроконтролле ре. В начале функции main выполня ется инициализация всех данных программы пользователя и модулей микроконтроллера, после чего уста навливается прерывание для систем ного таймера, освобождается место в стеке для фоновой задачи и происхо дит переключение на ядро RMEX, т.е. запускается многозадачность. При получении управления планировщик перебирает все задачи монотонной частоты, начиная с нулевой (задачи размещены в таблице по возраста нию приоритетов для ускорения по иска), и передаёт управление первой готовой к выполнению задаче. При этом задача может быть начата зано во (новый период для задачи) или возобновлена (восстановление кон текста). Через заданный квант време ни системный таймер сгенерирует прерывание, и вновь произойдёт вы зов планировщика. Если текущая за дача исчерпала свой лимит време ни, то её выполнение прекращается, освобождается место в стеке, и пла нировщик начинает поиск новой го товой к выполнению задачи моно тонной частоты. Если таковая отсут ствует, то происходит возврат к кооперативному набору задач. Если же текущая задача не исчерпала ли мит времени выполнения, то прове ряется наличие готовых к выполне нию задач с периодом меньше, чем у текущей задачи, и если таковые нахо дятся, происходит вытеснение. В про тивном случае прерванная задача продолжает выполняться дальше. Структура для сохранения контекста задач монотонной частоты имеет сле дующий вид: struct context_t { // 3 байта адреса в стеке unsigned char tosu_b[STACK_DEEP]; unsigned char tosh_b[STACK_DEEP]; unsigned char tosl_b[STACK_DEEP]; // указатель стека STKPTR unsigned char stk_b; // регистр статуса unsigned char status_b; // рабочий регистр unsigned char wreg_b; // регистр банка памяти unsigned char bsr_b; // регистры указатели unsigned char fsr1_b; unsigned char fsr2_b; } _RMEX_CONTEXT[CONFIGURE_RMEX_TASK S]; Параметр STACK_DEEP характеризует максимальнодопустимуюглубину стека для задачи, а CONFIGURE_RMEX_TASKS – число задач монотонной частоты. Важно, чтобы задача не превышала максимально допустимую глубину стека, иначе при сохранении её кон текста произойдёт потеря адреса возв рата. Н ЕРЕГУЛЯРНЫЕ ЗАДАЧИ С КОРОТКИМ ВРЕМЕНЕМ ОТВЕТА Как было сказано выше, в случае ис пользования RMEX программист раз деляет свои задачи на периодические с жёстким конечным сроком и непе риодические задачи с мягкими сро ками выполнения, для которых быст рое время ответа желательно, но не гарантируется. Существуют задачи, которые не являются периодически ми (их планирование при помощи алгоритма RMS не будет эффектив ным), но вместе с тем требующими конечного времени ответа. Как пра вило, такие задачи зависят от наступ ления какого то внешнего события и являются случайными (sporadic). Ис пользование RMS для такой задачи будет неэффективно, так как чем меньшее время ответа требует данная задачи, тем чаще эта задача будет вы полняться, причём до наступления нужного события вообще нет смыс ла передавать ей управление. Другой вариант – сделать её кооперативной задачей – не подходит по причине потери гарантированного времени отклика. Выходом из данной ситуа ции является создание ещё одного типа задач жесткого реального вре мени – нерегулярных задач, созда ющихся в системе динамически и управляемых прерываниями. Таким образом, нерегулярная задача не бу дет вхолостую потреблять ресурсы процессора и обеспечит гарантиро ванный быстрый отклик. В ЫБОР СИСТЕМНОГО ТАЙМЕРА Решение о том, какой конкретно таймер из четырёх возможных ис пользовать в качестве системного таймера, определяется требованиями приложения по использованию этих таймеров. Таймер может использоваться в ка честве модуля захвата/сравнения или модуляШИМ и, таким образом, не мо жет быть системным. Вторым пара метром является требуемая точность кванта времени для задачи. Прерыва ние системного таймера также долж но иметь высокий приоритет (вектор прерывания 0x08), т.е. соответствую щий этому прерыванию бит в регист ре IPR1, IPR2 или INTCON2 должен быть установлен в 1. Большинство инструкций в микроконтроллерах PIC18 выполняются за четыре такта генератора или за один такт инструк ции (за исключением инструкций переходов). Таким образом, при ис пользовании внешнего генератора с тактовой частотой 40 МГц микро контроллер будет работать со ско ростью 10 миллионов инструкций в секунду. Значение таймеров увеличивается при выполнении очередного такта инструкции; для них могут быть вы браны предделитель и постделитель частоты. Например, если преддели тель установлен в соотношение 1 : 8, то значение соответствующего ему таймера будет увеличиваться на еди ницу каждые 8 тактов инструкции. Прерывание у 8 битного таймера бу ПРОГРАММИРОВАНИЕ 58 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 1 2011 RMEX, вытеснение . . . . . . 31 12 11 2 startup code empty 1 0 Кооперативная RTOS Рис. 2. Использование стека задачами реального времени и кооперативной ОС © СТА-ПРЕСС
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy