Портирование приложений с PIC18 на PIC24F. 1. 2. Система команд

    1.2. Набор инструкций

    Набор инструкций ядра PIC24F значительно расширен по сравнению с набором инструкций микроконтроллеров PIC18. Так как величина слова инструкции PIC24F составляет 24 бита, увеличено как количество инструкций, так и методов адресации и поддерживаемых типов данных (двойное слово данных – 32 бита, слово данных – 16 бит, байт). Основные различия в наборах инструкций PIС18 и PIC24F приведены в табл. 2.

    Табл. 2. Основные различия в наборах инструкций семейств PIC18 и PIC24F

    Параметры

    PIC18

    PIC24F

    Величина слова инструкции

    16 бит

    24 бита

    Количество базовых инструкций

    75

    76

    Поддерживаемая разрядность данных

    Байт

    Байт, слово, двойное слово

    Количество операндов

    До двух (b = a + b)

    До трех (c = a + b)

    Режимы адресаций

    Прямая, косвенная (5 видов)

    Прямая, косвенная (6 видов)

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

    Используются регистры косвенной адресации FSR – максимум три указателя

    Как указатель используется любой регистр общего назначения – до 16 указателей.

    Адресация памяти данных

    Прямая адресация – ограничено текущим банком. Вся память данных адресуется за несколько инструкций

    Прямая адресация – ограничено областью ближней памяти*. Вся память данных – косвенная адресация

    * Near Data Space – 8 кБайт

    1.2.1. Изменение набора инструкций PIC24F по сравнению с PIC18

    Набор инструкций ядра PIC24F предоставляет пользователю дополнительные возможности (табл. 3), увеличивающие скорость выполнения математических алгоритмов и обеспечивающие улучшенную поддержку языков программирования высокого уровня. Последнее связно с гибкой работой с указателями и использованием программного стека.

    Таблица 3. Некоторые инструкции семейства PIC24F, увеличивающие скорость выполнения математических алгоритмов по сравнению с PIC18

    Инструкции ядра PIC24F

    Описание

    DIV

    Деление двух чисел, знаковое и беззнаковое, 32 бита на 16 бит и 16 бит на 16 бит

    LNK и ULNK

    Фиксировать и освободить указатель стекового фрейма (W14)

    LSR и ASR

    Двоичный и арифметический сдвиг вправо (от 1 до 15 бит). Аргументом, определяющим величину сдвига, может являться константа или переменная

    MUL.SS, MUL.SU, MUL.UU

    Умножение (знаковое, смешанное, беззнаковое)

    PUSH и POP

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

    REPEAT

    Повтор следующей инструкции определенное количество раз

    SL

    Сдвиг влево (от 1 до 15 бит). Аргументом, определяющим величину сдвига, может являться константа или переменная

    Однако некоторые инструкции ядра PIC18 не могут быть заменены атомарной инструкцией ядра PIC24F. Как правило, аналогичный (но не идентичный, вследствие различия флагов в STATUS регистре) результат можно получить, используя одну или две инструкции PIC24F. К таким инструкциям ядра PIC18 относятся:

    · CPFSEQ
    · CPFSGT
    · CPFSLT
    · MOVSF
    · MOVSS
    · INFSNZ
    · DCFSNZ
    · DECFSZ
    · SUBULNK
    · INCFSZ
    · TSTFSZ
    · PUSHL
    · MOVFF (все режимы исключая перемещение с использованием косвенной адресации источника и приемника)
    · SWAPF (все режимы за исключением использования с WREG)

    За исключением перечисленных выше, все инструкции PIC18 имеют аналоги в наборе инструкций PIC24F. Более подробная информация приведена в приложении А.

    1.2.2. Поддерживаемые типы данных

    Кроме бит-ориентированных инструкций, инструкции ядра PIC18 поддерживают только работу с данными величиной 1 байт. Любые действия с данными разрядностью более 8 бит требуют корректной последовательности выполнения нескольких инструкций.

    Ядро PIC24F имеет 16-битную шину данных, что определяет основной формат операндов как 16-битное слово (2 байта). Помимо этого большинство инструкций могут прозрачно использовать 8-битные и 32-битные операнды. При использовании ассемблера суффикс мнемоники .b указывает, что операция производится с 8-битными данными, а суффикс .d – что операция производится с двойным 32-битным словом. Выравнивание, определяемое разрядностью операнда производиться автоматически.

    1.2.3. Операнды

    В набор инструкций PIC18 входят команды, поддерживающие только унарные и бинарные операции. Унарная операция подразумевает, что результат сохраняется непосредственно в операнд (например, инкремент регистра WREG). Бинарная операция позволяет производить действия с двумя операндами (например, сложение) с последующим сохранением результата в один из операндов.

    Набор инструкций PIC24F кроме унарных и бинарных операций поддерживает команды с тремя операндами. При этом результат операции с двумя операндами сохраняется в третий. Операции с тремя операндами могут выполнять большинство математических инструкций и инструкций сдвига.

    1.2.4. Режимы адресации

    Основное отличие в системах команд PIC18 и PIC24F заключается в количестве способов адресации данных и реализации этих способов. PIC18 и PIC24F поддерживают одни и те же методы адресаций (за исключением отсутствия в PIC18 косвенной адресации с пре-декрементом).

    1.2.4.1. Прямая адресация

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

    Набор инструкций PIC24F разработан таким образом, чтобы любая команда, использующая прямую адресацию, имела доступ к первым 8 кБ памяти данных (NDS - Near Data Space: 0x0000 – 0x1FFF), то есть для прямой адресации используется 13-битная константа. Это позволяет использовать прямую адресацию регистров специального назначения (которые все расположены в NDS). Память данных, расположенная выше NDS (адреса, превышающие 0x1FFF) адресуется косвенно.

    1.2.4.2. Косвенная адресация

    В ядре PIC18 для косвенной адресации используется набор регистров специального назначения (указателей) и набор виртуальных регистров. При этом в три указателя FSR0, FSR1 и FSR2 может быть загружена 12-битная константа. Для выполнения косвенной адресации, в качестве операнда используется один из виртуальных регистров. В зависимости от того, какой из виртуальных регистров является операндом, может быть выполнена дополнительная операция над указателем, например инкремент или декремент. Таким образом, только три указателя и соответствующие им виртуальные регистры могут быть использованы для косвенной адресации.

    В PIC24F в качестве указателя может использоваться любой из 16-и регистров общего назначения W0-W15. Ассемблер предусматривает специальный синтаксис записи косвенной адресации, в том числе и операции над указателем (адресация со смещением, инкремент и декремент указателя). Помимо пре-инкремента, пре-декремента, пост-инкремента указателя, возможен пре-декремент, недоступный в архитектуре PIC18 (табл. 4).

    Следует заметить, что при использовании косвенной адресации с изменением указателя, для байтовых инструкций указатель будет изменен на 1. Для инструкций, оперирующих со словом, указатель будет изменен на 2, что обеспечивает корректное выравнивание указателя.

    Сравнение режимов косвенной адресации и их реализации приведены в табл. 4. В Примере 1 приведена типовая операция копирования массива для архитектур PIC18 и PIC24F.

    Табл. 4. Сравнение режимов косвенной адресации семейств PIC18 и PIC24F

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

    Виртуальный регистр PIC18, используемый в качестве операнда

    Синтаксис ассемблера PIC24F

    Изменение Wn или FSR

    После байтовой инструкции

    После инструкции работы со словом

    Без модификации

    INDFx

    [Wn]

    Wn = Wn

    Wn = Wn

    С пре-инкрементом

    PREINCx

    [++Wn]

    Wn = Wn + 1

    Wn = Wn + 2

    С пре-декрементом

    -

    [--Wn]

    Wn = Wn - 1

    Wn = Wn – 2

    С пост-инкрементом

    POSTINCx

    [Wn++]

    Wn = Wn + 1

    Wn = Wn + 2

    С пост-декрементом

    POSTDECx

    [Wn--]

    Wn = Wn - 1

    Wn = Wn – 2

    Со смещением

    PLUSWx

    [Wn + Wb]

    Wn = Wn

    Wn = Wn

    Пример 1: Типовая операция копирования массивов для семейств PIC18 и PIC24F

    PIC18

    LoopSetup MOVLW 0x10, LoopCount    ;set up loop counter
              LFSR 0, myArray0         ;set up pointer 0
              LFSR 1, myArray1         ;set up pointer 1
    CopyLoop  MOVFF POSTINC0, POSTINC1 ;copy myArray1 to myArray0
              DECFSZ LoopCount, F      ;decrement loop counter
              BRA CopyLoop

    PIC24F

    LoopSetup MOV #myArray0, W0  ;set up pointer 0
              MOV #myArray1, W1  ;set up pointer 1
              REPEAT #15         ;loop 16 times
              MOV [W1++], [W0++] ;copy array1 to array

    1.2.4.3. Нарушение последовательности «чтение-модификация-запись»

    Расширенные возможности косвенной адресации в архитектуре PIC24F в некоторых случаях могут привести к нарушению последовательности «чтение-модификация-запись». Нарушения возникают в том случае, когда переменная, необходимая для выполнения инструкции, выборка которой происходит в данный момент, еще не изменена. В общем случае это происходит тогда, когда сразу за инструкцией, изменяющей регистр общего назначения, следует инструкция, использующая этот регистр как указатель (табл. 5). Ядро PIC24F предусматривает такую опасность, и автоматически выполняет одну или более пустых инструкций (NOP) до момента завершения операции изменения указателя.

    Табл. 5. Правила вставки пустых командных циклов при нарушении последовательности «чтение-модификация-запись»

    Метод адресации, используемый в первой инструкции

    Метод адресации, используемый во второй инструкции

    Количество пустых командных тактов, выполняемых ядром после первой инструкции

    Пример (Wn = W2)

    прямая

    Прямая

    0

    ADD.w W0, W1, W2

    MOV.w W2, W3

    Косвенная

    Прямая

    0

    ADD.w W0, W1, [W2]

    MOV.w W2, W3

    Косвенная

    Косвенная

    0

    ADD.w W0, W1, [W2]

    MOV.w [W2], W3

    Косвенная

    Косвенная, с модификацией указателя

    0

    ADD.w W0, W1, [W2]

    MOV.w [W2++], W3

    Косвенная, с модификацией указателя

    Прямая

    0

    ADD.w W0, W1, [W2++]

    MOV.w W2, W3

    Прямая

    Косвенная

    1

    ADD.w W0, W1, W2

    MOV.w [W2], W3

    Прямая

    Косвенная с модификацией указателя

    1

    ADD.w W0, W1, W2

    MOV.w [W2++], W3

    Косвенная

    Косвенная

    1

    ADD.w W0, W1, [W2]

    MOV.w [W2], W3

    ; W2=04h (mapped W2)

    Косвенная

    Косвенная с модификацией указателя

    1

    ADD.w W0, W1, [W2]

    MOV.w [W2++], W3

    ; W2=04h (mapped W2)

    Косвенная с модификацией указателя

    Косвенная

    1

    ADD.w W0, W1, [W2++]

    MOV.w [W2], W3

    Косвенная с модификацией указателя

    Косвенная с модификацией указателя

    1

    ADD.w W0, W1, [W2++]

    MOV.w [W2++], W3