EGG - расширенное ядро PIC18 микроконтроллеров компании Microchip Technology Inc.
Компания Microchip Technology Inc. на протяжении нескольких лет с успехом производит мощные FLASH микроконтроллеры семейства PIC18 с тактовой частотой до 40МГц, аппаратным умножителем 8*8 за один такт и широким набором периферийных модулей: многоканальный 10-и разрядный АЦП, ШИМ, интерфейсы I2C, SPI, USART, LIN, CAN2.0B. Система команд микроконтроллеров PIC18 изначально разрабатывалась для эффективного использования с языками высокого уровня Си. Однако, проанализировав современные требования и оптимальное взаимодействие с компиляторами, компания Microchip модернизировала ядро PIC18, и теперь новые микроконтроллеры имеют усовершенствованное ядро EGG (Extended Gold Gate).
Новые контроллеры поддерживают все 75 стандартные команды ядра PIC18, добавлена индексная адресация в стандартных командах для оптимизации реализации рекурсивных функций и работы с программным стеком а также добавлены 8 новых команд.
Стандартное ядро PIC18 добавляет много расширенных возможностей по сравнению с младшим семейством микроконтроллеров PICmicro (PIC12, PIC16), в то же время обеспечивая легкость перехода снизу вверх. Большинство команд занимают одно программное слово (16 бит) за исключением четырех команд которые требуют два слова программной памяти.
Каждая однословная команда делится на код операции (opcode), который определяется типом инструкции и один или несколько операндов, которые определяют действие команды.
Система команд сгруппирована в четыре основные категории:
- байт-ориентированные команды;
- бит-ориентированные команды;
- команды работающие с константами;
- управляющие команды.
Расширение системы команд.
Дополнительно к стандартным 75-ти инструкциям ядра PIC18 новые микроконтроллеры поддерживают команды расширяющие функциональность ядра. Дополнительные восемь инструкций пополняют операции с косвенной и индексной адресацией, в новом ядре также реализована индексная адресация со смещением для многих стандартных инструкций ядра PIC18. Расширение системы команд по умолчанию запрещено. Для разрешения работы расширенных команд служит специальный бит XINST в битах конфигурации микроконтроллера. Таким образом, реализуется полная программная совместимость со стандартным ядром, если пользователь использует новые микроконтроллеры со старым программным обеспечением.
Расширенные команды можно классифицировать как команды с константами, которые работают с регистрами общего назначения или используются для индексной адресации. Список новых инструкций приведен в табл.1. Две из инструкций ADDFSR и SUBFSR имеют специальное расширение для работы с регистром косвенной адресации FSR2. Эти команды (ADDULNK и SUBLNK) позволяют производить автоматический выход из подпрограммы (return) после выполнения. Расширенные инструкции предназначены для улучшения оптимизации и возможности создания реентерабельного кода (т.е. построения рекурсивных алгоритмов или использования программного стека) на языках высокого уровня, например на Си. Наряду с прочим, расширение системы команд позволяет пользователю работать с языками высокого уровня для эффективного выполнения таких операций над данными как:
- автоматическое размещение и освобождение области программного стека при входе и выходе из подпрограмм;
- вызов функции по указателю;
- манипулирование с указателями на программный стек;
- работа с переменными расположенными в программном стеке.
Таблица 1. Список новых инструкций ядра PIC18
Команда |
Описание действия |
ADDFSR f, k |
Добавить константу к регистру указателя адреса FSR(f). |
ADDULNK k |
Добавить константу к регистру указателя адреса FSR2 и выйти |
CALLW |
Вызов функции по значению WREG |
MOVSF zs, fd |
Копирование содержимого (FSR2 + zs) в регистр fd |
MOVSS zs, zd |
Копирование (FSR2 + zs) в (FSR2 + zd) |
PUSHL k |
Сохранение значения k в FSR2, декремент FSR2 |
SUBFSR f, k |
Вычитание константы из FSR(f) |
SUBULNK k |
Вычитание константы из FSR2 и выход |
Пример 1:
Команда: CALLW
Действие: (PC + 2) > TOS, (W) > PCL, (PCLATH) > PCH, (PCLATU) > PCU
Адрес возврата (PC + 2) помещается в стек возврата.
Содержимое рабочего регистра W записывается в программный счетчик PCL а содержимое PCLATH и PCLATU переписываются в PCH и PCU.
Пример использования (вызов функции по указателю):
movff HIGH ptr, PCLATH; загрузка адреса указателя
movf LOW ptr, w
callw ; вызов подпрограммы по указателю
Синтаксис расширенных команд.
Большинство расширенных команд использует индексные параметры, используя один из регистров FSR (регистр указателя адреса при косвенной адресации) и некоторого смещения, чтобы определить регистр адресата или источник. Когда аргумент для команды служит частью индексной адресации он помещается в квадратные скобки “ [ ] ”. Это сделано чтобы указать, что параметр используется как индекс или сдвиг. Если индекс или значение смещения не заключены в скобки, то ассемблер MPASM™ укажет на ошибку. Когда разрешен расширенный набор команд, скобки также используются, чтобы указать индексные параметры в байт-ориентированных и бит-ориентированных командах.
Пример 2:
Команда: MOVSF [Zs], fd
Действие: ((FSR2) + Zs) > fd
Содержимое регистра, на который указывает (FSR2 + Zs) пересылается в fd.
Пример использования:
MOVSF [offset], REG2Пример 3:
Команда: MOVSS [Zs], [Zd]
Действие: ((FSR2) + Zs) > ((FSR2) + Zd)
Содержимое регистра, на который указывает (FSR2 + Zs) пересылается в (FSR2 + Zd).
Пример использования:
MOVSS [offset1], [offset1]
Бит-ориентированные и байт-ориентированные команды в режиме индексной адресации со смещением.
В дополнение к восьми новым командам в расширенном наборе добавлена индексная адресация со смещением в стандартных байт- и бит-ориентированных командах. В зависимости от вида написания команды ее интерпретация ассемблером будет различна.
Если расширенный набор запрещен, то адрес ‘f’ в команде указывает на буквальное местоположение в памяти в зависимости от значение параметра ‘а’: при ‘а’ = 0 в Access Bank или, при ‘а’ = 1 в GPR банке (адрес которого определен в BSR).
Если же расширенный набор команд разрешен, то адрес либо интерпретируется как в стандартном режиме работы ядра PIC18 либо как смещение от значения указателя в FSR2. Если нужно указать значение смещения, то это смешение должно быть обрамлено квадратными скобками ‘[ ]’, при этом значение смещения должно лежать в диапазоне от 0 до 95 (5Fh). Практически это означает, что все команды, которые используют бит признака доступа к оперативной памяти Access Bank или BSR как параметр – то есть все байт- и бит-ориентированные команды, или почти половина основных команд PIC18 может вести себя по-другому в ядре PIC18 с расширенным набором команд. Использование скобок указывает к компилятору, что значение должно интерпретироваться как индекс или смещение. Исключение скобок или использование значение смещения больше чем 5Fh в пределах скобок произведет ошибку в ассемблере MPASM. Пример 4 а) и б) иллюстрирует использование одной и той же команды для разных случаев адресации.
Когда содержание FSR2 указывает на адрес 0х00, то границы оперативной памяти по существу повторно отображены к их первоначальным значениям. Это может быть полезно в создании кода совместимого с обычным ядром PIC18.
Если в режиме индексной адресации со смещением индексный параметр заключен в скобки, то параметр доступа к оперативной памяти ‘a’ никогда не указывается и будет автоматически принят как ‘0’. Это отличие от стандартной операции, когда ‘a’ указывает на целевой адрес. Объявление бита доступа оперативной памяти в этом режиме также приведет к сообщению об ошибке в ассемблере MPASM. Параметр адресата, ‘d’, функционирует в новом ядре как и прежде.
В последних версиях языка ассемблера MPASM поддержка расширенного набора команд должна быть указана явно. Это делается либо с опцией в командной строке /y, или с директивой PE в листинге исходного года. В компиляторе MPLAB-C18 нужно указывать директиву –extended и подключать соответствующий командный файл линкера, например 18f4620_e.lkr.
Пример 4: иллюстрация работы одной и той же команды для разных режимов адресации. Режим расширенного ядра разрешен.
Команда ADDWF f {,d {,a}}
а) использование адресации со смещением addwf [k],d
Действие: (W) + ((FSR2) + k) > dest
Содержимое рабочего регистра W добавляется к содержимому регистра на который указывает со смещением ‘k’ указатель адреса FSR2. Если ‘d’ равно ‘0’, результат сохраняется в W, если ‘d’ равно ‘1’ то результат сохраняется в регистре (FSR2 + k).
б) стандартная команда addwf REG1,d,a
Действие: (W) + (REG1) > dest
Содержимое рабочего регистра W добавляется к содержимому регистра REG1. Если ‘d’ равно ‘0’, результат сохраняется в W. Если ‘d’ равно ‘1’, результат сохраняется в REG1. Параметр ‘a’ указывает на в Access Bank (а = 0) или на GPR банки (а = 1).
Оптимизация кода при использовании языка высокого уровня.
Расширение системы команд ядра PIC18 приводит к уменьшению размера кода и к увеличению быстродействия системы. Индексная адресация со смещением может быть очень полезна для организации динамического программного стека и манипуляциями с указателями.
Рассмотрим некоторые примеры оптимизации кода и быстродействия при использовании языка высокого уровня Си.
Пример 5: Присвоение значения элементу массива, mass[2] = 5.
При реализации на стандартном ядре PIC18, данная команда занимает 10 байт памяти программ и выполняется за 5 машинных цикла:
MOVLW 0x05
MOVWF PRODL, 0
MOVLW 0x02
MOVFF PRODL, PLUSW2Расширенное ядро требует всего 4 байта программной памяти и выполняется за 2 машинных цикла:
MOVLW 0x05
MOVWF [0x02], 0Пример 6: Присвоение элементу массива значения другого элемента, mass[2] = mass[5].
Стандартное ядро PIC18: 12 байт памяти программ:
movlw offset(0х05)
movf PLUSW2,0,0
movwf INDF1,0
movlw offset(0х02)
movff INDF1,PLUSW2Расширенное ядро: 4 байта программной памяти
movss [0х05],[0х02]Пример 7: Вызов функции по указателю: fn[ptr]();
Стандартное ядро: 18 байта программной памяти, выполняется за 9 машинных цикла:
bra PC+12
movff ptr + 2,PCLATU
movff ptr + 1,PCLATH
movlb ptr
movf ptr,0,1
movwf PCL,0
rcall PC-10Расширенное ядро: 14 байта программной памяти, выполняется за 6 машинных цикла:
movff ptr + 2,PCLATU
movff ptr + 1,PCLATH
movlb ptr
movf ptr,0,1
callw
Особенности микроконтроллеров с расширенным ядром PIC18.
Компания Microchip Technology Inc. готовит к выпуску целое семейство микроконтроллеров с расширенным ядром PIC18 (см. табл.2). Все микроконтроллеры выполнены по NanoWatt технологии, а значит, имеют встроенный тактовый генератор с возможностью программного выбора частоты от 32КГц до 8МГц; имеют возможность отключения тактирования ядра для сохранения энергии; возможность переключения «на лету» источника тактовой частоты между основным генератором (до 40МГц), дополнительным генератором подключаемого к Timer 1 и внутренним RC-генератором. В NanoWatt микроконтроллерах имеется возможность контролирования работоспособности основного кварцевого генератора и в случае отказа кварца – переключиться на внутренний генератор. Эта особенность может пригодиться для повышения надежности важных и необслуживаемых систем.
Все новые микроконтроллеры поддерживают внутрисхемную отладку с помощью отладчика-программатора ICD-2. Для новых контроллеров поддерживаются 3 точки останова, просмотр и модификация содержимого ОЗУ, возможность запуска программы в реальном времени и в пошаговом режиме.
Среди новых микроконтроллеров есть микросхемы со встроенной поддержкой протоколов USB 2.0 (full-speed), CAN 2.0B, во всех контроллерах есть поддержка интерфейса I2C, SPI и расширенный интерфейс USART (EUSART) с возможностью автоподстройки скорости, выхода из режима SLEEP при наличии активности на шине.