Главная | |
Материал взят из книги![]() Скачать оригинал КНИГИ в хорошем качествеОсновы микропроцессорной техники 51 одной и той же памяти. В простых микропроцессорных устройствах, таких, как позиционер спутниковой антенны, для хранения программ обычно используется ПЗУ. Теперь рассмотрим процесс выполнения программы. Для реализации этого процесса любой процессор имеет встроенный регистр адреса текущей выполняемой программы. Работа микропроцессорного устройства начинается с начального сброса. Сразу после включения питания специальный узел подает импульс сброса на вход RESET процессора. По этому сигналу все внутренние системы процессора устанавливаются в исходное состояние. В регистр адреса записывается адрес начала программной памяти. По окончании импульса сброса включается встроенный алгоритм выполнения программ. Повинуясь этому алгоритму, процессор начинает последовательно читать коды, записанные в программной области памяти, начиная с первой ячейки программной памяти. После выполнения очередной команды процессор увеличивает значение счетчика команд на единицу и переходит, таким образом, к выполнению следующей команды. Если очередная команда состоит не из одного, а из двух и более байтов, то после чтения кода операции процессор последовательно считывает эти дополнительные байты, увеличивая каждый раз значение счетчика команд. Информация о том, сколько байт читать и как выполнять каждую из команд, записана в виде микрокоманд внутри самого процессора. Режим выполнения программы продолжается все время, пока на процессор подано питающее напряжение. Закончить выполнение программы процессор может либо при поступлении нового импульса сброса, либо при выполнении специальной команды остановки. Всю совокупность команд любого микропроцессора можно разделить на три большие группы. Первая группа — это команды перемещения данных. Повинуясь этим командам, процессор копирует содержимое ячейки памяти в один из внутренних регистров, либо наоборот, копирует содержимое регистра в одну из ячеек памяти. Кроме того, данные могут копироваться из одного внутреннего регистра в другой. Нужно заметить, что в процессе всех этих перемещений содержимое источника информации остается неизменным. Специфика любой ячейки памяти такова, что невозможно стереть записанное туда число. Можно только записать туда другое. Ко второй группе относятся команды преобразования данных. А именно: команды сложения, вычитания, логических преобразований, сдвига разрядов и другие. К третьей группе относятся команды передачи управления. Вот об этом классе команд я хотел бы поговорить подробнее. Сложно представить себе программу, состоящую лишь из одной последовательной цепочки команд. Подавляющее число алгоритмов требуют разветвления программы. Это значит, что программа должна уметь выполнять разные последовательности действий в зависимости от того, выполняется или нет какое-либо условие. Приведу конкретный пример. Позиционер спутниковой антенны имеет кнопки управления. При нажатии на соответствующую кнопку, можно заставить позиционер выполнять введенную таким образом команду. Так, например, при нажатии клавиши «Поворот на восток», устройство должно включить двигатель для поворота антенны в этом направлении. При нажатии клавиши «Поворот на запад», система должна включить двигатель в реверсивном направлении. И так далее. Для того, чтобы программа могла реагировать на нажатия кнопок, она, повинуясь внутреннему алгоритму, периодически считывает состояние клавиатуры. Обнаружив нажатие клавиши, программа должна прекратить опрос клавиатуры и перейти к другому алгоритму: алгоритму включения мотора. Для того, чтобы программа имела возможность менять алгоритм своей работы в зависимости от какого-либо условия, в системе команд любого процессора обязательно имеются команды передачи управления. К командам передачи управления относятся следующие виды команд: • команды условного перехода; • команды безусловного перехода; • команды перехода к подпрограмме; • команды организации цикла. Рассмотрим действие всех этих команд по порядку. КОМАНДЫ УСЛОВНОГО И БЕЗУСЛОВНОГО ПЕРЕХОДА Оба этих вида команд предназначены для того, чтобы прерывать последовательность выполнения команд и вызывать, так называемый, переход. Причем условный переход происходит только при соблюдении какого-либо условия. Безусловный переход выполняется всегда, как только программа встретит соответствующую команду. В качестве условий перехода может выступать одно из следующих логических выражений: Величина А равна величине В. Величина А не равна величине В. Величина А меньше величины В. Величина А больше величины В. Величина А меньше или равна величине В. Величина А больше или равна величине В. В качестве величин для сравнения может выступать содержимое любого внутреннего регистра процессора, содержимое любой ячейки памяти или просто константа. Рассмотрим пример применения условного и безусловного переходов. Допустим, что в зависимости от того, нажата или отпущена некая кнопка на панели управления позиционера, наша программа должна выполнить разные последовательности действий. На рис. 30 изображен ход выполнения такой программы. Квадратиками обозначены обычные команды программы. Кружочек с вопросом — это команда условного перехода. Скругленный элемент с восклицательным знаком — это безусловный переход. Стрелками показана последовательность выполнения программы. В случае нажатой клавиши должна выполниться ветвь 1, а в случае отпущенной — ветвь 2. Для того, чтобы процессор смог оценить состояние нашей клавиши, ее подключают к одному из портов ввода/вывода. В начале программы процессору дается команда прочитать число из этого порта. Полученное число будет зависеть от состояния клавиши. Допустим, при нажатой клавише процессор считает число 1, а при отпущенной — число 0. Тогда действие, выполняемое условным оператором, можно записать так: если считанное число равно 2, перейти к выполнению ветви 2. Соответственно, в случае невыполнения условия, программа продолжит свою работу в обычном режиме и перейдет, таким образом, к выполнению ветви 1. В конце ветви 1 стоит оператор безусловного перехода. Он служит для того, чтобы программа не выполнила ветвь 2 после выполнения ветви 1. В данном случае никакого условия для перехода не требуется. КОМАНДЫ ОРГАНИЗАЦИИ ЦИКЛА Циклическое выполнение группы команд — очень эффективное средство для сокращения программного кода. Иногда требуется выполнить одну и ту же группу команд несколько раз. Вместо того, чтобы много раз записывать одни и те же команды, можно заставить любой участок программы выполняться по несколько раз. Для этого и служат команды организации цикла. Допустим, мы хотим создать простейшую антидребезговую программу. Для избавления от дребезга мы будем считывать состояние кнопки не один, а несколько раз. Полученные числа мы сложим между собой. Из-за дребезга контактов кнопки мы не получим четкого срабатывания. Поэтому вместо сплошных единиц (кнопка нажата), либо сплошных нулей (кнопка отпущена) мы получим смесь нулей и единиц. Наша задача — определить, чего больше. Допустим, что мы будем производить подряд 20 операций чтения и сложения. Вспомним, что нажатая кнопка дает нам единицу, а не нажатая ноль. Если полученная сумма окажется больше пяти, то кнопка считается нажатой. В противном случае она считается отпущенной. Операции считывания порта и сложения полученных результатов удобно оформить в виде цикла. На рис. 31 показан ход выполнения подобной программы. Как и на предыдущем рисунке, квадратиками обозначены обычные операторы. Кружок с буквой Ц — это оператор цикла. ![]() Важным элементом организации цикла служит регистр, куда записывается число требуемых проходов цикла. Это число называется параметром цикла. В нашем случае он равен 20. Перед началом цикла одна из команд записывает параметр цикла в один из внутренних регистров процессора, выбранный для этой цели. Затем выполняется так называемое тело цикла. Тело цикла составляют те самые команды чтения порта и сложения, которые предназначены для многократного повторения. После выполнения этих команд наступает очередь оператора цикла. Этот оператор выполняет следующие действия: 1. Уменьшает параметр цикла на единицу. 2. Проверяет, не равен ли параметр, после уменьшения, нулю? 3. Если не равен, то оператор осуществляет переход к началу цикла. 4. Если же параметр равен нулю, переход не производится и выполнение программы продолжается в обычном режиме. Благодаря этому алгоритму управление передается на начало цикла до тех пор, пока содержимое указателя цикла не достигнет нуля. После чего цикл заканчивается, и программа продолжает выполняться в обычном режиме. КОМАНДЫ ПЕРЕХОДА К ПОДПРОГРАММЕ К таким командам относятся: команда перехода к подпрограмме, команда выхода из подпрограммы и несколько команд перехода к подпрограмме по условию. Все эти команды составляют еще один механизм сокращения программного кода. Их применяют в том случае, когда необходимо многократно выполнять некие повторяющиеся действия. Например, такое действие, как вывод изображения на индикатор. По ходу выполнения программы возникает необходимость вывести какое-либо изображение в самых разных местах программы. В одном месте программы формируется номер текущего канала. В другом — возникает ошибка и программа должна вывести на индикатор надпись «Error». В третьем месте программа обнаружила нажатие клавиши перехода в рйжим ручного управления и должна вывести на индикатор информацию о его включении. Самое простое решение такой задачи — написать в каждом подобном месте все необходимые команды, реализующие алгоритм вывода изображения на индикатор. Но дело в том, что такая процедура имеет довольно сложный алгоритм. Он состоит не из одного десятка команд. Писать все эти команды каждый раз — это не рациональное расходование программной памяти. В таких случаях подобные участки программы оформляют в виде подпрограммы. Подпрограмма — это просто часть программы, оформленная таким образом, что к ней можно обращаться из любого места остальной программы. Обращение происходит при помощи специальной команды вызова подпрограммы. При вызове подпрограммы автоматически запоминается адрес программной памяти, откуда этот вызов поступил для того, чтобы можно было вернуться к нему. Ряд операторов, составляющих тело подпрограммы, заканчивается командой возврата из подпрограммы. По этой команде управление передается назад, в ту самую точку, откуда подпрограмма была вызвана. Процесс обращения к подпрограмме показан на рис. 32. ![]() Элемент с буквой П — это команда перехода к подпрограмме. Буквой В обозначена команда возврата из подпрограммы. Подпрограмма может находиться в значительном отдалении от места ее вызова. Главное преимущество этого подхода в том, что вызов одной и той же подпрограммы может происходить с самых разных мест программы. Например, процедура вывода на индикатор может понадобиться в нескольких десятках случаев. Если подпрограмма один раз уже написана, то во всех случаях, когда потребуется вывести что-нибудь на индикатор, достаточно поставить команду вызова соответствующей подпрограммы, и вывод готов. Использование подпрограмм также очень удобно для повышения эффективности программирования. Любая подпрограмма воспринимается, как отдельный программный блок, осуществляющий определенную функцию. Из этих блоков, как из кирпичиков, удобно строить основную программу. При построении конструкций глобального масштаба не нужно задумываться о частностях. Поэтому подпрограммы часто используют для повышения структурированности программ. Структурированная программа — это программа, четко разбитая на отдельные программные модули в соответствии с выполняемыми задачами. Вернемся теперь опять к структурной схеме типового микропроцессорного устройства (рис. 29). Для простоты изложения на ней не были показаны две очень важные системы. В любом микропроцессорном устройстве могут присутствовать: система прерываний и система прямого доступа к памяти. Эти системы не являются обязательными, но их применение может существенно увеличить гибкость и эффективность всего микропроцессорного устройства. Что же это за системы. В позиционере спутниковой антенны широко используется механизм прерываний. Прямой доступ к памяти там не применяется, но для полноты картины мы рассмотрим и ее в общих чертах. Начнем с механизма прерываний. Представим себе задачу: на вход позиционера поступают сигналы от датчика поворота антенны. Каждый поступивший сигнал требует немедленной обработки. Обработка состоит из алгоритма антидребезга и процедуры увеличения (или уменьшения в зависимости от направления поворота) содержимого счетчика положения антенны. В то же самое время позиционер должен выполнять и основные свой задачи. Такие, как опрос состояния кнопок управления и отработку команды при нажатии одной из них. А также вывод информации на индикатор. То есть подсчет импульсов от датчика поворота должен выполняться в фоновом режиме. Можно решать проблему фонового режима двумя способами. Первый способ — решать ее «в лоб». То есть разместить где-то в теле основной программы процедуру (подпрограмму) проверки датчика. При этом место размещения процедуры должно быть таково, чтобы обеспечить как можно более частое обращение к этой процедуре. При таком способе опрос датчика будет происходить лишь тогда, когда программа закончит выполнять очередную порцию основной программы. Самый большой недостаток — это нерегулярность опроса датчика. Время выполнения любой части основной программы очень зависит от конкретного режима работы программы. Операции могут так затянуться, что программа не успеет очередной раз считать состояние датчика, и он сработает вхолостую. Специально для таких ситуаций инженеры придумали систему прерываний. У любого современного микропроцессора имеется хотя бы один вход запроса на прерывание. Обычно его именуют 1NT (от слова Interrupt — прерывание). Описанную выше задачу удобно решить с использованием режима прерывания. Для этого мы должны подключить наш датчик к входу INT процессора. Пока на вход INT не поступает никаких сигналов, процессор выполняет основную программу в обычном режиме. Когда антенна начнет вращаться, то в определенный момент времени срабатывает датчик поворота антенны. Сигнал от датчика поступает на вход запроса прерывания. Получив сигнал прерывания, процессор приостанавливает выполнение основной программы и выполняет переход к процедуре прерывания. Действия процессора в этом режиме очень напоминают работу процессора при переходе к подпрограмме. Различие только в том, что этот переход вызван не очередной командой программы, а внешним событием. Адрес, по которому в этом случае передается управление, называется вектором обработки прерывания. В нашем случае по этому адресу должна располагаться процедура обработки сигнала от датчика поворота антенны. Процедура обработки прерывания оканчивается командой выхода из прерывания. Действие этой команды почти полностью аналогично действию команды выхода из подпрограммы. Управление передается на ту команду программы, на которой произошло прерывание. Значение вектора прерывания в разных процессорах определяется по-разному. В одном случае используется фиксированный адрес в памяти. В другом, этот адрес определяется содержимым специального внутреннего регистра процессора и программист должен предусмотреть в своей программе команду записи в этот регистр нужного значения. Многие процессоры имеют сложный механизм определения вектора прерывания. Существуют даже специальные микросхемы — контроллеры прерываний, которые работают совместно с процессором и обеспечивают обработку не одного, а множества прерываний от разных устройств. Подведем итог. Прерывание — это специальный механизм, предусмотренный в микропроцессоре, который позволяет в любой момент, по внешнему сигналу заставить процессор приостановить выполнение основной программы, выполнить операции, связанные с вызывающим прерывание событием, а затем вернуться к выполнению основной программы. Таким образом, обеспечивается фоновый режим выполнения этой дополнительной задачи. Механизм прерываний широко применяется в компьютерной технике. Хороший пример задачи, решаемой при помощи прерывания, это работа манипулятора «мышь» персонального компьютера. Какую бы сложную программу не выполнял компьютер, но указатель свободно бегает по экрану, повинуясь движениям мыши. Часто даже на экране все остальное «зависло». Но указатель мыши живет. Мышь «зависает» только в крайнем случае. Все это происходит только благодаря тому, что манипулятор «мышь» работает по прерыванию. Когда вы перемещаете манипулятор по столу, внутри него вращаются специальные колесики. Связанный с ними диск с отверстиями, вращаясь, перекрывает инфракрасный луч от светодиода. Внутренний процессор, встроенный в манипулятор, подает цифровой сигнал на последовательный порт компьютера. Последовательный порт обнаруживает сигнал и вырабатывает запрос на прерывание для центрального процессора. Получив этот запрос, процессор прерывает выполнение основной программы и выполняет процедуру перемещения изображения «мышиного» курсора по экрану. Затем он возвращается к выполнению своей основной программы. Механизм прерывания в персональном компьютере используется очень широко. Кроме манипулятора «мышь» по прерыванию работают такие устройства, как клавиатура, жесткий диск, внутренние системные часы, порт принтера и некоторые другие. Перед тем, как перейти к изучению конкретного процессора, рассмотрим еще одну систему, широко применяемую в больших компьютерах — систему прямого доступа к памяти. Как уже говорилось выше, в обычном режиме работы всей микропроцессорной системой управляет центральный процессор. Он отвечает за формирование адреса, на соответствующей шине, а также формирует управляющие сигналы ІШ, \1REQ и КЖ() на шине управления. Режим прямого доступа к памяти — это тот случай, когда управление передается другому устройству. Этим устройством является контроллер прямого доступа к памяти. Режим прямого доступа применяется в тех случаях, когда нужно перенести большой блок информации из одной области памяти в другую. Второй случай, когда нужно с большой скоростью последовательно передать байт за байтом блок информации на один из портов ввода/вывода. Третий вариант, это когда, наоборот, требуется получить блок информации байт за байтом из порта ввода/вывода, и записать его в какую-нибудь область памяти. Под блоком информации подразумевается некоторая последовательность байтов, хранящихся в памяти в смежных ячейках. Хороший пример такой задачи — вывод текста на печать. Любой компьютер перед выво- Используются технологии uCoz
|