c - 数据空间溢出

标签 c embedded microcontroller keil 8051

我已经使用 C8051F120 的不同库在 keil 中编写了 c 代码。但在某些情况下,当我在主程序中使用我的库函数时,它运行良好,但当我在定时器中断例程中使用该函数时,我的数据空间会溢出。

谁能告诉我这背后的原因是什么以及为什么这个数据空间会溢出?

总数据空间:128字节

在 main 中使用时:119 字节

在定时器例程中使用时:139字节(溢出)

我已经分析了 map 文件,但无法获取它。所以请帮我解决这个问题。

最佳答案

Can anyone please tell me what's the reason behind this and why this data space gets overflow ?

默认的 small 内存模型将变量放入 data 内存空间——总共只有 128 字节。

一个可能的解决方案是将编译器切换到 large 内存模型,它将变量放入 xdata 内存中。 XDATA 明显更大(在 C8051F120 上为 8KB)。请注意,这会带来性能损失 - 但这对于运行频率高达 100MHz 的 MCU 来说几乎无关紧要。

警告:C8051Fxxx 喜欢由于看门狗而卡在启动代码中,以防外部数据初始化量超过一定数量。看门狗超时只是比用闪存中的值加载 xdata 所需的时间短。在 large 内存模型中,这可能会影响您。解决方法是使用正确处理 WDT(或简单地禁用它)的启动代码。

关于c - 数据空间溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51645960/

相关文章:

c - 如何在两条直线之间生成随机坐标?

c++ - C/C++ 中的无限循环

c - 使用 fscanf() 在 C 中以科学格式读取数字时出现问题

c - fgets() 不响应 PuTTY 命令

c - ATMEGA168A - 使用定时器

c - 为数据重用代码内存

microcontroller - 当前是否有非哈佛架构的微 Controller ?

c++ - ARM GCC 交叉编译器 fedora 22

microcontroller - 使用JTAG接口(interface)进行编程

volatile 变量的更改仅在单步执行代码或关闭优化时发生