i
МИКРОКОНТРОЛЛЕРЫ
I
подпрограммы (нечто подобное мы
делали при написании автомата по
switch-технологии, только там в ре-
гистр IR1 загружался адрес пере-
хода), но если мы его туда загру-
зим, мы испортим прежнее содер-
жимое регистра IR1 и уже не смо-
жем добраться ни до байта с новым
состоянием автомата, ни до адре-
са подпрограммы выхода. Выход
один - прежнее содержимое реги-
стра IR1 надо где-то
сохранить,
затем воспользоваться регистром
IR1 для выполнения команды
ijsr,
а затем
восстановить
его прежнее
содержимое. Сохранить содержи-
мое регистра в принципе можно в
свободных ячейках ОЗУ, например
%а4
и
%а5
(для сохранения содер-
жимого регистра в ячейке О ЗУ в
системе команд микроконтроллера
есть команда
mfpr,
а для обратной
записи ячейки ОЗУ в регистр - ко-
манда
mtpr),
но в микроконтролле-
ре для этой цели существует спе-
циальный блок - стек данных. Стек
представляет собой дополнитель-
ный блок пам яти разм ером 16
байт, никак не связанный ни с ОЗУ
микроконтроллера, ни с его адрес-
ным пространством. Над стеком
можно выполнять две команды:
- команда
push
- сохраняет со-
держимое указанного в команде
регистра в стек данных
- команда
pop
- восстанавлива-
ет информацию из стека в указан-
ный в команде регистр
Принцип хранения данны х в
стеке-т.н. принцип
LIFO
(last in -
first out), т.е байт, записанный в
стек данных последним, будет из-
влечен оттуда первым. Стек в про-
грамистской литературе называют
еще термином
магазин
- по ана-
логии с магазином автомата, в ко-
тором
самый последний
заряжен-
ный в магазин патрон выстрелит
самым первым.
“Верхняя” ячейка
стека (последний вставленный пат-
рон) в программистской литерату-
ре называется
вершиной
стека.
Пользоваться стеком вместо яче-
ек ОЗУ намного удобнее, потому
что не требуется отводить ячейки
памяти для временного хранения
(ведь свободных ячеек О ЗУ в дос-
тупных в данный момент сегментах
может просто-напросто не оказать-
ся, и тогда придется перезагружать
один из сегментных регистров, что-
бы добраться до свободного сег-
мента, а ведь сегментный регистр
терять-то тоже не хочется!) и не
требуется задавать никакие адре-
са, но у стека данных есть ограни-
чение - в него можно записать не
более 16 байт! Будьте вниматель-
ны - если в вашей программе вы-
полнится слиш ком много команд
push
без соответствующих команд
pop,
процессор микроконтроллера
вырабатывает сигнал немаскируе-
мого преры вания,“переполнение
стека” (зто - чрезвычайно серьез-
ная программная ошибка). Точно
так же, если из-за ошибки в про-
грам м е вы вы полните слиш ком
много команд
pop,
процессор мик-
роконтроллера выработает сигнал
немаскируемого прерывания “пе-
реопустош ение стека” . Поэтому
ср а зу дадим читателю совет -
пользоваться стеком данных в про-
граме нужно аккуратно.
Итак, продолжим комментиро-
вание программы:
5. Сохраняем содержимое реги-
стра IR1 (т.е. регистров #6 и #7) в
стек данных. Теперь их можно как
угодно портить.
6. Загружаем регистр IR1 адре-
сом подпрограммы проверки тер-
минального символа. Адрес этот
мы предварительно переписали в
ячейки
%а1
и
%а2,
поэтому теперь
мы загружаем их в регистры #6 и
#7
с помощью команд
mtpr.
Сразу
ответим на один каверзный вопрос,
который, возможно, уже возник у
читателя - а нельзя ли было выпол-
нить эту операцию напрямую, т.е
mptr #6,%d7, mtpr #7,%d7?
Нет,
нельзя! Причин для этого две: одна
- общая для любого микроконтрол-
лера, вторая - специфичная имен-
но для КР1878ВЕ1. Общая причи-
на заключается в том, что после
первой же команды
mtpr
мы заме-
ним младшую часть адреса строч-
ки таблицы table, хранящуюся в ре-
гистре #6, младшей частью адреса
подпрограммы. Такой “оригиналь-
ный" адрес будет указывать уже и
не на таблицу, и еще не на подпрог-
рамму - понятно, что поведение
программы после этого станет аб-
солютно непредсказуемым. С тем
же успехом можно, открыв один за-
мок на двери своим ключом, пы-
таться открыть второй ключом от
квартиры соседа. Специфичная же
для микроконтроллера КР1878ВЕ1
причина заключается в том, что
в
команде пгКрг нельзя использо-
вать
конструкцию
°/о<31,
если ре-
гистр 1И1 указывает в зто время на
память программ (кстати говоря,
очень жаль - иногда такая возмож-
ность была бы полезна, о чем ав-
тор в процессе написания про-
грамм неоднократно жалел).
7.
И, наконец, - вызов подпрог-
раммы проверки терминального
символа цвг. И вот теперь настало
время поговорить поподробнее о
том, что же зто такое - подпрог-
рамма.
Понятие
подпрограммы
явля-
ется одной из фундаментальных
идей програм м ирования. Пред-
ставьте себе, что нам необходимо
выполнить какую -то однотипную
последовательность действий в не-
скольких местах программы (на-
пример, сыграть какую-нибудь ме-
лодию). Первое, -
очевидное, -
решение заключается в том, что во
всех местах, где зто необходимо,
мы повторяем набор команд, кото-
рым добиваемся нужного эффекта
(сделать зто с помощью редакто-
ра не так сложно - надо просто ско-
пировать кусок программы, играю-
щий мелодию, во все нужные мес-
та программы). У этого очевидно-
го решения есть только один недо-
статок - мы тем самым увеличим
(и очень значительно) объем про-
граммы, а память программ микро-
контроллера - не резиновая! Выхо-
дом из положения явилось появле-
ние в программировании
механиз-
ма вызова подпрограмм.
Под-
программа - зто как раз и есть тот
кусок кода, который раньше надо
было вставлять во все места про-
граммы, где он требовался. Теперь
мы вставляем его куда-нибудь в
“хвост” нашей программы, где он
не будет никому мешать, а в саму
программу, во все места, где дол-
жен был бы быть этот кусок кода,
вставляем специальные
команды
--------------------------------------------1 47
Радиолюбитель - 0 9 /2 0 0 5 |
предыдущая страница 45 Радиолюбитель 2005-09 читать онлайн следующая страница 47 Радиолюбитель 2005-09 читать онлайн Домой Выключить/включить текст