【问题标题】:how to solve overflow errors on mikroC for PIC?如何解决 mikroC for PIC 上的溢出错误?
【发布时间】:2013-06-04 01:16:22
【问题描述】:

我的程序有几个图像,我想做一些像 LCD 和键盘的菜单。 在我遇到两个错误之前它工作正常:

> Recursion or cross-calling of 'lcd_write'
> Not enough RAM for call stack

我读到了一些关于堆栈溢出的内容。我该如何解决这个问题?

我将 PIC16F877a 和 mikroC 用于 PIC v6 编译器。

【问题讨论】:

    标签: stack overflow ram pic mikroc


    【解决方案1】:

    解决这个问题的方法是——回到上一个可编译的版本,看看你引入的哪些改变导致了对 lcd_write 的另一个调用,重组你的程序以便消除那个调用,因为它会导致递归。例如,将 lcd 写入数据放入缓冲区而不是立即写入,稍后在缓冲区中找到内容时再写入。

    递归在嵌入式环境中很糟糕,因为它在编译时使用未知量的调用堆栈,而像 PIC 这样的小型微控制器通常具有 8 个硬件调用堆栈(例如 PIC16F877a),甚至小到2 级。

    Embedded Gurus 有a good explanation 的调用堆栈问题。

    【讨论】:

    • 我之前读过它,最后我得到了这个“如果你在尝试了所有这些之后仍然被卡住,那么你真的是在泡菜中。”大声笑我刚刚介绍了一个 if/else 语句并且错误开始了。像 lcd_write 我的所有函数都有这个错误
    【解决方案2】:

    转到最后一个可编译的版本,编译成功,然后转到视图选项卡,然后是“统计”

    在此菜单中,您可以看到调用函数树并查看堆栈的极限位置。使用同一个控制器遇到了同样的问题,并重新构建了我的 I2C LCD 函数,这样它们就不会在另一个被调用函数中调用函数。

    如果您确实无法优化代码,请考虑升级到 PIC18。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多