Как я могу увеличить размер блока памяти в MPLAB? - PullRequest
3 голосов
/ 09 февраля 2009

Компилятор Microchip PIC MPLAB (MCC18) делит свою память на 256 частей (0x100).

Как создать массив размером более 256 байт?

char buffer[256];

Просто чтобы получить 256, мне нужно было сделать отдельный сегмент с #pragma

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

Так что я могу заставить MCC18 выделить больший буфер? или объединить два сегмента памяти?

Ответы [ 3 ]

5 голосов
/ 09 февраля 2009

Вставка ответа от:

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

Стр. 104.

2 голосов
/ 09 февраля 2009

Возможно, кто-то с большим знанием докажет, что я неправ, но я не думаю, что можно делать то, что ты хочешь. Если память на вашем устройстве разделена на сегменты по 256 байт, то вы не можете иметь массив, охватывающий их, AFAIK. Если бы вы это сделали, пришлось бы перепрыгивать через все виды обручей, чтобы позволить вам обращаться с массивом как с непрерывной памятью - он должен был бы проверять каждый индекс, который вы используете, чтобы выяснить, в каком сегменте он должен быть, затем вычислить смещение и получить или, если вы обращаетесь к массиву с помощью арифметики с указателями, он должен выяснить, к чему вы пытаетесь получить доступ, что может быть неочевидным или даже неизвестным во время компиляции. Я не думаю, что у него есть единая модель памяти, которую можно использовать при любых обстоятельствах, из-за того, что некоторые ячейки памяти являются общими для банков (я думаю, что счетчик программ является одним из таких мест) и т. Д. Я говорю в основном из знание типичной архитектуры PIC и некоторый опыт работы со сторонними компиляторами Си. У меня нет большого опыта работы с самой MPLAB, так что ответьте мне немного соли.

Возможно, вы сможете обойти ограничение, выделив массив указателей, а затем инициализируя каждый указатель на новый экземпляр любого типа данных, который вы хотите сохранить в нем (я предполагаю структуру или нечто большее, чем указатель), так как это не потребует непрерывной памяти. Динамическое выделение памяти на PIC, однако, является дорогостоящим, поэтому это может быть не лучшим вариантом для вас.

0 голосов
/ 28 апреля 2014

У меня похожая проблема! Я собирался использовать этот метод: 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) отсутствует основной тип; предполагается 18f2550.lkr: 5: ошибка: (314) ";" ожидаемый
че? все верно!
Я использую mplabx v 2.0 и Mplab xc8 v 1.31

...