我定义了一个自动char数组如下:
char buffer[100];编译它时,编译器返回以下错误:
error: (1250) could not find space (100 bytes) for variable _buffer但当我把它改为:
static char buffer[100];程序编译成功。
附注1:
我的目标设备是16f1829。
附注2:
编译器版本为1.30。
发布于 2017-08-27 19:16:56
所有的per 16都有RAM组,每个内存库有80字节的可用RAM。这一点在数据表中的3.2.4公共RAM部分中进行了描述。
您所看到的问题与堆栈的大小无关,而与可以在堆栈上分配的每个项的大小有关。
在XC8上,自动变量不能单独大于一个内存库,这意味着最大的自动变量可能是80个字节。
在5.5.2.2.3节的XC8编译器用户指南中详细介绍了这一点,具体如下:
与非自动变量不同,使用增强的中程设备的线性内存访问编译堆栈中的自动变量是不有效的。对于所有设备,包括PIC18和增强的中程PIC MCU,编译堆栈的每个组件必须完全适合目标设备上的一组数据内存(但是,您可以有多个组件,每个组件分配给不同的组)。这将堆栈中对象的大小限制在分配它的银行的最大空闲空间。堆栈中的自动变量越多,对大型对象的空间限制就越大。回想一下,中期设备上的SFRs通常存在于每个数据库中,因此每个数据库中可用的探地雷达的最大数量通常小于这些设备的库容量。
发布于 2018-09-20 11:14:45
是的,这实际上不是一个堆栈,因为xc8函数是不可重入的。这意味着它不是使用实际的堆栈来保存自动变量和参数,而是使用RAM中预先分配的空间。看看呼叫树的地图。您可能会重复调用,因为如果可以从中断和正常运行时调用它们,它们将位于不同的调用树中,因此需要单独分配内存(也就是说,它们将占用空间的两倍;如果有三个调用树,则可能占用三倍)。
https://stackoverflow.com/questions/45893505
复制相似问题