【问题标题】:XC8 : Cannot define auto arrayXC8:无法定义自动数组
【发布时间】:2017-08-26 08:29:01
【问题描述】:

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

char buffer[100];

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

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

但是当我把它改成:

static char buffer[100];

程序编译成功。

注1:

我的目标设备是 16f1829。

注2:

编译器版本为 1.30。

【问题讨论】:

  • C 中的自动数组是堆栈局部变量。微控制器的编译器可能知道可用的堆栈大小。检查配置的堆栈大小。可能你可以通过编译器设置来改变它。验证您的项目的启动代码是否为堆栈分配了该大小。

标签: c xc8


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 1970-01-01
      • 2011-12-18
      • 2016-04-15
      • 2019-09-04
      • 1970-01-01
      • 2011-12-16
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多