在嵌入式软件中,如何以通用方式处理堆栈溢出?
我遇到过一些确实以硬件方式提供保护的处理器,例如最近的 AMD 处理器。
维基百科上有一些技术,但这些是真正实用的方法吗?
任何人都可以给出一个在当今 32 位嵌入式处理器的所有情况下都适用的明确建议方法吗?
理想情况下,您可以使用静态堆栈使用来编写代码(无递归调用)。然后您可以通过以下方式评估最大堆栈使用率:
- 静态分析(使用工具)
- 在以完整的代码覆盖率运行代码时测量堆栈使用情况(或尽可能高的代码覆盖率,直到您有合理的信心确定了堆栈使用的范围,只要您很少运行的代码不使用特别多的代码)堆栈比正常执行路径)
但即便如此,您仍然希望有一种方法检测进而handling如果发生堆栈溢出(如果可能的话),以提高鲁棒性。这在项目的开发阶段特别有帮助。一些方法可以detect溢出:
- 如果处理器支持内存读/写中断(即内存访问断点中断),则可以将其配置为指向堆栈区域的最远范围。
- 在内存映射配置中,设置一个小(或大)RAM 块作为“堆栈保护”区域。用已知值填充它。在嵌入式软件中,定期(尽可能频繁地)检查该区域的内容。如果它发生变化,则假设堆栈溢出。
一旦你检测到它,那么你需要handle它。我不知道有多少方法可以使代码从堆栈溢出中正常恢复,因为一旦发生,您的程序逻辑几乎肯定会失效。所以你能做的就是
- log the error
- 记录错误非常有用,因为否则症状(意外重新启动)可能很难诊断。
- 警告:即使在堆栈损坏的情况下,日志记录例程也必须能够可靠地运行。例程应该很简单。 IE。如果堆栈损坏,您可能无法尝试使用精美的 EEPROM 写入后台任务写入 EEPROM。也许只是将错误记录到非初始化 RAM 中为此目的保留的结构中,然后可以在重新启动后进行检查。
- Reboot (or perhaps shutdown, especially if the error reoccurs repeatedly)
- 可能的替代方案:如果您使用的是 RTOS,并且您的系统设计为隔离堆栈损坏,并且所有其他任务都能够处理该任务重新启动,则仅重新启动特定任务。这需要一些认真的设计考虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)