Процесс выполнения команды
Это полезно запомнить.
Программа — это последовательность операций, которую должен выполнять процессор. Она записывается в память в виде последовательности кодов.
В простых процессорах для кодирования всех команд достаточно одного байта. Одна команда — один байт. В более сложных процессорах число команд возрастает настолько, что одного байта для их кодирования не хватает. В этом случае для кодирования команд используют два, а иногда и более байтов. Причем чаще всего применяют гибкую систему кодирования. В такой системе одни команды кодируются одним байтом, другие двумя и так далее. Причем кодировка учитывает частоту применения той или иной команды. Чем чаще команда встречается в программах, тем короче ее код.
Для кодирования команд недостаточно указать код, определяющий вид операции. Например, для команды сложения двух чисел процессору нужно указать:
♦ адрес ячейки, где хранится первое число;
♦ адрес второго числа;
♦ адрес, куда нужно поместить результат.
Поэтому каждая команда, кроме кода операции, может содержать еще один или несколько параметров. Это не обязательно адреса операндов (как в приведенном примере). Параметрами могут служить константы, номера вспомогательных регистров и другие специальные коды.
Существуют самые разные способы кодировки команд.Иногда команда состоит из двух байт. Первый байт — это код операции, а второй — параметр. Бывает так, что вся команда вместе с параметрами укладывается в один байт. При этом часть битов этого байта — код операции, а другая часть — параметр.
Бывают и другие варианты. В микропроцессорах серии AVR для кодировки каждой команды используется одно двухбайтовое слово. Для некоторых особо сложных команд кодировка может состоять из двух и более слов.
Процесс выполнения команды
Теперь рассмотрим сам процесс выполнения программы. Для того, чтобы микропроцессор мог последовательно читать команды из памяти, внутри него имеется специальный регистр, называемый регистром адреса или счетчиком команд. В этом регистре хранится адрес текущей выполняемой команды.
Работа микропроцессора всегда начинается с процедуры начального сброса. Сброс микропроцессора сводится к установке всех его регистров в исходное состояние. В регистр адреса после сброса записывается адрес начала программы. Адрес начала программы зависит от модели микропроцессора и определяется его разработчиком. Чаще всего этот адрес равен нулю.
Сразу по окончании процесса начального сброса начинается выполнение программы. Для начала процессор читает число из программной памяти, т. е. из ячейки, адрес которой записан в регистр адреса. В нашем случае — из ячейки с нулевым адресом. Прочитанное число он воспринимает как код первой команды.
Процессор анализирует код и выполняет соответствующую команду. Если команда предполагает наличие еще одного или нескольких байтов с параметрами, то перед тем, как выполнять команду, процессор читает нужное количество байт из последующих ячеек памяти. При этом он каждый раз увеличивает содержимое регистра адреса.
После выполнения первой команды процессор снова увеличивает значение счетчика команд на единицу и приступает к чтению и выполнению следующей команды. Этот процесс повторяется бесконечно, пока на процессор подано напряжение питания. Таким образом, нормально работающий процессор всегда находится в процессе выполнения программы.
Правда, существуют несколько исключений. В частности, в системе команд микропроцессора обычно имеется специальная команда останова. Если в процессе выполнения программы встретится такая команда, процессор останавливается. То есть прекращает выполнение программы. Запуск процессора в этом случае возможен лишь после системного сброса либо в результате внешнего прерывания. О том, что такое прерывание, мы еще поговорим.
Второе исключение — режим сна. Некоторые модели микроконтроллеров способны переходить в специальный режим низкого потребления энергии, который называется режимом сна или спящим режимом. В спящем режиме выполнение программы также приостанавливается. Режим сна удобен в том случае, когда микропроцессорная система вынуждена долгое время находиться в состоянии ожидания. Например, ожидание нажатия кнопки «Пуск». Такой процессор способен в нужный момент пробудиться из режима сна и продолжить работу.
Рабочие регистры
Кроме регистра адреса, любой микропроцессор обязательно имеет несколько рабочих регистров (так называемых регистров общего назначения).Эти регистры наряду с ячейками памяти предназначены для хранения промежуточных результатов вычислений. Преимущество внутренних регистров для хранения данных перед памятью данных — в скорости доступа. При доступе к этим регистрам не нужно указывать адрес, как в случае с доступом к ячейке памяти. Так, команда записи в память состоит минимум из двух байт: кода операции и адреса ячейки памяти.
Иногда для записи адреса одной ячейки не хватает. Если шина адреса процессора имеет 16 разрядов, то для адресации ячейки памяти потребуется два байта. Поэтому такая команда будет содержать не менее трех байт. Команды, работающие с внутренними регистрами микропроцессора, обычно состоят из одного байта.
Сам код операциисодержит информацию о номере используемого регистра. Чтение и выполнение таких команд происходит гораздо быстрее. Кроме того, внешняя память часто сама имеет меньшее быстродействие, чем процессор. Наличие нескольких внутренних регистров с быстрым доступом позволяет оптимально использовать память. Часто используемые данные стараются помещать в рабочие регистры.
Микроконтроллеры серии AVR для хранения программ используют отдельную память, каждая ячейка которой состоит из одного шестнадцатиразрядного слова. То есть каждая команда состоит минимум из двух байт. Эти два байта содержат и код операции, и параметры. Если двух байт не хватает, то добавляется еще два байта. То есть байты всегда читаются парами.