1

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

char buffer[100];

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

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

但是当我将其更改为:

static char buffer[100];

程序编译成功。

注1:

我的目标设备是 16f1829。

笔记2 :

编译器版本为 1.30。

4

2 回答 2

2

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

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

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

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

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

于 2017-08-27T19:16:56.857 回答
0

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

于 2018-09-20T11:14:45.680 回答