Как разместить переменные в банке доступа - скрипт компоновщика PIC 18 MPASM - PullRequest
2 голосов
/ 09 августа 2011

У меня есть скрипт компоновщика, который запускается

    INCLUDE 18f14K50_g.lkr

Я хочу, чтобы мои переменные службы прерываний были в банке ACCESS. (В настоящий момент моя программа настолько мала, что может многое, но, возможно, в будущем ...). Так

    SECTION     NAME=VarsModemISR   RAM=accessram

, что приводит к:

MPLINK 4.39, Linker
Device Database Version 1.1
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - section 'VarsModemISR' has a memory 'accessram' which is not defined in the linker command file.
Errors    : 1

Изучив включенный файл, я считаю, что это так. Либо так, либо я работаю в расширенном режиме и "gpre" есть. Я могу использовать #IFDEF, чтобы проверить, что я пытался. В результате он пытался использовать «accessram», а не «gpre».

Может быть, если я попытаюсь определить банк доступа явно, скопировав строку из включаемого файла:

ACCESSBANK NAME=accessram  START=0x0               END=0x5F
SECTION     NAME=VarsModemISR   RAM=accessram

Это приводит к ошибке

MPLINK 4.39, Linker
Device Database Version 1.1
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - duplicate definition of memory 'accessram' 
Errors    : 1

Что меня смутило. В соответствии с документацией Ассемблера / Линкера, я использую SECTION с опцией RAM, где RAM ранее была объявлена ​​с использованием ACCESSBANK, SHAREBANK или DATABANK. Это должно работать.

Спасибо - Ричард

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Я использую UDATA_ACS для объявления переменных, которые я хочу получить в доступе, поэтому в modem.asm у меня есть

; Variables for the interrupt handler  - Access RAM
VarsModemISR    UDATA_ACS

wave_index          res 1     ; Index into the wave table for current sample
sample_period       res 1     ; Sample period in use, TMR0 ticks
sample_count        res 1     ; Amount of samples output since last bit boundary
fsrtmpl             res 1     ; Temporary store for FSR
fsrtmph             res 1     ; Temporary store for FSR

; Variables for the modem code  - GPR0, non-Access
VarsModem       UDATA

flag                res 1     ; Counter for transmitting AX25 flags
bit                 res 1     ; Bit counter when transmitting a character
ch                  res 1     ; Current character being transmitted
...

Мой текущий скрипт компоновщика использует предоставленный скрипт, но определяет мои сегменты. Я отмечаю, что в скрипте определена только одна программная страница, в отличие от PIC16. Нет больше PAGESEL?

INCLUDE 18f14K50_g.lkr

SECTION     NAME=CodeModemISR   ROM=page
SECTION     NAME=CodeModem      ROM=page
SECTION     NAME=CodeWaveTable  ROM=page
SECTION     NAME=CodeEepromUtil ROM=page
SECTION     NAME=VarsModem      RAM=gpr0
SECTION     NAME=VarsGPSState   RAM=gpr0
SECTION     NAME=CodeConfigEEPROM   ROM=eedata

Полученная карта содержит ожидаемые отображения:

Жестко закодированные местоположения, как и ожидалось:

 HighInterruptVector       code   0x000008    program   0x000004
 LowInterruptVector       code   0x000018    program   0x000002

Подвижные места, упакованные в:

         CodeModemISR       code   0x00001a    program   0x000028
            CodeModem       code   0x000042    program   0x0000fe
        CodeWaveTable       code   0x000140    program   0x000040
             CodeMain       code   0x000180    program   0x000054

EEPROM в нужном месте

     CodeConfigEEPROM       code   0xf00000    program   0x000044

И переменные в ACCESSRAM и GP0

         VarsModemISR      udata   0x000000       data   0x000005
            VarsModem      udata   0x000060       data   0x000027
         VarsGPSState      udata   0x000087       data   0x00000e

Есть еще проблемы, которые нужно решить, но они могут быть в других сообщениях. Я отмечаю, что CodeWaveTable занимает 64 байта, поэтому он не упакован. Решение - используйте CODE_PACK и теперь оно 32 байта.

1 голос
/ 09 августа 2011

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

Доступные файловые регистры доступны в любой момент в MCPU PIC18. Просто объявите переменные в соответствующем банке данных с именем ACCESSBANK, которые начинаются с 0x00 и заканчиваются адресом 0x60.

Если вы используете MPLAB, чем объявить:

_Shared        udata_acs        0        ;Shared memory file registers
IntReg1        res              1
IntReg2        res              1
;...

_UpperBank0    udata            060h     ;Banked file memory registers
RegA           res              1
;...

_Bank1         udata            0100h    ;Banked file memory registers
N              res              1
;...

Линкер должен автоматически установить бит «a» в инструкции кода для адресов регистров файлов, которые объявлены в ACCESSBANK.

...