c - 如何使数据库大小超过 256 字节 [链接器文件 - MPLAB]

标签 c linker microcontroller pic mplab

我有 PIC18F87J11 系列,我正在使用 MPLAB C18 编译器。我可以给以下变量的最大字节数是多少。

我知道我必须修改链接器文件以达到超过 256 个字节。

#pragma udata CONNECTION_TABLE

这是我干净的链接器文件。

// 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

这是我修改后的链接器文件,为 CONNECTION_TABLE 提供超过 256 个字节。

// 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

如您所见,我的 CONNECTION_TABLE0x100 开始,在 0x999 结束。如果我想给它更多的字节,我能给它的最大值是多少?

如果仔细观察,您会发现我有以下代码。

ACCESSBANK NAME=accesssfr  START=0xF60             END=0xFFF          PROTECTED

这是否意味着 CONNECTION_TABLE 不能超过 0xFFF

我非常想将我的CONNECTION_TABLE 的字节数加倍,我该怎么做?

目前我让它从 0x100 开始到 0x999 结束,我可以将结尾更改为 0x1332 吗?还是那行不通,因为我会越过边界 0xFFF

谢谢!

最佳答案

下载 PIC18F87J11 datasheet并仔细阅读部分:5.3 数据存储组织

图 5-7:PIC18F87J11 系列器件的数据存储器映射显示了存储器的组织方式。

  1. MCPU PIC18 系列最多有 4096 字节的 RAM。
  2. RAM 从 0x000 开始到 0xFFF 地址结束。
  3. 通用寄存器的地址为 0x100 到 0xF5F。
  4. 您最多可以将存储区大小扩展到 0xF5F 地址(而不是 0xFFF)

关于c - 如何使数据库大小超过 256 字节 [链接器文件 - MPLAB],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17182064/

相关文章:

c - 这两种指针方法的区别

objective-c - C和Objective-C中返回地址的内存分配

c - 尝试运行一个程序,在运行函数 copyij() 和 copyji() 后以秒为单位跟踪耗时

gcc - 如何使用 binutils 链接器处理静态库之间的递归依赖关系?

.net - 从微 Controller (带有 .Net Micro Framework 的 Arduino 或 Fez)连接到 SQL Server

c - 读取 PMG P5 文件时出现错误

objective-c - 不确定如何导出 Objective-C 类。架构 i386 的 undefined symbol

c++ - "cannot find -lboost-system",但文件系统上存在库

在一整秒内每 X 毫秒在一个值之间循环的条件

c - 如何定义指向端口地址的指针