我将auto char数组定义如下:
char buffer[100];
编译时,编译器返回以下错误:
error: (1250) could not find space (100 bytes) for variable _buffer
但是当我把它改为:
static char buffer[100];
程序编译成功。
注1:
我的目标设备是16f1829。
注2:
编译器版本为1.30。
答案 0 :(得分:2)
所有PIC16都有RAM存储区,每个存储区有80个字节的可用RAM。这将在数据表中的3.2.4通用RAM中描述。
您遇到的问题与堆栈的大小无关,而是可以在堆栈上分配的每个项目的大小。
在XC8上,自动变量不能单独大于一个ram组,这意味着可能的最大自动变量将是80个字节。
“XC8编译器用户指南”的5.5.2.2.3节对此进行了详细说明,如下所示:
与非自动变量不同,使用增强型中档设备的线性内存访问编译堆栈中的自动变量效率不高。对于所有器件,包括PIC18和增强型中档PIC MCU,编译堆栈的每个组件必须完全适合目标器件上的一组数据存储器(但是,您可以拥有多个组件,每个组件分配给不同的组)。这将堆栈中对象的大小限制为分配它的库的最大可用空间。堆栈中的自动变量越多;空间对大型物体的限制越多。回想一下,中档设备上的SFR通常存在于每个数据库中,因此每个存储区中可用的最大GPR数量通常小于这些设备的存储区大小。
答案 1 :(得分:0)
是的,它不是真正的堆栈,因为xc8函数是不可重入的。 这意味着,它不使用实际的堆栈来保存自动变量和参数,而是使用RAM中的预分配空间。 查看调用树图。您可能有重复的调用,因为如果可以同时从中断和正常运行时调用它们,则它们将位于不同的调用树中,因此需要单独分配内存(即,它们将占用双倍的空间;如果您有三个调用,则可能为TRIPLE)发束)