XC8:无法定义自动数组

XC8 : Cannot define auto array

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

char buffer[100];

当我编译它时,编译器 return 出现以下错误:

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

但是当我把它改成:

static char buffer[100];

程序编译成功

注一:

我的目标设备是 16f1829。

注2:

编译器版本为 1.30。

所有 PIC16 都有 RAM 组,每个组有 80 字节的可用 RAM。这在数据表的第 3.2.4 节公共 RAM 中进行了描述。

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

在 XC8 上,auto 变量不能单独大于一个 ram,这意味着最大的 auto 变量可能是 80 个字节。

XC8 编译器用户指南第 5.5.2.2.3 节中对此有详细描述,如下所示:

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

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