C语言 XC8 : 无法定义自动数组



我定义了一个自动字符数组如下:

char buffer[100];

当我编译它时,编译器返回以下错误:

error: (1250) could not find space (100 bytes) for variable _buffer

但是当我将其更改为:

static char buffer[100];

程序编译成功。

注1:

我的目标设备是 16f1829。

注2:

编译器版本为 1.30。

所有 PIC16 都有 RAM 插槽,每个存储体有 80 字节的可用 RAM。这在数据表中的 3.2.4 公共 RAM 一节中有描述。

您看到的问题与堆栈的大小无关,而是与可以在堆栈上分配的每个项目的大小有关。

在 XC8 上,自动变量不能单独大于一组内存,这意味着可能的最大自动变量将是 80 字节。

这在XC8编译器用户指南的第5.5.2.2.3节中有详细的描述如下:

与非自动变量不同,使用增强型中端设备的线性存储器访问编译堆栈中的自动变量效率不高。对于所有器件,包括 PIC18 和增强型中端 PIC MCU,编译堆栈的每个组件必须完全适合目标设备上的一个数据存储器组(但是,您可以有多个组件,每个组件分配给不同的组(。这会将堆栈中对象的大小限制为分配它的存储体的最大可用空间。堆栈中的自动变量越多;空间对大型物体的限制越大。回想一下,每个数据库中通常都存在中端设备上的SFR,因此每个库中可用的最大GPR量通常小于这些设备的银行大小。

是的,它不是一个真正的堆栈,因为 xc8 函数是不可重入的。 这意味着它不是使用实际的堆栈来保存自动变量和参数,而是使用 RAM 中的预分配空间。 查看调用树图。您可能有重复的调用,因为如果可以从中断和正常运行时调用它们,它们将位于不同的调用树中,因此需要单独的内存分配(即它们将占用双倍的空间;如果您有三个调用 tress,则可能占用三倍(

最新更新