在 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) 找不到变量 _bufferspace(512 字节)

如果我全局声明数组,我不会收到错误。

#define buffSize 512
char buffer[buffSize];

int main (void) {
    ...
}

万事如意

我查看了处理器手册和编译器用户指南,怀疑问题与 RAM 库有关(16 个库,每个库 256 字节)。我的程序正在使用全局声明的数组,但我很好奇为什么必须这样做。这是最佳实践吗?您有什么建议或想法吗?

谢谢, 詹姆斯

来自 xc8 用户指南 3.5.2.2 和 3.5.2.3

自动变量,局部变量的默认类型,存储在编译栈中。它们在函数执行时出现,在函数执行returns后消失。编译堆栈上的每一项都必须适合一个数据存储器组(对于 PIC18F66K90 为 256k)。使用static关键字将类型改为非auto,使其存储在通用内存中,因此可以大于一个内存块。

#define buffSize 512

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

这就是我现在正在使用的,并且有效。谢谢指正方向。

您还可以通过使用链接器指令文件来增加堆栈大小。

对于旧的 MPLAB-C18 + MPLINK 工具链,您可以为您的项目使用自定义链接器指令 (lkr) 文件,并像这样指定堆栈大小:

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

看起来这个编译器已经被 XC8 取代了,但如果更新的工具链提供类似的功能,我会感到惊讶。