处理嵌入式系统中的堆栈溢出

2024-04-26

在嵌入式软件中,如何以通用方式处理堆栈溢出? 我遇到过一些确实以硬件方式提供保护的处理器,例如最近的 AMD 处理器。 维基百科上有一些技术,但这些是真正实用的方法吗?

任何人都可以给出一个在当今 32 位嵌入式处理器的所有情况下都适用的明确建议方法吗?


理想情况下,您可以使用静态堆栈使用来编写代码(无递归调用)。然后您可以通过以下方式评估最大堆栈使用率:

  1. 静态分析(使用工具)
  2. 在以完整的代码覆盖率运行代码时测量堆栈使用情况(或尽可能高的代码覆盖率,直到您有合理的信心确定了堆栈使用的范围,只要您很少运行的代码不使用特别多的代码)堆栈比正常执行路径)

但即便如此,您仍然希望有一种方法检测进而handling如果发生堆栈溢出(如果可能的话),以提高鲁棒性。这在项目的开发阶段特别有帮助。一些方法可以detect溢出:

  1. 如果处理器支持内存读/写中断(即内存访问断点中断),则可以将其配置为指向堆栈区域的最远范围。
  2. 在内存映射配置中,设置一个小(或大)RAM 块作为“堆栈保护”区域。用已知值填充它。在嵌入式软件中,定期(尽可能频繁地)检查该区域的内容。如果它发生变化,则假设堆栈溢出。

一旦你检测到它,那么你需要handle它。我不知道有多少方法可以使代码从堆栈溢出中正常恢复,因为一旦发生,您的程序逻辑几乎肯定会失效。所以你能做的就是

  1. log the error
    1. 记录错误非常有用,因为否则症状(意外重新启动)可能很难诊断。
    2. 警告:即使在堆栈损坏的情况下,日志记录例程也必须能够可靠地运行。例程应该很简单。 IE。如果堆栈损坏,您可能无法尝试使用精美的 EEPROM 写入后台任务写入 EEPROM。也许只是将错误记录到非初始化 RAM 中为此目的保留的结构中,然后可以在重新启动后进行检查。
  2. Reboot (or perhaps shutdown, especially if the error reoccurs repeatedly)
    1. 可能的替代方案:如果您使用的是 RTOS,并且您的系统设计为隔离堆栈损坏,并且所有其他任务都能够处理该任务重新启动,则仅重新启动特定任务。这需要一些认真的设计考虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理嵌入式系统中的堆栈溢出 的相关文章

  • 是否存在应明确跟踪或忽略的事件?

    在做研究解决问题的同时如何在处理程序之后自动重新引发异常 https stackoverflow com q 56084252 216356 开发了一个异常类 具有在处理后自动再次抛出自身的能力 受到ThreadAbortException
  • 嵌入式+实时开发培训的建议[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在学习嵌入式实时工程职业 但发现找到好的培训材料有些困难 特别是因为您无法像桌面应用程序开发那
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • 将 PHP 错误处理程序限制为特定命名空间

    PHP 有没有办法只为特定的命名空间设置错误处理程序 我正在构建一个小型框架 我希望能够通过设置自定义错误处理程序并抛出异常来尝试捕获其名称空间内的所有错误 警告 通知消息 在此特定名称空间之外触发的错误应该以常规方式表现 用PHP可以完成
  • 工作站和嵌入式程序员之间的心态差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • R:使用 RGDAL 和 RASTER 包时抛出错误

    给所有可能相关的人 这是源代码 GRA D1 lt raster files 1 Sets up an empty output raster GRA D1 lt writeStart GRA D1 filename GRA D1 tif
  • CC2538 的 Contiki UDP 数据包传输持续时间

    有人可以解释一下 Contiki OS 传输 UDP 数据包时发生了什么吗 以下是我的设备使用 CC2538 芯片运行时的详细电流消耗 我的问题是 既然理论上在 250kbps 下 408 位长度的数据包应该在大约 2ms 内传输 为什么要
  • MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?

    MISRA C 规则 18 4 1 说 不得使用动态堆内存分配 See http dist sonarsource com reports coverage misra c 2008 html http dist sonarsource c
  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择
  • 从远程托管上的 PHP 获取 PHP 错误日志

    是否有 PHP 函数或其他方式以字符串形式获取 PHP 错误日志 我需要这个 因为我无法访问在其他人的服务器上运行的站点的错误日志 他提出通过电子邮件将错误日志发送给我 但这不太方便 有什么方法可以将错误日志输出到 PHP 页面吗 我意识到
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • 用于嵌入式系统的简约人类可读序列化格式解析器

    By 人类可读的序列化格式 I mean YAML JSON INI或喜欢 请注意 XML对于我的目的来说太冗长而且太不方便 所以让我们把它作为最后的手段 格式应将数据存储为 命名键 值 配对并允许嵌套和数组 不过 缺少数组并不重要 此外
  • Scala [2.11.6] 编译 Stackoverflow 错误(似乎对迄今为止发现的建议有抵抗力)

    scala版本 2 11 6 我当然尝试过clean很多次以及update 不确定是否有clean deeper刷新 jar 库 真正奇怪的是 这种情况同时发生在两台机器上 其中一台在没有执行任何特殊操作的情况下恢复了 而另一台仍然没有恢复
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • ELMAH 错误和经典 Asp

    我们已经在我们拥有的 ASP NET MVC 网站上使用 ELMAH 进行错误日志记录 但我们的主网站仍然是经典的 asp 我已经开始为该网站创建错误处理 日志记录结构 但我认为它如果我们能够在所有应用程序中保持错误日志记录的一致性 那就太
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • Scala:将整个列表的 Either 与每个元素的 Either 组合

    我有一个 Either 列表 它代表错误 type ErrorType List String type FailFast A Either ErrorType A import cats syntax either val l List
  • 在 Unix 上,我应该对 errno 使用 system_category 还是 generic_category ?

    C 0x 有两个预定义的error category对象 generic category and system category 据我目前所知 system category 应用于操作系统返回的错误 并且generic category

随机推荐