i
МИКРОКОНТРОЛЛЕРЫ
i
- обработчики соответствующих прерываний просто
до-
пишут
в очередь информацию о новых сообщениях, а
уж фоновый процесс рано или поздно их обработает.
Очередь сообщений постоянно “дышит”, сглаживая, та-
ким образом, нагрузку на процессор микроконтроллера
- ведь в реальных системах не всегда и не все прерыва-
ния поступают регулярно: период “наплыва” прерыва-
ний сменяется периодом относительного “спокойствия".
Пример программы, реализующей описанное взаимо-
действие фонового процесса и обработчиков прерываний,
можно скачать с сайта ж урнала “ Радиолюбитель”
(файл
ехатр1е3.г'1р,
раздел “Программы”). Мы подроб-
но разберем из нее только один фрагмент, имеющий
принципиальное значение для работы программы.
Сразу хочется сделать и одно замечание - обработка
очереди сообщений, как и работа с прерываниями,
тоже идеальным образом “ложится” на технику авто-
матного программирования, поскольку код сообщения
- зто, по сути дела, код терминального символа, при-
шедшего на вход автомата.
Итак, вот этот ф рагмент программы:
loop: sst
00001000b
; <1> Разрешить прерывания.
wait
; <2> Ожидаем прерывания.
test: cst
00001000b
; <3> Запретить прерывания.
jsr
testQueue
; <4> Проверить очередь, выбрать из иее первый элемент
; в ячейки %а0 и %а1 и удалить его из очереди сообщений.
jnc
loop
; <5> Очередь пуста, ждем дальше
sst
00001000b
; <6> Разрешить прерывания.
; Обработка выбранного по testQueue элемента.
jmp
test
; <7> Закончена обработка сообщения, проверить, есть ли новые
Сразу - необходимые комментарии:
1. Вначале необходимо разрешить работу механиз-
ма прерываний. Это мы делаем уже известной нам ко-
мандой sst.
2. Теперь мы переводим фоновый процесс в состо-
яние ожидания (команда w ait). В этом состоянии фо-
новый процесс будет находиться до тех пор, пока не
произойдет очередной прерывание. Сразу ответим на
один каверзный вопрос - а что будет, если прерыва-
ние возникнет непосредственно после команды sst (та-
кое ведь вполне может случиться)? Тогда, по логике
работы, обработчик прерываний должен получить уп-
равление до того, как фоновый процесс перейдет в
состояние ожидания! Да, он, конечно, занесет в оче-
редь сообщений информацию о прерывании, но ведь
после завершения его работы фоновый процесс про-
сто встанет в ожидание и не двинется с места, до тех
пор, пока не случится какое-нибудь другое, совершен-
но постороннее прерывание! Не будет ли фоновый про-
цесс обрабатывать прерывания с опозданием “на один
шаг”? Нет, не будет! Вспомните, о чем мы только что
говорили при описании конвейера команд - запись бита
разрешения прерываний в регистр состояния процес-
сора произойдет уже тогда, когда будет “почти” выпол-
нена команда wait! Благодаря этой “странности” кон-
вейера никаких прерываний между командами sst и
w ait в принципе возникнуть
не может.
Кстати, зто, ви-
димо, одна из причин, побудившая разработчиков мик-
роконтроллера принять именно такой способ реализа-
ции конвейера команд - многие “глупые” решения раз-
работчиков микроконтроллеров оказываются на повер-
ку исполненными глубокой мудрости. Заодно - прак-
тическая рекомендация:
нельзя
вставлять никаких до-
полнительных команд между командами sst и w ait, в
противном случае при организации взаимодействия
фонового процесса с обработчиками прерываний вы
действительно рискуете потерять сигнал прерывания
(не
для обработчика прерываний - он получит управ-
ление в
любом
случае, -
а
для фонового процесса).
3.
Принципиально важный момент - вновь запре-
тить работу механизма прерываний! Связано зто с тем,
что сейчас мы будем работать с очередью сообщений:
проверять ее состояние и выбирать первый элемент -
удаляя его при этом из очереди! Если бы механизм
прерываний при работе с очередью был включен, то
процедура 1е8КЭиеие в любой момент могла бы быть
прервана обработчиком прерываний, который, к при-
меру, захотел бы что-то.в очередь дописать. Представ-
ляете картину - двое человек: один роет яму, другой
ее засыпает! М ного бы они наработали.
.. Поэтому
общее правило параллельного программирования гла-
сит:
при работе с общим ресурсом
(в данном случае
с очередью сообщений)
модификацию ресурса
(до-
бавление и удаление сообщений из очереди)
имеет
право в данный момент времени производить толь-
ко один процесс!
Для обработчиков прерываний это
правило реализуется “естественным” образом - когда
выполняется обработчик прерываний, все остальные
процессы “отдыхают” (потому что механизм обработки
прерываний отключен и вмешаться в работу обработ-
чика никто не может). А вот для ф онового процесса
выполнение это правило нужно обеспечивать допол-
нительными усилиями - в данном случае, явным зап-
ретом работы механизма прерываний: тогда никакие
обработчики со своими добавлениями не помешают
фоновому процессу правильно удалить сообщение из
очереди. В “большом” программировании для обеспе-
чения такой дисциплины работы с совместно использу-
емыми ресурсами (их еще называют
разделяемыми)
----------------------------------------------------1 37
Радиолюбитель - 0 8 /2 0 0 6 1
предыдущая страница 36 Радиолюбитель 2006-08 читать онлайн следующая страница 38 Радиолюбитель 2006-08 читать онлайн Домой Выключить/включить текст