我有一个启动
的链接描述文件 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声明。它应该工作。
由于 - 理查德
答案 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个字节。