2009-02-09 115 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