Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
3. Разделить вашу систему на независимые задачи.
4. Выполнить операционную систему, основная функция которой заключается в планировании и управлении задачами.
5. Написать код задач. Убедитесь, что задачи не конкурируют за одни и те же участки памяти и что они не зависят друг от друга. Убедитесь также, что реализация задачи соответствует принятому алгоритму планирования.
6. Если вы разрабатываете систему с передним планом и фоновыми задачами, разработайте сначала фоновую, а затем приоритетную часть.
7. И что важнее всего, проверяйте, проверяйте и проверяйте! Используйте звуковые методики испытаний, которые были обсуждены в главе 2.
8.8. Пример применения: ОСРВ циклического опроса
В этом разделе мы обсудим различные операционные системы в режиме реального времени. Мы начнем с базовой системы циклического опроса, а затем рассмотрим систему циклического опроса с прерываниями. Затем мы опишем аппаратный имитатор, предназначенный для разработки и проверки более сложных алгоритмов планирования.
8.8.1. Краткий обзор проекта
Мы исследуем здесь базовую систему циклического опроса, используемую для управления стереоусилителем. Мы рассматривали уже такой усилитель в главе 2, когда обсуждали проектирование систем и затем в данной главе в качестве примера системы циклического опроса. На рис. 8.18 представлен общий вид системы усилителя. Шесть переключателей на передней панели блока или на пульте дистанционного управления используются, чтобы выбрать один из шести источников звукового сигнала. На усилитель в любой момент времени подается сигнал только с одного источника.
Рис. 8.18. Краткий обзор усилителя
8.8.2. Пример кода
Приведенный код, который используется, чтобы управлять усилителем, состоит из кода инициализации и цикла опроса. Цикл опроса непрерывно проверяет изменение в состоянии переключателей на лицевой панели блока (PORTB) или дистанционном управлении (PORTA). Алгоритм управления UML приведен на рис. 8.19.
Рис. 8.19. Алгоритм программы UML для усилителя
//file name: ampl2.с
//function: program provides control of amplifier
//target controller: Motorola 68HC912B32 evaluation board (EVB)
// - 32K Flash EEPROM available at $8000
// - Compiler options:
// - Program Memory: 0x8000
// - DataMemory: 0x0800
// - Stack Pointer: 0x09FF
//
// Эта программа обеспечивает управление звуковым усилителем.
// Усилитель может принимать звуковой сигнал от ряда
// источников. Пользователь может выбирать источник сигнала
// для усиления с помощью переключателей на лицевой панели
// (связанных с портом B), либо переключателей на пульте
// дистанционного управления (связанных с портом A). Процессор
// управляет светодиодами на передней панели(связанными с портом P)
// и показывающими активный источник сигнала и включает реле(связанные
// с портом T), подсоединяющие один из источников сигнала к усилителю
//
// Функции портов ввода
//
// Порт А, входной - вводит сигналы от пульта дистанционного управления,
// требует импульсов высокого логического уровня длительностью в 100 мс
// PA7 выкл. звука от пульта дист. управления высокий - импульс 100 мс
// PA6 Дополнительный канал (ДК) от пульта дист. управления высокий
// импульс 100 мс
// PA5 магнитофон # 2 от пульта дист. управления высокий - импульс 100 мс
// PA4 магнитофон # 1 от пульта дист. управления высокий - импульс 100 мс
// PA3 тюнер от пульта дист. управления высокий - импульс 100 мс
// PA2 CD от пульта дист. управления высокий - импульс 100 мс
// PA1 пианино от пульта дист. управления высокий - импульс 100 мс
// PA0 предусилитель от пульта дист. управления высокий - импульс 100 мс
// Порт В входной - от переключателей на лицевой панели блока
// PB0 предусилитель от переключателя на лицевой панели, вжатый перек-
// лючатель = вкл
// PB1 пианино от переключателя на лицевой панели, вжатый переключатель = вкл
// PB2 CD от переключателя на лицевой панели, вжатый переключатель = вкл
// PB3 тюнер от переключателя на лицевой панели, вжатый переключатель = вкл
// PB4 магнитофон # 1 от переключателя на лицевой панели, вжатый пе-
// реключатель = вкл
// PB5 магнитофон # 2 от переключателя на лицевой панели, вжатый пе-
// реключатель = вкл
// PB6 ДК от переключателя на лицевой панели, вжатый переключатель = вкл
// PB7 выкл. звука от переключателя на лицевой панели, вжатый перек-
// лючатель = вкл
//
//Порт P выходной - светодиоды на лицевой панели
//PP0 сигнал на силовое реле и на светодиоды и сигнал низкого уровня
//для //светодиодов в буфер
//PP1 светодиод пианино выходной низкопотенциальный сигнал - 10 мА
//PP2 светодиод CD выходной низкопотенциальный сигнал - 10 мА
//PP3 светодиод тюнер выходной низкопотенциальный сигнал - 10 мА
//PP4 светодиод магнитофон # 1 выходной низкопотенциальный сигнал - 10 мА
//PP5 светодиод магнитофон # 2 выходной низкопотенциальный сигнал - 10 мА
//PP6 светодиод ДК выходной низкопотенциальный сигнал - 10 мА
//PP7 светодиод выкл. звука, сигнал на силовое реле
//
//Порт T выходной - драйверы реле
//PT0 реле RESET выход на реле RESET высокий уровень - импульс 5 мс
//PT1 реле пианино выход на реле пианино высокий уровень - импульс 5 мс
//PT2 реле CD выход на реле CD высокий уровень - импульс 5 мс
//PT3 реле тюнера выход на реле тюнера высокий уровень - импульс 5 мс
//PT4 реле магнитофон # 1 выход на реле магнитофон # 1 высокий уро-
//вень - импульс 5 мс
//PT4 реле магнитофон # 2 выход на реле магнитофон # 2 высокий уро-
//вень - импульс 5 мс
//PT6 реле ДК выход на реле ДК высокий уровень //- импульс 5 мс
//PT7 высокий уровень - импульс 10 мс для подачи питания на оптроны
//светодиодов и усилитель
//Подача питания (от сети или от источника 5 В):
//Конфигурация портов:
//1. Порт A: конфигурирован как входной, отжатый переключатель - запрет
//2. Порт B: конфигурирован как входной, отжатый переключатель - разрешение
//3. Порт P: конфигурирован как выходной, все линии в 1
//4. Порт T: конфигурирован как выходной, все линии в 0
//5. Установка "RELAY-RESET" (PTO) импульсом высокого состояния 5 мс
//6. Установка "RELAY-CD" (PT2) импульсом высокого состояния 5 мс
//7. Установка "WHICH-INPUT" позиция сохранения = "CD"
//8. Цикл PP1-РР6 (устанавливаются в низкое состояние) светодиоды
// показывают , что контроллер работает
//9. Переход к последовательности "PREAMP ON"
//
//Логика работы :
//Последовательность "PREAMP ON"
//1. Ожидание установки "S-PREAMP-PWR" (PB0) или "R-PREAMP-PWR" (РАО)
//2. Установка "LED-MUTE-RELAY" (PP7)
//3. Установка "LED-PWR-RELAY" (PP0)
//4. Считывание позиции в "WHICH-INPUT"
//5. Установка "LED-xxxxx" = позиция "WHICH-INPUT"
//6. Установка PT7(1) импульсом 10 мс
//7. DE-Assert "LED-MUTE-RELAY" (PP7) через ~3 с.
//8. переход к режиму "SCAN"
//
//Последовательность "SCAN"
//1.Ожидание входного сигнала от (PB0-PB7) или от (PA0-PA7)
//2. IF = "x-PREAMP-PWR" - переход к последовательности "PREAMP OFF"
//3. IF = "x-MUTE" GOTO - переход к последовательности "MUTE"
//4. IF = любой входной сигнал от (PB1-PB6) или (PA1-PA6)- переход к
"CHANGE"
// последовательность "INPUT"
//
// последовательность "CHANGE INPUT":
//1. Включить "LED-MUTE-RELAY" (PP7)
//2. Включить "RELAY-RESET" (PT0) импульсом высокого уровня 5 мс
//3. Включить "RELAY-xxxxx" (PT1-PT6) (в соответствии с выбором
// "WHICH-INPUT" импульсом высокого уровня 5 мс)
//4. Включить "LED-xxxxx" (PP1-PP6) (в соответствии с выбором
// "WHICH-INPUT")
//5. Очистить Old/Input сохранить новое значение "WHICH-INPUT"
//6. DE-переключение "MUTE-RELAY" (PP7) примерно через 3 с.
//7. Перейти к последовательности "SCAN"
//
// последовательность "MUTE":
//1. Переключить "LED-MUTE-RELAY" (PP7)
//2. Перейти к последовательности "SCAN"
//
//Последовательность "PREAMP OFF":