繁体   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