簡體   English   中英

在PIC18上聲明大陣列

[英]Declaring large arrays on PIC18

我正在嘗試使用編譯器XC8 v1.32在MPLAB X v2.26中聲明一個512字節數組。 我的目標是PIC18F66K90(4k RAM)。

如果在任何函數(例如main)中聲明該數組,則會收到錯誤消息。

#define buffSize 512

int main (void) {
    char buffer[buffSize];
    ...
}

錯誤:(1250)找不到變量_buffer的空間(512字節)

如果我在全局范圍內聲明數組,則不會收到錯誤。

#define buffSize 512
char buffer[buffSize];

int main (void) {
    ...
}

一切都好快樂

我看過處理器的手冊和編譯器的用戶指南,懷疑問題與RAM bank(16個bank,每個256字節)有關。 我的程序正在使用全局聲明的數組,但是我很好奇為什么必須采用這種方式。 這是最佳做法嗎? 您有什么建議或想法嗎?

謝謝詹姆斯

從xc8用戶指南3.5.2.2和3.5.2.3

自動變量是局部變量的默認類型,存儲在編譯后的堆棧中。 它們在執行函數時就存在,並在函數返回時消失。 編譯堆棧中的每個項目都必須位於一個數據存儲區中(PIC18F66K90為256k)。 使用static關鍵字將類型更改為非自動類型,以便將其存儲在常規內存中,因此可以大於一組內存。

#define buffSize 512

int main (void) {
    static char buffer[buffSize];
    ...
}

這就是我現在正在使用的並且有效。 謝謝您朝着正確的方向前進。

您還可以通過使用鏈接器指令文件來增加堆棧大小。

對於舊的MPLAB-C18 + MPLINK工具鏈,可以為項目使用自定義鏈接器指令(lkr)文件,並按如下所示指定堆棧大小:

 DATABANK   NAME=stackregion   START=0xB00       END=0xEFF

貌似這個編譯器已經取代XC8,但我會感到驚訝,如果較新的工具鏈提供類似的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM