在PIC18上声明大型阵列

时间:2015-01-21 21:26:17

标签: c arrays 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库有关(16个库,每行256个字节)。我的程序正在使用全局声明的数组,但我很好奇为什么必须这样做。这是最佳做法吗?你有任何提示或想法吗?

谢谢你, 詹姆斯

2 个答案:

答案 0 :(得分:3)

来自xc8用户指南3.5.2.2和3.5.2.3

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

#define buffSize 512

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

这就是我现在正在使用它并且它有效。谢谢你朝着正确的方向发誓。

答案 1 :(得分:0)

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

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

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

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