【问题标题】:How can I increase the size of a memory block in MPLAB?如何在 MPLAB 中增加内存块的大小?
【发布时间】:2010-10-06 11:13:13
【问题描述】:

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

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

char buffer[256];

为了达到 256,我需要使用 #pragma 制作一个单独的段

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

所以我可以强制 MCC18 分配更大的缓冲区吗?还是合并两个内存段?

【问题讨论】:

    标签: memory embedded pic microchip


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      粘贴答案来自:

      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 )
      

      注意:我相信您仍然可以直接引用数组而不是使用指针。似乎对我有用。

      在以下文档中可以找到相同的信息:

      MPLAB C18 C Compiler Getting Started Guide

      第 104 页。

      【讨论】:

      • 感谢您提供解决方案,而不仅仅是一个会死的链接。
      • 请注意,如果你做这样的事情,使用付费的 C18 编译器而不是学生编译器变得更加重要。它可以在某些情况下优化掉银行加载
      【解决方案3】:

      我也有类似的问题!我打算用这个方法: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

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 2016-05-29
        • 2013-02-14
        • 1970-01-01
        • 2016-02-01
        • 2013-06-17
        • 2016-11-21
        • 2012-10-14
        • 2022-06-12
        相关资源
        最近更新 更多