2011-08-08 1 views
2

J'ai un script de liaison qui commenceComment placer les variables dans la banque d'accès - script de liaison PIC 18 MPASM

INCLUDE 18f14K50_g.lkr 

Je veux que mes variables de service d'interruption pour aller dans la banque ACCESS. (Mon programme est si petit pour le moment, mais peut-être à l'avenir ...). Alors

SECTION  NAME=VarsModemISR RAM=accessram 

qui se traduit par:

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 

examen du dossier inclus Je crois qu'il est. Soit ça ou je travaille en mode étendu et "gpre" est. Je peux utiliser un #IFDEF pour vérifier, que j'ai essayé. Le résultat, il essayait d'utiliser "accessram" pas "gpre".

Peut-être que si je tente de définir la banque d'accès explicitement en copiant la ligne du fichier include:

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

Il en résulte l'erreur

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

qui m'a confondu. Selon la documentation de l'assembleur/éditeur de liens, j'utilise SECTION avec l'option RAM, où la RAM a déjà été déclarée en utilisant ACCESSBANK, SHAREBANK ou DATABANK. Ça devrait marcher.

Merci - Richard

Répondre

1

Il n'y a vraiment pas besoin de changer script éditeur de liens, utilisez un par défaut!

Les registres de fichiers accessibles sont disponibles à tout moment sous MCPU PIC18. Déclarez simplement les variables dans la banque de données de mémoire appropriée nommée ACCESSBANK qui commence à 0x00 et se termine à l'adresse 0x60.

Si vous utilisez MPLAB que déclare:

_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 
;... 

Linker doit définir automatiquement le 'a' bit instruction de code pour les adresses de registre de fichiers, qui sont déclarées dans AccessBank.

+0

Ce serait bien car je suis en train de régler A manuellement. Cela code cependant les emplacements dans le code, où j'ai utilisé l'éditeur de liens pour le faire. J'ai plusieurs fichiers sources donc la localisation tardive est sympa. Je vais essayer udata_acs et laisser de côté la déclaration SECTION - ça sonne comme si c'était le bon moyen de le faire. –

+0

Bien sûr, c'est la seule façon raisonnable de le faire ... :) –

+0

Cela a fonctionné. En raison des contraintes d'espace dans le commentaire, je publie l'information complète comme une autre réponse. –

1

J'utilise UDATA_ACS de déclarer les variables que je veux dans l'accès, donc dans modem.asm je

; 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 
... 

Mon script linker actuel utilise le script fourni, mais mes segments définit. Je note qu'il n'y a qu'une seule page de programme définie dans le script, contrairement aux PIC16. Plus de 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 

La carte résultante contient les correspondances j'attends:

dur endroits codés comme prévu:

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

emplacements mobiles emballés dans:

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

EEPROM au bon endroit

 CodeConfigEEPROM  code 0xf00000 program 0x000044 

et variables ACCESSRAM et GP0

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

Il y a plus de problèmes à résoudre, mais ils peuvent être dans d'autres postes. Je note que CodeWaveTable prend 64 octets donc ce n'est pas étroitement emballé. Solution - utilisez CODE_PACK et maintenant c'est 32 octets.

Questions connexes