Microchip PIC MPLAB(MCC18)編譯器將其存儲器分爲256個塊(0x100)。如何創建大於256字節的數組?如何增加MPLAB內存塊的大小?
char buffer[256];
只是去256,我需要做一個#pragma
#pragma udata segment_name
char buffer[256];
#pragma udata
一個單獨的細分所以,我可以強制MCC18讓分配更大的緩衝區?或組合兩個內存段?
Microchip PIC MPLAB(MCC18)編譯器將其存儲器分爲256個塊(0x100)。如何創建大於256字節的數組?如何增加MPLAB內存塊的大小?
char buffer[256];
只是去256,我需要做一個#pragma
#pragma udata segment_name
char buffer[256];
#pragma udata
一個單獨的細分所以,我可以強制MCC18讓分配更大的緩衝區?或組合兩個內存段?
也許有更多知識的人會證明我錯了,但我不認爲有可能做你想做的事。如果設備中的內存被分成256個字節的段,那麼您不能有一個跨越它們的數組AFAIK。如果你這樣做,它將不得不跳過各種各樣的箍環,讓你把數組視爲連續的內存 - 它將不得不檢查你使用的每個索引來確定它應該在哪個段,然後計算偏移和訪問它,或者如果您使用指針算法訪問數組,它必須找出您想要訪問的內容,這在編譯時可能不明顯,甚至未知。我不認爲它有一個單一的內存模型,它可以用於所有情況,因爲一些內存位置在銀行間是很常見的(我認爲程序計數器就是這樣一個位置)等等。我主要從瞭解典型的PIC架構以及使用第三方C編譯器的經驗。我對MPLAB本身並沒有太多的經驗,所以我要回答一些問題。
你可以通過分配一個指針數組來避開這個限制,然後初始化每個指針到一個你想存儲在其中的任何數據類型的新實例(我假設一個結構或者更大的東西比指針),因爲這不需要內存連續。 PIC上的動態內存分配非常昂貴,因此這可能不適合您。
粘貼回答:
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頁。
感謝您提供解決方案,而不僅僅是一個可以死的鏈接。 – Robert 2009-02-10 20:44:44
我有一個類似的問題,我會用這個方法: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
這可能是因爲有一些「FAR」指針的概念。 – 2009-11-06 12:46:09