如何在访问库中放置变量 - PIC 18 MPASM链接描述文件

时间:2011-08-08 23:04:22

标签: linker microcontroller pic pic18

我有一个启动

的链接描述文件
    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

让我感到困惑。根据Assembler / Linker文档,我使用带有RAM选项的SECTION,其中RAM先前已使用ACCESSBANK,SHAREBANK或DATABANK声明。它应该工作。

由于   - 理查德

2 个答案:

答案 0 :(得分:1)

确实没有必要更改链接器脚本,使用默认的脚本!

PIC18 MCPU下随时可以访问访问文件寄存器。 只需在名为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中声明。

答案 1 :(得分:1)

我正在使用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个字节。