Microchip PIC MPLAB (MCC18) 编译器将其内存分段为 256 个块 (0x100)。
如何创建大于 256 字节的数组?
char buffer[256];
为了达到 256,我需要用一个单独的段#pragma
#pragma udata segment_name
char buffer[256];
#pragma udata
所以我可以强制 MCC18 分配更大的缓冲区吗?还是结合两个内存段?
粘贴答案来自:
http://forum.microchip.com/printable.aspx?m=39357
以防万一它消失。
在三个简单的步骤中第 1 步:将变量分配到源代码中的命名部分:
#pragma udata big_scn char big_array[0x180]; #pragma udata
第 2 步:在链接描述文件中创建更大的区域: 之前:
DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF
后:
DATABANK NAME=big_scn START=0x300 END=0x47F PROTECTED DATABANK NAME=gpr4 START=0x480 END=0x4FF SECTION NAME=big_scn RAM=big_scn
第 3 步:仅通过指针引用:
char *big_array_ptr = &big_array[0]; big_array_ptr[0x100] = 5; while( big_array_ptr[x] != 20 )
注意:我相信您仍然可以直接引用数组而不是使用指针。似乎对我有用。
可以在以下文档中找到相同的信息:
第 104 页。
也许有更多知识的人会证明我错了,但我认为不可能做你想做的事。如果您的设备中的内存被划分为 256 字节的段,那么您不能有一个跨越它们的数组,AFAIK。如果你这样做了,它就必须跳过各种各样的循环才能让你将数组视为连续内存——它必须检查你用来确定它应该在哪个段中的每个索引,然后计算偏移量并访问它,或者如果您使用指针算法访问数组,它必须弄清楚您要访问的内容,这在编译时可能是不明显的甚至是未知的。我不认为它有一个单一的内存模型可以在所有情况下使用,因为一些内存位置在银行之间是通用的(我认为程序计数器就是这样一个位置),等等。我主要是从对典型 PIC 架构的了解和使用第三方 C 编译器的一些经验说的。我对 MPLAB 本身没有太多经验,所以我的回答持保留态度。
您可以通过分配一个指针数组然后将每个指针初始化为您想要存储在其中的任何数据类型的新实例来绕过限制(我假设一个结构或比指针更大的东西) ,因为这不需要内存是连续的。但是,PIC 上的动态内存分配很昂贵,因此这对您来说可能不是一个好选择。
我有类似的问题!我打算使用这种方法: http: //www.hobbytronics.co.uk/c18-large-data-arrays
但是当我添加链接器而不对项目进行任何更改并编译我得到的项目时此错误
// $Id: 18f2550.lkr,v 1.3 2005/03/24 04:17:19 craigfranklin Exp $
// 文件:18f2550.lkr
// PIC18F2550 处理器的链接描述文件示例
LIBPATH .
//CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
CODEPAGE NAME=page START=0x0 END=0x6FFB
CODEPAGE NAME=boot START=0x6FFC END=0x7FFF PROTECTED
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
ACCESSBANK NAME=accessram START=0x0 END=0x5F
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=usb4 START=0x400 END=0x4FF PROTECTED
DATABANK NAME=usb5 START=0x500 END=0x5FF PROTECTED
DATABANK NAME=usb6 START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=CONFIG ROM=config
SECTION NAME=bank1 RAM=gpr1
SECTION NAME=usbram4 RAM=usb4
SECTION NAME=usbram5 RAM=usb5
SECTION NAME=eeprom ROM=eedata
错误:
18f2550.lkr:5:警告:(374)缺少基本类型;int 假定为 18f2550.lkr:5:错误:(314)“;” 期待
why?一切都是真的!
我正在使用 mplabx v 2.0 和 Mplab xc8 v 1.31