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

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(使用前将#替换为@)

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

  • 有人有关于 C 语言设计和错误跟踪/控制系统的好指南吗?

    我是 C 开发的软件工程方面的新手 有没有人有关于如何为 C 项目 尤其是嵌入式 设计错误跟踪或错误控制系统的良好指南 谈论 C 库的错误跟踪也会有帮助 根据我的经验 这里的策略分为几个阵营 全局变量ala的使用errno http www
  • 如何在 shell 函数中获得“set -e”的效果和用处?

    set e 或以 bin sh e 对于出现问题时自动轰炸非常有用 它使我不必对每个可能失败的命令进行错误检查 如何在函数内获得与此等效的内容 例如 我有以下脚本 该脚本在出现错误时立即退出 并显示错误退出状态 bin sh e echo
  • javascript 唯一的随机数

    experts 我希望在两个数字之间生成唯一的随机数 来自网页的文本框 我正在使用数组来存储数字 当用户单击按钮时 它给出第一个随机数 将其存储在数组中 当用户再次单击按钮时 它生成随机数 将其与数组数字进行比较 如果不同 则存储并显示 如
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • C 中的可移植函数(无汇编)返回其堆栈帧的大小

    用 C 编写一个可移植函数 无需汇编 返回其堆栈帧的大小 int stackframe size 尝试如下解决 该函数在使用 VS 2010 编译时返回 228 字节 有没有办法验证其正确性 int stackframe size int
  • PowerShell Try、Catch、自定义终止错误消息

    有没有办法自定义终止错误的错误消息 在下面的例子中我只想得到一个Try部分并将所有错误收集在一个中Catch通过组合两个脚本块来部分 我的问题是 error产生于Import csv描述性不够 我想要文字Failed CSV File im
  • u-boot:搬迁

    这是一个与u boot相关的基本问题 为什么 u boot 代码会自行重新定位 好吧 如果 u boot 是从 NOR flash 或启动 ROM 空间执行 那么这是有道理的 但如果它已经从 SDRAM 运行 为什么它必须再次重新定位自己呢
  • 如何在 netsuite 中使用 suitescript 2.0 显示自定义错误消息而不使用堆栈跟踪

    我想使用 suitescript 2 0 版本向用户显示没有堆栈跟踪的自定义错误消息 在工作流程中 自定义错误消息在没有堆栈跟踪的情况下显示 但在套件脚本中 错误消息 与堆栈跟踪一起显示 堆栈跟踪错误 type error SuiteScr
  • 在 F# 中“合并”受歧视的联合?

    继从这个问题 https stackoverflow com questions 53506325 result vs raise in f async 我在组合不同类型时遇到问题Result类型在一起 以下是一个人为的示例 不是真实的代码
  • PHP 警告:模块“imagick”已在第 0 行未知加载

    我有一个简单的测试文件 其中唯一的 php 代码是 if isset REQUEST back back back REQUEST back filename images back jpg file file exists filenam
  • Compact Framework 3.5 上的 System.Data.SQLite 问题

    我在我的紧凑框架应用程序中使用 sqlite 来记录系统中的事件 我也在使用系统 数据 SQLite http sqlite phxsoftware com 该事件具有描述其发生时间的时间戳 我将此时间戳记作为刻度存储在我的表中 除此列外
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • exit() 和 abort() 有什么区别?

    在C和C 中 有什么区别exit and abort 我试图在发生错误 不是例外 后结束我的程序 abort http en cppreference com w c program abort退出程序而不调用使用注册的函数atexit h
  • 工作站和嵌入式程序员之间的心态差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • 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
  • 当我尝试从列表中删除元素时,如何忽略 ValueError?

    如果我打电话 如何忽略 不在列表中 错误消息a remove x when x不在列表中a 这是我的情况 gt gt gt a range 10 gt gt gt a 0 1 2 3 4 5 6 7 8 9 gt gt gt a remov
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互

随机推荐