0

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

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

我读了一些关于堆栈溢出的东西。我怎么解决这个问题?

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

4

2 回答 2

0

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

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

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

于 2014-06-12T12:35:26.997 回答
0

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

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

Embedded Gurus很好地解释了调用堆栈的问题。

于 2013-06-04T11:56:55.367 回答