如何在MPLAB中增加内存块的大小?

时间:2009-02-09 18:22:41

标签: memory embedded pic microchip

Microchip PIC MPLAB(MCC18)编译器将其存储器分为256个块(0x100)。

如何创建大于256字节的数组?

char buffer[256];

要达到256,我需要使用#pragma

创建一个单独的细分
#pragma udata segment_name
char buffer[256];
#pragma udata

所以我可以强迫MCC18分配更大的缓冲区吗?或组合两个内存段?

3 个答案:

答案 0 :(得分:5)

粘贴答案:

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步:仅通过a引用   指针:

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页。

答案 1 :(得分:2)

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

您可以通过分配指针数组然后将每个指针初始化为要存储在其中的任何数据类型的新实例来绕过限制(我假设结构或大于指针),因为这不需要内存连续。然而,PIC上的动态内存分配是昂贵的,因此这对您来说可能不是一个好的选择。

答案 2 :(得分: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.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)“;”预期
什么?一切都是真的!
 我使用的是mplabx v 2.0和Mplab xc8 v 1.31