首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XC8 :无法定义自动数组

XC8 :无法定义自动数组
EN

Stack Overflow用户
提问于 2017-08-26 08:29:01
回答 2查看 321关注 0票数 1

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

代码语言:javascript
复制
char buffer[100];

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

代码语言:javascript
复制
error: (1250) could not find space (100 bytes) for variable _buffer

但当我把它改为:

代码语言:javascript
复制
static char buffer[100];

程序编译成功。

附注1:

我的目标设备是16f1829。

附注2:

编译器版本为1.30。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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通常存在于每个数据库中,因此每个数据库中可用的探地雷达的最大数量通常小于这些设备的库容量。

票数 2
EN

Stack Overflow用户

发布于 2018-09-20 11:14:45

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45893505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档