我的程序有几个图像,我想做一些像LCD和键盘的菜单。 它工作得很好,直到我得到两个错误的那一刻:
> Recursion or cross-calling of 'lcd_write'
> Not enough RAM for call stack
我读了一些有关堆栈溢出的内容。我该如何解决这个问题?
我使用PIC16F877a和mikroC作为PIC v6编译器。
答案 0 :(得分:0)
解决这个问题的方法是 - 回到上一个可编译的版本,看看你引入了哪些更改导致另一次调用lcd_write,重构你的程序,以便消除该调用,因为它会导致递归。一个例子是将lcd写入数据放入缓冲区而不是立即写入,然后在缓冲区中找到某些内容时将其写入。
在嵌入式环境中递归是不好的,因为它在编译时未知量时使用调用堆栈,而像PIC这样的小型微处理器通常具有8的硬件调用堆栈(例如PIC16F877a),甚至小到2级。
嵌入式专家对调用堆栈有a good explanation个问题。
答案 1 :(得分:0)
转到最后一个可编辑版本,成功编译,然后转到视图选项卡,然后"统计"
在此菜单中,您可以看到呼叫功能树,并查看堆栈的位置限制。使用相同的控制器遇到同样的问题并重新构建我的I2C LCD功能,这样他们就不会在另一个被调用的函数中调用函数。
如果您真的无法优化代码,请考虑升级到PIC18。