我正在编写一个嵌入式程序,该程序使用已知大小的静态有限堆栈区域(换句话说,我有 X 个字节的堆栈,并且没有覆盖操作系统可以根据需要为我分配更多堆栈)。我想避免在运行时出现错误,并在构建时捕获它们 - 如果我错误地在某些功能块中声明了太多在运行时不适合堆栈的变量,则可以得到一些指示。
鉴于我不在程序中使用递归调用,我能否以某种方式知道在编译期间所有局部变量在最深的函数调用路径上将占用多少堆栈空间?或者至少知道如果编译器不够智能,无法在所有嵌套调用上分析变量,那么我的变量将在单个块(函数)中占用多少空间?
鉴于我不在程序中使用递归调用,我能否以某种方式知道在编译期间所有局部变量在最深的函数调用路径上将占用多少堆栈空间?
仅当您不使用中断时。这在任何嵌入式系统中都是极有可能发生的。因此,您必须通过动态分析来找出堆栈的使用情况。
老派的方法是在调试器重置时将整个堆栈区域设置为 0xAA 之类的值,然后让程序运行一段时间,确保激发所有用例。然后停下来检查内存中 0xAA 的位置还有多远。这不是一种 100% 科学、万无一失的方法,但在绝大多数情况下在实践中效果很好。
其他方法包括在某些您不希望程序结束的堆栈位置设置写入断点,有点像“硬件堆栈金丝雀”。运行程序并确保断点永远不会触发。如果是,则从那里进行调查,将断点进一步向下移动到内存映射以查看确切位置。
另一个好的做法是始终对堆栈进行内存映射,以便它只能溢出到禁止的内存或至少溢出到只读闪存等 - 理想情况下,您会得到堆栈溢出的硬件异常。您绝对希望避免堆栈溢出到其他 RAM 部分(例如 .data/.bss),因为这将导致严重且极其微妙的错误情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)