2009-02-09 112 views
2

Microchip PIC MPLAB(MCC18)编译器将其存储器分为256个块(0x100)。如何创建大于256字节的数组?如何增加MPLAB内存块的大小?

char buffer[256]; 

只是去256,我需要做一个#pragma

#pragma udata segment_name 
char buffer[256]; 
#pragma udata 

一个单独的细分所以,我可以强制MCC18让分配更大的缓冲区?或组合两个内存段?

回答

2

也许有更多知识的人会证明我错了,但我不认为有可能做你想做的事。如果设备中的内存被分成256个字节的段,那么您不能有一个跨越它们的数组AFAIK。如果你这样做,它将不得不跳过各种各样的箍环,让你把数组视为连续的内存 - 它将不得不检查你使用的每个索引来确定它应该在哪个段,然后计算偏移和访问它,或者如果您使用指针算法访问数组,它必须找出您想要访问的内容,这在编译时可能不明显,甚至未知。我不认为它有一个单一的内存模型,它可以用于所有情况,因为一些内存位置在银行间是很常见的(我认为程序计数器就是这样一个位置)等等。我主要从了解典型的PIC架构以及使用第三方C编译器的经验。我对MPLAB本身并没有太多的经验,所以我要回答一些问题。

你可以通过分配一个指针数组来避开这个限制,然后初始化每个指针到一个你想存储在其中的任何数据类型的新实例(我假设一个结构或者更大的东西比指针),因为这不需要内存连续。 PIC上的动态内存分配非常昂贵,因此这可能不适合您。

+0

这可能是因为有一些“FAR”指针的概念。 – 2009-11-06 12:46:09

5

粘贴回答:

http://forum.microchip.com/printable.aspx?m=39357

万一它消失。

In Three Easy Steps Step 1: Assign the variable into a named section in source code:

#pragma udata big_scn 
char big_array[0x180]; 
#pragma udata 

Step 2: Create the larger region in the linker script: Before:

DATABANK NAME=gpr3 START=0x300 END=0x3FF 
DATABANK NAME=gpr4 START=0x400 END=0x4FF 

After:

DATABANK NAME=big_scn START=0x300 END=0x47F PROTECTED 
DATABANK NAME=gpr4 START=0x480 END=0x4FF 
SECTION NAME=big_scn RAM=big_scn 

Step 3: Reference only through a pointer:

char *big_array_ptr = &big_array[0]; 
big_array_ptr[0x100] = 5; 
while(big_array_ptr[x] != 20) 

注意:我相信你仍然可以直接引用数组而不是使用指针。似乎为我工作。

相同的信息可在下列文件中找到:

MPLAB C18 C Compiler Getting Started Guide

第104页。

+0

感谢您提供解决方案,而不仅仅是一个可以死的链接。 – Robert 2009-02-10 20:44:44

0

我有一个类似的问题,我会用这个方法:http://www.hobbytronics.co.uk/c18-large-data-arrays
但是,当我添加了链接器,没有任何改变项目和编译项目我得到这个错误
// $ Id:18f2550.lkr,v 1.3 2005/03/24 04:17:19 craigfranklin Exp $
//文件:
18f2550:对于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
//样品链接脚本。lkr:5:警告:(374)缺少基本类型; int假定为 18f2550.lkr:5:错误:(314)“;”预计
whay?一切都是真的!
我正在使用mplabx v 2.0和Mplab xc8 v 1.31