воскресенье, 1 февраля 2009 г.

Память программ

Следующее описание памяти программ касается исключительно базовой серии и среднего подсемейства микроконтроллеров PIC (см. также главу "РКЛ8").
Указатель на слово программы называют счетчиком команд. Центральный процессор всегда выполняет ту команду, на которую указывает этот счетчик, после чего увеличивает его содержимое, если речь не идет о команде перехода.

Младший байт счетчика команд — адресуемый регистр специального назначения (PCL). Регистр PCL изменяют в случае реализации косвенных программных переходов. Однако старший байт счетчика команд умышленно сделан недоступным напрямую. Если необходимо изменить старший байт программною указателя, то его нужно записывать в промежуточный буфер памяти - регистр PCLATH. Регистр PCLATH копируется в старший байт счетчика команд только при доступе к регистpy PCL — будь то по команде перехода или по арифметической команде с аргументом PCL.

Для программного перехода по адресу ADRH:ADRL используют, как правило, команды CALL и GOTO, которым в качестве аргумента передается адрес. При этом существуют трудности, аналогичные тем, которые возникают при адресации памяти данных.

Базовая серия и среднее подсемейство микроконтроллеров PIC предоставляют а распоряжение 11 разрядов для адреса назначения, чтобы охватить все 2К слов программы. Количество в 2К слов обозначается как "страница".

В базовой серии PIC команда GOTO имеет лишь 9 разрядов для адреса назначения, а команда CALL -- даже 8. Иногда для адресации требуется немного ловкости. поскольку необходимо экономно обращаться с имеющейся памятью.
Подобно тому, как это происходит при выборе банка, при адресации памяти программ перед каждой командой перехода должна предварительно выбираться корректная страница (если этого еще не сделано). В среднем подсемействе PIC это реализовано путем правильной установки регистра PCLATH.

При этом перед командами CALL и GOTO необходимо позаботиться только о разрядах 3 и 4 регистра PCLATH. Младшие три разряда затираются адресом перехода. а старшие три не используются, поскольку на данный момент не существует микроконтроллеров PIC среднего подсемейства с более, чем четырьмя страницами.

Наиболее практичный способ выбора страницы перед выполнением команд
CALL LABEL И GOTO LABEL:
MOVLW HIGH__LABEL
MOVWF PCLATH
Измененное значение PCLATH копируется в счетчик команд только по следующим командам CALL и GOTO.
При программировании на ассемблере мы обходимся с управлением страницами подобно тому, как это происходит для памяти данных. Отдельные страницы содержат, по возможности, законченные программные модули. При таком подходе переходы с одной страницы на другую должны использоваться как можно реже. Таблицы и списки размещаются, сети необходимо, на собственной странице.

Такие часто используемые служебные программы как, например, умножение и деление, можно скопировать в каждую страницу, в которой они используются. Для того требуется меньше места, чем в том случае, когда перед каждым вызовом выполняются команды выбора страницы.
Для программного перехода по адресу ADRH:ADRI. используют следующие команды:
MOVF ADRH,W
MOVWF PCLATH
MOVF ADRL,W
MOVWP PCL

Содержимое регистра PCI.ATH загружается в старший байт счетчика команд только последней командой, по которой происходит переход по новому адресу.

Подобный прямой доступ к счетчику команд называется "вычисленным GOTO" и применяется для переменных ветвлений.

Предположим, байтовая переменная FALL может принимать значения от 0 до 5. Каждому значению FALL поставлена в соответствие некоторая служебная подпрограмма (PROGO, PROG1, ...). Возможны различные способы ветвления, и один из них выглядит следующим образом:
MOVF FALL,W
ADDWF PCL
GOTO PROGO
GOTO PROG1
GOTO PR0G2
GOTO PR0G3
GOTO PROG4
GOTO PROG5
Перед вызовом этих строк программы следует проверить, действительно ли переменная FALL меньше или равна 5. иначе выполнение команды ADDWF PCL может привести к переходу в непредвиденную область памяти.

Важным примером представленного выше варианта ветвления является следующая подпрограмма;
GETWERT MOVF TABPTR,W
ADDWF PCL
RETLW WERT0
RETLW WERT1
RETLW WERT2
RETLW WERT3
RETLW WERT4
RETLW WERT5 ИТ.Д.

