问题
I have PIC18F87J11 FAMILY and I am using MPLAB C18 Compiler. What is the maximum bytes I can give the following variable.
I know that I have to modify the linker file to achive more than 256 bytes.
#pragma udata CONNECTION_TABLE
This is my clean linker file.
// File: 18f87j11_g.lkr
// Generic linker script for the PIC18F87J11 processor
#DEFINE _CODEEND _DEBUGCODESTART - 1
#DEFINE _CEND _CODEEND + _DEBUGCODELEN
#DEFINE _DATAEND _DEBUGDATASTART - 1
#DEFINE _DEND _DATAEND + _DEBUGDATALEN
LIBPATH .
#IFDEF _CRUNTIME
#IFDEF _EXTENDEDMODE
FILES c018i_e.o
FILES clib_e.lib
FILES p18f87j11_e.lib
#ELSE
FILES c018i.o
FILES clib.lib
FILES p18f87j11.lib
#FI
#FI
#IFDEF _DEBUGCODESTART
CODEPAGE NAME=page START=0x0 END=_CODEEND
CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED
#ELSE
CODEPAGE NAME=page START=0x0 END=0x1FFF7
#FI
CODEPAGE NAME=config START=0x1FFF8 END=0x1FFFD PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
#IFDEF _EXTENDEDMODE
DATABANK NAME=gpre START=0x0 END=0x5F
#ELSE
ACCESSBANK NAME=accessram START=0x0 END=0x5F
#FI
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=gpr4 START=0x400 END=0x4FF
DATABANK NAME=gpr5 START=0x500 END=0x5FF
DATABANK NAME=gpr6 START=0x600 END=0x6FF
DATABANK NAME=gpr7 START=0x700 END=0x7FF
DATABANK NAME=gpr8 START=0x800 END=0x8FF
DATABANK NAME=gpr9 START=0x900 END=0x9FF
DATABANK NAME=gpr10 START=0xA00 END=0xAFF
DATABANK NAME=gpr11 START=0xB00 END=0xBFF
DATABANK NAME=gpr12 START=0xC00 END=0xCFF
DATABANK NAME=gpr13 START=0xD00 END=0xDFF
#IFDEF _DEBUGDATASTART
DATABANK NAME=gpr14 START=0xE00 END=_DATAEND
DATABANK NAME=dbgspr START=_DEBUGDATASTART END=_DEND PROTECTED
#ELSE //no debug
DATABANK NAME=gpr14 START=0xE00 END=0xEFF
#FI
DATABANK NAME=gpr15 START=0xF00 END=0xF3F
DATABANK NAME=sfr15 START=0xF5A END=0xF5F PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
#IFDEF _CRUNTIME
SECTION NAME=CONFIG ROM=config
#IFDEF _DEBUGDATASTART
STACK SIZE=0x100 RAM=gpr13
#ELSE
STACK SIZE=0x100 RAM=gpr14
#FI
#FI
This is my modified linker file to give CONNECTION_TABLE more than 256 bytes.
// File: 18f87j11_g.lkr
// Generic linker script for the PIC18F87J11 processor
#DEFINE _CODEEND _DEBUGCODESTART - 1
#DEFINE _CEND _CODEEND + _DEBUGCODELEN
#DEFINE _DATAEND _DEBUGDATASTART - 1
#DEFINE _DEND _DATAEND + _DEBUGDATALEN
LIBPATH .
#IFDEF _CRUNTIME
#IFDEF _EXTENDEDMODE
FILES c018i_e.o
FILES clib_e.lib
FILES p18f87j11_e.lib
#ELSE
FILES c018i.o
FILES clib.lib
FILES p18f87j11.lib
#FI
#FI
#IFDEF _DEBUGCODESTART
CODEPAGE NAME=page START=0x0 END=_CODEEND
CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED
#ELSE
CODEPAGE NAME=page START=0x0 END=0x1FFF7
#FI
CODEPAGE NAME=config START=0x1FFF8 END=0x1FFFD PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
#IFDEF _EXTENDEDMODE
DATABANK NAME=gpre START=0x0 END=0x5F
#ELSE
ACCESSBANK NAME=accessram START=0x0 END=0x5F
#FI
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=CONNECTION_TABLE START=0x100 END=0x999 PROTECTED
SECTION NAME=CONNECTION_TABLE RAM=CONNECTION_TABLE
DATABANK NAME=gpr10 START=0xA00 END=0xAFF
DATABANK NAME=gpr11 START=0xB00 END=0xBFF
DATABANK NAME=gpr12 START=0xC00 END=0xCFF
DATABANK NAME=gpr13 START=0xD00 END=0xDFF
#IFDEF _DEBUGDATASTART
DATABANK NAME=gpr14 START=0xE00 END=_DATAEND
DATABANK NAME=dbgspr START=_DEBUGDATASTART END=_DEND PROTECTED
#ELSE //no debug
DATABANK NAME=gpr14 START=0xE00 END=0xEFF
#FI
DATABANK NAME=gpr15 START=0xF00 END=0xF3F
DATABANK NAME=sfr15 START=0xF5A END=0xF5F PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
#IFDEF _CRUNTIME
SECTION NAME=CONFIG ROM=config
#IFDEF _DEBUGDATASTART
STACK SIZE=0x100 RAM=gpr13
#ELSE
STACK SIZE=0x100 RAM=gpr14
#FI
#FI
As you can see my CONNECTION_TABLE starts from 0x100
and ends at 0x999
. If I want to give it more bytes, what is the maximum I can give it?
If you look closely you will notice I have the following code.
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
Does that mean CONNECTION_TABLE can not get more than 0xFFF
?
Pretty much I want to double the number of bytes for my CONNECTION_TABLE, how can I do that?
Currently I have it start at 0x100
and ends at 0x999
, can I change the ending to 0x1332
? Or that won't work because I will go over the boundary 0xFFF
?
Thanks!
回答1:
Down load the PIC18F87J11 datasheet and read carefully section: 5.3 Data Memory Organization
FIGURE 5-7: DATA MEMORY MAP FOR PIC18F87J11 FAMILY DEVICES show how the memory is organized.
- MCPUs PIC18 family have max 4096 bytes of RAM.
- RAM starts at 0x000 and ends at 0xFFF address.
- General Purpose Registers are form address 0x100 to 0xF5F.
- You can extend your bank size up to 0xF5F address (not to 0xFFF)
来源:https://stackoverflow.com/questions/17182064/how-to-make-data-bank-size-more-than-256-bytes-linker-file-mplab