i
МИКРОКОНТРОЛЛЕРЫ
I
вызова
этого куска кода - подпрог-
раммы. Таким образом мы эконо-
мим память программ - ведь те-
перь кусок кода у нас только один,
а вызываем мы его из стольких
мест, из скольких зто необходимо.
Когда процессор микроконтролле-
ра встречает команду вызова под-
программы (в микроконтроллере
для этого существуют две коман-
ды:
jsr
и
ijsr),
он передает управ-
ление на указанную подпрограмму
(в точности таким же способом, как
это делает команда перехода
jmp),
затем подпрограм м а вы полняет
все необходимые действия, а за-
тем.
.. А затем - что? Ведь затем из
подпрограммы надо возвратиться
в то место, откуда она была вы з-
вана, а мест, откуда ее могли вы з-
вать, в программе могут быть де-
сятки! С ледовательно, вы зы вая
подпрограмму, м икроконтроллер
должен каким-то образом запом -
нить место, откуда он ее вызвал!
И именно для запоминания этого
места и существует в микроконт-
роллере вторая сущ ность - стек
адресов возврата. Это - тоже спе-
циальное ОЗУ, емкость которого -
8 слов (напоминаем, что адрес лю-
бого “места” в программе имеет
размер 2 байта или 1 слово). Ког-
да процессор микроконтроллера
встречает команды вы зова под-
программ, он в первую очередь
“вталкивает” (наподобие команды
push)
в стек адресов возврата ад-
рес команды,
следующей
за ко-
мандой
jsr
или
ijsr,
и только потом
передает управление подпрограм-
ме. Когда же подпрограмма выпол-
няет все необходимые действия, то
для того, чтобы вернуться в то ме-
сто, откуда ее вызвали, она долж-
на выполнить специальную коман-
ду
rts
- возврат из подпрограммы.
По сути своей, команда
rts
- это
“хитрая” команда перехода, и пере-
дает управление она по тому адре-
су, который в данный момент на-
ходится в
вершине
стека адресов
возврата, причем при выполнении
этой команды адрес из вершины
стека “выталкивается” (наподобие
команды
pop).
А поскол ьку там
всегда находится адрес команды,
следующей за командой вызова
48 |-------------------------------------------
подпрограммы (т.е. как раз тот ад-
рес, куда необходимо вернуться из
подпрограммы), команда и получи-
ла свое название - “возврат из под-
программы”.
Зачем в стеке адресов возвра-
та целых восемь слов? Для того,
чтобы изнутри подпрограмм тоже
можно было вызывать другие под-
программы - в подпрограмме ведь
тоже могут оказаться повторяющи-
еся куски кода. По аналогии с вло-
женными циклами, для подпрог-
рамм, вызванных из других под-
програм м , прим еняется терм ин
вложенные подпрогрвммы.
Чис-
ло подпрограмм, вызвавш их друг
друга (т.н.
уровень вложенности
подпрограмм),
для микроконтрол-
лера КР1878ВЕ1 не должен превы-
шать 8 (стек адресов, напомним,
содержит только 8 слов).
Продолжим комментирование
программы:
8.
Давайте сразу же рассмот-
рим какую-нибудь подпрограмму,
например testDown. Получив уп-
равление по команде
ijsr,
зта под-
программа, в первую очередь, про-
веряет, нажата ли кнопка. Делает
она это тем же способом, что и в
switch-технологии, поэтому подроб-
но разбирать этот участок не бу-
дем. А вот следую щ ий участок
представляет интерес, потому что
в нем вместо команды возврата из
подпрограммы
rts
примена ее спе-
циальная разновидность
rtsc -
возврат с установкой флага С ре-
гистра состояния в определенное
значение (лог.О или лог.1). Если по-
см отреть код аналогичной про-
граммы проверки testUp, там тоже
выполняется возврат таким же спо-
собом. Если читатель вниматель-
но проанализирует обе подпрог-
раммы, он заметит, что С=1 уста-
навливается в них тогда, когда
ожидаемый терминальный символ
(“Потянуть за веревочку” или “О т-
пустить веревочку” соответствен-
но) обнаружен, а С=0 - при его от-
сутствии, т.е. с помощью флага С
регистра состояния вызванная под-
програм м а
извещает
вы зы ваю -
щую программу о том, найден ли
проверяемы й ею терм инальны й
символ. Такой способ извещения
вы зы ваю щ ей программы в про-
граммистской литературе именует-
ся
кодом возврате
или
кодом за-
вершения.
Выполнив соответству-
ющую подпрограмму, мы не толь-
ко вернемся обратно, но и получим
таким образом информацию о том,
есть ли на входе автомата требуе-
мый терминальный символ.
9. Сразу после возврата из под-
программы выполняются команды
pop #7
и
pop #6,
в результате чего
в регистре IR1
восстановится
та
информация, которая была в нем
перед выполнением команд
push
#6
и
push #7.
Обратите внимание
- команды
pop
обязательно
дол-
жны выполняться в порядке, об-
ратном тому,
в каком выполнялись
в программе команды
push!
Это -
общее правило работы со стеком,
и исключения из него совершенно
недопустимы!
10. А вот теперь настала пора
проанализировать код возврвта
из подпрограммы проверки терми-
нального символа: команда
jnc
пе-
редаст управление на метку $2,
если флаг С=0, т.е. ожидаемый тер-
минальный символ подпрограммой
проверки не найден. К участку кода
с меткой $2 применим тот же ком-
ментарий, что и к участку кода с
меткой $1 - фиктивные сравнения
предназначены исключительно для
передвижения регистра IR1 на сле-
дующ ую строчку таблицы, но те-
перь передвигать его надо всего на
3 байта - на два байта мы его уже
сдвинули ранее командами
mov
%a1 ,%d7
и
mov %a2,%d7.
11. Если же нужный терминаль-
ный символ подпрограммой про-
верки найден (флаг С=1), то коман-
да условного перехода
jnc
процес-
сором проигнорируется, и будет
вы полнена следую щ ая команда
mov %a0,%d7
- таким способом
мы изменили текущ ее состояние
автомата на новое, взятое из таб-
лицы (регистр IR1 сдвинулся при
этом еще на 1 байт и указывает
теперь на адрес подпрограммы
выхода)
12. Следующ ие две команды
mov,
две команды
mtpr
и команда
ijsr
вызывают на выполнение под-
программу выхода, предусмотренную
| Радиолюбитель - 0 9 /2 0 0 5
предыдущая страница 46 Радиолюбитель 2005-09 читать онлайн следующая страница 48 Радиолюбитель 2005-09 читать онлайн Домой Выключить/включить текст