我尝试使用编译器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个字节)。我的程序正在使用全局声明的数组,但我很好奇为什么必须这样做。这是最佳做法吗?你有任何提示或想法吗?
谢谢你, 詹姆斯
答案 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取代,但如果新的工具链不提供类似的功能,我会感到惊讶。