Программный счетчик.
Программный счетчик PC (Program Counter) используется для указания следующей команды выполняемой программы. Реализация этой функции значительно осложняется, когда необходимо сохранить содержимое PC при вызове подпрограмм и обработке запросов прерывания или обеспечить ветвление программы. Рис. 2.16 иллюстрирует выполнение некоторых функций программного счетчика, однако на практике они оказываются существенно более сложными.
Программный счетчик представляет собой счетчик с параллельным вводом-выводом. На рис. 2.16 показано функционирование PC в процессоре с Принстонской архитектурой. В процессорах этого типа содержимое PC поступает по шине данных в схему управления памятью, указывая адрес считываемой команды. Часто PC входит в состав схемы управления памятью - это позволяет избежать передачи адреса по внутренней шине данных. Важные особенности функционирования программного счетчика - параллельная загрузка нового содержимого, поступающего с шины данных, возможность сброса (возврат к адресу первой команды программы), реализация инкремента (увеличение содержимого для адресации следующей команды). Сигналы, обеспечивающие выполнение этих операций, формируются дешифратором команд, который управляет последовательностью действий микроконтроллера.
Рис. 2.16 - Программный счетчик.
Параллельная загрузка используется для записи в PC адреса перехода при выполнении команды «jmp» (безусловный переход) или «call» (вызов подпрограммы). В компьютерах с Принстонской архитектурой этот адрес поступает по шине данных. В 8-разрядных микроконтроллерах разрядность PC обычно больше, чем 8 бит (так как при такой разрядности адреса объем доступной памяти программ составляет всего 256 байт). При загрузке в PC нового адреса, он поступает по шине данных частями по 8 бит, что требует выполнения дополнительных машинных циклов. Чтобы сократить время загрузки PC, некоторые процессоры имеют команды ветвления «branch», при которых загружаются только 8 младших разрядов адреса, а старшие разряды остаются без изменения. При выполнении такой команды достаточно передать по шине данных только один байт, тогда как для загрузки полного 16-разрядного адреса требуется пересылка двух байт.
Начальное содержимое PC после запуска микроконтроллера может иметь любое значение. Хотя наиболее очевидным представляется использование в качестве начального значения 0000h, некоторые микроконтроллеры начинают выполнение программы с других адресов. Аналогичная ситуация имеет место с адресами («векторами») прерываний. При обслуживании прерываний в PC обычно загружают содержимое, которое отличается от адреса, загружаемого при начальном запуске микроконтроллера, однако для реализации прерывания и запуска могут использоваться одни и те же аппаратные средства.
После чтения очередной команды содержимое программного счетчика увеличивается (инкрементируется), чтобы обеспечить переход к адресу следующей команды. Если выполняется вызов подпрограммы или происходит прерывание, то адрес возврата (адрес следующей команды) может быть сохранен в стеке без выполнения дополнительных тактов для инкремента содержимого программного счетчика.
Необходимо сделать некоторые важные замечания по поводу функционирования программного счетчика. В работе с микроконтроллерами, имеющими Принстонскую архитектуру, необходимо следить, чтобы программный счетчик не вышел за пределы памяти программ. Если это случится, то микроконтроллер может начать выборку данных вместо команд и пытаться выполнить выбранные коды данных, что приведет к непредсказуемому результату.
Другая проблема может возникнуть, когда программный счетчик достигнет конца адресуемой памяти. Некоторые микроконтроллеры в этом случае осуществляют циклический переход к команде, размещенной по адресу 0000h, в других микроконтроллерах дешифратор команд продолжает инкрементировать программный счетчик, что приводит к выполнению неопределенных команд.