С помощью команды CALL GETWERT в регистр W можно загрузить табличное значение, соответствующее указателю TABPTR.

Косвенная адресация данных

Косвенная адресация подразумевает, что указатель на аргумент размещен не явно в аргументе, а в регистре-указателе. В базовой серии, а также в среднем подсемействе микроконтроллеров Р1С этот регистр называется FSR (File Select Register — регистр выбора файла). Команды с косвенной адресацией не требуют аргумента, поскольку он загружается заранее в FSR.

Без косвенной адресации микроконтроллер немыслим. Поскольку код операции имеет ограниченный размер, в PIC применили следующий трюк: команды для косвенной адресации имеют такой же код операции, что и команды для прямой адресации. Указание на то, что речь идет о косвенной адресации, содержится в аргументе.

Это означает, что должен задаваться какой-то особенный аргумент, который не является "правильным" аргументом данных. В базовой серии и среднем подсемействе микроконтроллеров Р1С это — адрес 0, следовательно, с таким адресом не может быть задан физический файловый регистр. Таким образом, файловый регистр с адресом 0, — это символический регистр, который в ассемблере обозначается именем INDF (косвенный файловый регистр).

Кроме того, в языке ассемблера нет никакого дополнительного кода операции для косвенной адресации, например:
ADDWF INDF.W
В старшем подсемействе микроконтроллеров PIC присутствует три регистра FSR, что повышает удобство программирования. Более подробно об этом сказано в главе "PIC18".

Память данных

Для адресации файловых регистров в распоряжении имеется ограниченное число разрядов в словах команд (в базовой серии PIC — 5 разрядов, с помощью которых можно адресовать 32 файловых регистра). Файловые регистры от 0 до 7 применяются для специальных целей. Их называют Special Function Register (SFR) — регистрами специального назначения. Таким образом, для использования в качестве пользовательских переменных остается еще 24 разряда.

В среднем подсемействе микроконтроллеров PIC используется 7 разрядов, которых достаточно уже для адресации 128 файловых регистров. Файловые регистры от 0 до 31 — регистры специального назначения (SFR). так что для переменных остается 96 байт.

Именно в малом размере адресного пространства заключается главный недостаток сжатых команд. Хотя большинство микросхем предоставляют до 4 банков ПО 32 и 128 файловых регистров, операции по переключению банков не совместимы с удобством программирования. При каждом обращении к файловому регистру необходимо обращать внимание на то. правильно ли выбран банк.

Разряды для выбора банка расположены в FSR для базовой серии и в регистре STATUS для среднего подсемейства микроконтроллеров РIС. С некоторого времени MPASM позволяет выбирать банк с помощью ассемблерного макроса:
BANKSEL WERT ;WERT - пример любой переменной
По этому макросу ассемблер вставляет команды, принадлежащие определенно* MJ типу микроконтроллеров, для выбора банка, в котором находится переменная
WERT.

Основной способ избежать ошибок — помещать переключение банка перед каждым доступом к памяти данных тем не менее, несмотря на всю надежность такого подхода, он делает программу большой и не удобочитаемой. Такой способ используют компиляторы с языков высокого уровня.

При программировании на ассемблере многие разработчики применяют другой метод. В качестве основного состояния задается банк 0. и переключение выполняется только при доступе к другим банкам. Для того, чтобы этот метод был действительно эффективен, необходимо хорошо продумывать структуру данных — особенно, если реализованы подпрограммы, не зависящие от главной программы.

Для упрощения этой процедуры компанией Microchip при разработке микроконтроллеров PIC был принят ряд мер. Так, в PIC с четырьмя банками присутствуют области адресов, расположенные друг над другом, к которым можно обращаться независимо от выбора банка (так называемая "область доступа"). Выло бы бессмысленно дополнительно перед каждым доступом к переменной выполнять переключение банка- В этой области доступа располагают, например, рабочие переменные стандартных подпрограмм. Наиболее важные регистры специального назначения. к которым часто обращаются (рабочие регистры), обычно располагаются в банке 0. Регистры специального назначения, расположенные в банке 1. используются, преимущественно, для инициализации.