2

我有一个链接器脚本,它启动

    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 声明。它应该工作。

谢谢 - 理查德

4

2 回答 2

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

链接器应自动在 ACCESSBANK 中声明的文件寄存器地址的代码指令中设置“a”位。

于 2011-08-09T07:47:06.883 回答
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 个字节。

于 2011-08-09T18:38:49.937 回答