В.Т. Рябов - Устройство и программирование однокристальных микроконтроллеров (1054006), страница 16
Текст из файла (страница 16)
Такое написание лучшепереносится из программы в программу, допускает раздельную отладку, поэтому и прощеотлаживается и является естественным для процессов управления. Далее рассмотрим процесс разработки такого диспетчера.Контрольные вопросы.1. Этапы и выполняемые работы при разработке программного обеспечения микроконтроллеров.2. Обеспечение работы ПО ЛМК в жестком реальном времени.3. Особенности разработки программного обеспечения ЛМК.4. Ошибки ПО на логическом и физическом уровне и методы их устранения.515.2. Диспетчер процессов для МК семейства MCS-51.Функции диспетчера процессов.Диспетчер процессов является минимальным ядром базовой операционной системы«жесткого» реального времени.
Хороший диспетчер процессов должен:1) представлять пользователю гибкий программный интерфейс для управления очередностью запуска процессов во времени (синхрокванты) и запускать процессы взависимости от внешних событий в порядке очереди (интеркванты), либо безочереди (экстракванты);2) занимать минимальный объем резидентного ОЗУ, не ограничивать пользователя виспользовании регистров общего назначения и других ресурсов микроконтроллера;3) минимально загружать процессор процессом диспетчирования.Проектируемый диспетчер предназначен для управления синхроквантами, рядом интерквантов, перезапускаемых внешними событиями и экстраквантами, запускаемыми отдвух входов прерываний.Реальное время будет отсчитываться в диспетчере процессов с помощью коротких«тиков» с длительностью, определяемой пользователем и способной изменяться в пределахот долей миллисекунды до нескольких десятков миллисекунд и длинных тиков, длительность которых в 256 раз больше, чем у коротких.
Может быть, несколько странная системаотсчета времени по сравнению с привычными секундами, минутами и часами, но удобнаядля реализации в микроконтроллере. Реальное время будет фиксироваться и обрабатываться программой обработки прерываний таймера Т/С0. Этот таймер занят базовой операционной системой. Пользователь в своей управляющей программе свободно может использоватьтаймер Т/С1.Процессы (синхрокванты) могут быть запущены на выполнение с задержкой до 255тиков (коротких или длинных). Тогда реализуемая диспетчером задержка синхроквантабудет составлять от одной миллисекунды (при тике в 1 мс) до минуты (65,536 с).Синхроквант будет управляться двумя флагами – статусом кванта и флагом кванта.Статус кванта предусмотрен для управления им из программы пользователя, флаг таймерабудет устанавливаться таймером при истечении заданной в кванте задержки времени.Квант будет запущен диспетчером, если установлены его статус и флаг.Распределение переменных диспетчера в памяти МКЕсли при программировании на языках высокого уровня переменным просто задаются символические имена и определяется их тип, при программировании на ассемблереесть возможность явно определить расположение переменных в адресном пространстверезидентной оперативной памяти МК.
Это повышает эффективность использования памяти и быстродействие программы.Проведем распределение переменных в памяти, отведем для хранения статусов ифлагов два байта из зоны битового процессора, что позволит нам эффективно работать сотдельными битами (очищать CLR bit и устанавливать их SETB bit командами битовогопроцессора).Ячейка резидентной памяти микроконтроллера с адресом 20h будет регистромстатусов квантов, каждый ее бит содержит статус соответствующего кванта в соответствиис таблицей 1.
Биты этого регистра устанавливаются программно пользователем. Если пользователь хочет запустить какой-либо квант или периодически перезапускать его по истечениизаданной задержки, он должен установить в единицу статус этого кванта. Если квант запускать не нужно – очистить соответствующий бит.52Таблица 5.1.Содержимое регистра статусов квантов (ячейки 20h)№ бита7Адрес бита 7Назначение SPR766SPR655SPR544SPR433SPR322SPR211SPR100SPR0Ячейка резидентной памяти микроконтроллера с адресом 21h будет регистромфлагов квантов, каждый ее бит содержит флаг соответствующего кванта в соответствиис таблицей 2. Флаги квантов устанавливаются в подпрограмме обработки прерыванийтаймера Т/С0. Такое двойное управление квантом с помощью флагов и статусов сделанодля того, чтобы максимально сократить время обработки прерывания. В подпрограммедля всех возможных квантов уменьшаются задержки и устанавливаются флаги, когда задержка истечет, а решение о запуске кванта примет диспетчер, если пользователем в своей программе установлен статус соответствующего кванта.Таблица 5.2.Содержимое регистра флагов квантов (ячейки 21h)№ бита7Адрес бита FhНазначение FPR76EhFPR65DhFPR54ChFPR43BhFPR32AhFPR219FPR108FPR0Ячейка с адресом 22h будет регистром размерности задержек квантов (устанавливается пользователем).
Если в соответствующий кванту бит записана единица, задержка отсчитывается в больших тиках, если ноль, в малых.Таблица 5.3.Содержимое регистра разрядности задержек квантов (ячейки 22h)№ бита76543210Адрес бита 17h16h15h14h13h12h11h10hНазначение RPR7RPR6RPR5RPR4RPR3RPR2RPR1RPR0Ячейка с адресом 23h – счетный регистр малых тиков. Система отсчета времениведется в малых тиках, период которых может быть настроен пользователем (исходнодлительность малого тика 1 мс) и в больших тиках, содержащих 256 малых. Тик, совпадающий с обнулением ячейки 23h, считается большим.Создадим систему отсчета реального времени.
Таймер микроконтроллера может работать в четырех режимах (см. гл. 3.2). Наиболее гибким и удобным для построения диспетчера представляется режим 1, схема функционирования которого и содержание управляющего регистра таймера TMOD представлены на рис.5.1.Здесь в регистре TMOD определен режим таймера Т/С0, система не ограничиваетпользователя в выборе допустимого режима Т/С1.Если в подпрограмме обработки прерываний перезагружать старший и младший регистры таймера, мы сможем гибко регулировать время малого тика (время прерывания таймера), абольшой тик будет отсчитываться после 256 прерываний (малых тиков).В ячейках с адресами 24h и 25h будем хранить начальные значение старшего имладшего байта TH0 и TL0 таймера счетчика Т/С0.
Таймер счетчик начинает считать от16-и разрядного числа, заданного регистрами 24h и 25h и, как только переполнится, возникнет прерывание и запустится подпрограмма его обработки. В подпрограмме обработкиэтого прерывания снова установим начальное значение счетного регистра таймера и обработаем флаги прерываний в соответствии с заданными задержками квантов.53В микроконтроллерах семейства MCS-51 - автовекторная система прерываний. Закаждым источником прерываний закреплен свой вектор – адрес в младшей зоне памятипрограмм.Затаймером Т/С0закреплен вектор0Bh.
При наступлении прерывания микроконтроллер заканчивает выполнениеочереднойкоманды и записывает в стек содержимое счетчика команд, атам всегда содержится адресследующей коРис. 5.1. Функциональная схема работы и состояние регистра режимовманды, которуютаймера TMOD для проектируемого диспетчера процессов.следует выполнить.
Это нужно,чтобы после обработки прерывания вернутся к выполнению основной программы. Затем всчетчик команд заносится вектор наступившего прерывания. МК обращается в памятьпрограмм по этому адресу, считывает и выполняет приведенную там команду.Ячейка с адресом 26h – регистр управления очередью квантов. Квант запускается из пультовой петли диспетчера, если установлены его статус и флаг. Анализ состоянийквантов (очередность запуска) будем вести по двум стратегиям:1) приоритетный запуск, начинается анализ с нулевого кванта (самого приоритетного) и заканчивается седьмым.2) круговой запуск, если выполнялся, например, пятый квант, после его выполнения и возврата в диспетчер первым анализироваться будут условия запускашестого, седьмого, нулевого, первого и т.д.Бит 26.0 (нулевой бит ячейки 26h) – бит круговой очереди в диспетчере.
Если онсброшен в 0 – приоритетный запуск, если установлен в 1 – круговой.Для стека микроконтроллера выделим зону памяти в 28 байтов с адреса 64h и до конца резидентной памяти данных. Стек используется микроконтроллером при вызове подпрограмм. Так же программисты используют стек для передачи в подпрограммы параметров – значений. Длина стека в 28 байтов, скорее всего, не будет ограничивать программиста. При необходимости программист может изменить значение указателя стека.Распределение оперативной памяти микроконтроллера с диспетчером процессов показано в таблице 5.4.