如何确定嵌入式系统中的最大堆栈使用率?

2023-11-24

当我给Keil编译器“--callgraph”选项时, 它为我静态计算准确的“最大堆栈使用量”。

唉,今天它给了我一条“最大堆栈使用量 = 284 字节 + 未知(没有堆栈大小的函数...)”消息,以及“没有堆栈信息的函数”列表。

Nigel Jones 表示递归在嵌入式系统中是一个非常糟糕的主意 (“计算你的堆栈大小”2009), 所以我一直很小心,不要在这段代码中创建任何相互递归的函数。

另外,我确保我的中断处理程序在最终从中断返回指令之前不会重新启用中断,因此我不需要担心可重入中断处理程序。

如果没有递归或可重入中断处理程序,它应该能够静态确定最大堆栈使用量。 (所以大多数答案如何确定最大堆栈使用量?请勿应用)。 我的理解是处理“--callgraph”选项的软件 首先找到每个中断处理程序在没有被更高优先级中断打断时的最大堆栈深度,以及 main() 函数在没有被中断时的最大堆栈深度。 然后将它们全部加起来以找到总的(最坏情况)最大堆栈深度。 当 main() 后台任务被最低优先级中断打断时,它处于最大深度,而当它被下一个最低优先级中断打断时,该中断也处于最大深度,等等。

我怀疑处理 --callgraph 的软件对“没有堆栈信息的函数”列表中的小型汇编语言函数感到困惑。 这--callgraph 文档似乎暗示我需要手动计算(或保守估计)它们使用了多少堆栈——它们非常短,所以这应该很简单——然后“在汇编语言代码中使用框架指令来描述你的代码使用堆栈。” 其中之一是初始启动代码,在跳转到 main() 之前将堆栈重置为零——因此,实际上,这消耗了零堆栈。 另一个是“故障”中断处理程序,它会锁定在无限循环中,直到我重新启动电源为止——可以安全地假设这会消耗零堆栈。

我正在使用 Keil uVision V4.20.03.0 编译 LM3S1968 ARM Cortex-M3 的代码。

那么我如何使用“帧指令”来告诉处理“--callgraph”的软件这些函数使用了多少堆栈? 或者是否有更好的方法来确定最大堆栈使用量?

(See 如何使用 gcc 确定嵌入式系统中的最大堆栈使用量?对于针对 gcc 编译器的几乎相同的问题。)


在链接器选项中使用 --info=stack。然后,映射文件将包含具有外部链接的所有函数的堆栈使用情况。

在单任务环境中,main() 的堆栈使用情况将为您提供总需求。如果您使用的是 RTOS(例如 RTX),其中每个任务都有自己的堆栈,那么您需要查看所有任务入口点的堆栈使用情况,然后为任务上下文添加更多内容(在 RTX 的情况下为 64 字节)贮存。

描述了适用于 Keil 和更普遍的这种技术和其他技术here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确定嵌入式系统中的最大堆栈使用率? 的相关文章

  • .NET 3.5 处置注册表项

    我有以下代码 RegistryKey installKey Registry LocalMachine OpenSubKey installKey 我正在我的代码上运行静态分析工具 它给了我一个缺陷 说我从方法中返回而没有处理安装密钥 我知
  • 如何查找 C++ 中的内存泄漏

    在嵌入式环境中检测 C 内存泄漏的好方法是什么 我尝试重载 new 运算符来记录每个数据分配 但我一定做错了什么 这种方法不起作用 还有其他人遇到过类似的情况吗 这是 new 和 delete 运算符重载的代码 EDIT 完全披露 我正在寻
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 如何停止优化器丢弃未使用的变量?

    我想调试我的代码 但无法访问进程中的内部层 因为这会干扰与硬件的通信 在监视列表会干扰基本读取访问的情况下执行易失性操作 因此 我正在测试接口的返回值 但 IAR 编译器甚至会优化未使用的易失性变量 和这样的声明 i object foo
  • 有人有关于 C 语言设计和错误跟踪/控制系统的好指南吗?

    我是 C 开发的软件工程方面的新手 有没有人有关于如何为 C 项目 尤其是嵌入式 设计错误跟踪或错误控制系统的良好指南 谈论 C 库的错误跟踪也会有帮助 根据我的经验 这里的策略分为几个阵营 全局变量ala的使用errno http www
  • C 相同结构不同尺寸

    我的问题与此相关 c 在struct中定义不同大小的数组 https stackoverflow com questions 17956697 c define arrays in struct with different sizes 但
  • Node.js |如何通过串口向设备发送和接收一个字节?

    我正在尝试编写使用以下方法的 Node js 脚本serialport https serialport io 用于读取和写入数据的 npm 包COM5串行端口 使用 RS 232 电缆连接到设备 该设备会自动传输其拥有的数据 要检索设备内
  • 创建 32 位计数器时出现全局变量问题

    我正在尝试做正交解码 using 爱特梅尔 Xmega AVR微控制器 Xmega只有16 bit柜台 另外 我已经用完了所有可用的计时器 现在要做32 bit柜台我用过一个16 bit柜台并在其over under flow interr
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • CC2538 的 Contiki UDP 数据包传输持续时间

    有人可以解释一下 Contiki OS 传输 UDP 数据包时发生了什么吗 以下是我的设备使用 CC2538 芯片运行时的详细电流消耗 我的问题是 既然理论上在 250kbps 下 408 位长度的数据包应该在大约 2ms 内传输 为什么要
  • 如何在 PHP 中进行静态代码分析? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有PHP源文件的静态分析工具 二进制文件本身可以检查语法错误 但我正在寻找功能更多的东西 例如 未使用的变量赋值 未先初始化就分配到的
  • 用于嵌入式系统的简约人类可读序列化格式解析器

    By 人类可读的序列化格式 I mean YAML JSON INI或喜欢 请注意 XML对于我的目的来说太冗长而且太不方便 所以让我们把它作为最后的手段 格式应将数据存储为 命名键 值 配对并允许嵌套和数组 不过 缺少数组并不重要 此外
  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • 在 Roslyn 分析器中检查表达式类型的正确方法?

    我正在用 Roslyn 编写一个代码分析器 我需要检查是否ExpressionSyntax属于类型Task or Task
  • 是否“static/extern uint8_t array[2] = {0};”符合ANSI C规范吗?

    我对以下代码有疑问 include all needed h static uint8 t array 2 0 void main void 是否允许按上述方式初始化 模块 全局数组 以便在符合 ANSI C 的情况下将每个成员设置为零 我
  • 如何找到可能直接或间接调用给定方法的所有单元测试? (。网)

    如何找到可能直接或间接调用给定方法的所有单元测试 当我改变方法时 我希望知道要运行的最佳测试 必须有一个工具可以做到这一点 由于我们有很多接口 所以我对所有在实现接口的类上至少有一个路径 var 植入方法时调用接口上的方法的单元测试感兴趣
  • 编译期间移动后检测使用情况?

    clang tidy 静态分析器检测移动后变量的使用 class a class std unique ptr
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un

随机推荐

  • android listview快速滚动自定义问题

    这是我的列表视图
  • 如何在jetpack compose中突出显示文本中的特定单词?

    我想知道如何在 jetpack compose 中突出显示文本的特定部分 我试过Html fromHtml 像这样 Text text Html fromHtml font color red Hello font World toStri
  • 使用 let 在 Google Sheet 脚本编辑器上声明变量

    当我尝试使用初始化变量时let我收到此错误提示 Missing 在声明之前 如何使用声明变量let在 Google Sheet 脚本编辑器上 let从 ECMAScript 2015 ES6 添加 但不幸的是 Google Apps 脚本尚
  • 为什么 printf 将 8 位字符填充为 32 位?

    char byte 0xff printf lu n sizeof byte Output is 1 printf x n byte Output is ffffffff 如果尺寸为byte只有一个字节 那为什么printf 表现得好像它是
  • 计算Python数组中每5个元素的总和

    我有一个 python 数组 我想计算其中每 5 个元素的总和 就我而言 我有数组c有十个元素 实际上它还有更多的元素 c 1 0 0 0 0 2 0 0 0 0 所以最后我想要一个新的数组 c new 应显示前 5 个元素和后 5 个元素
  • 在 bash 中重定向 C 程序输出时出现问题

    我用 C 编写了一个程序 使用 printf 将消息发送到标准输出 但在将输出重定向到文件 从 bash 运行 时遇到问题 我试过了 program argument gt gt program out program argument g
  • 磁盘已满时删除文件的 Shell 脚本

    如果缓存目录变得太大 我正在编写一个小脚本 每天通过 CRON 清理 Linux 上的空间 由于我对 bash 脚本编写非常陌生 因此我需要 Linux 专家的一些帮助 这是基本上的逻辑 伪代码 if Drive Space Left lt
  • 如何在 C# 中更改 Windows 窗体上 Groupbox 的边框粗细?

    我没有找到任何解决方案可以帮助我解决有关 SO 的旧问题 是否可以通过更改颜色使它们更厚或更明显 如果是的话 一些代码会很棒 或者只是提示如何做到这一点 您需要进行定制GroupBox控制 看The Grouper 自定义 Groupbox
  • WPF 按钮相同/推荐宽度

    假设您有一个带有多个按钮的窗口 例如确定 取消或是 否 取消 所有按钮的宽度必须相同 显然 这可以通过猜测一个数字并将它们全部硬连接到该数字来完成 有没有更好的方法来做到这一点 一种会考虑首选 推荐尺寸的方法 确定 按钮应该有多宽 这不是一
  • 在Android模拟器中使用相机

    我希望使用网络摄像头在 Android 模拟器中模拟摄像头 基本上我只需要用模拟器中的相机拍照 不需要实时预览 即如果它使它更容易 我按照教程进行操作here这是我能找到的唯一一个接近我的要求的 但是该教程中使用的许多库 如 android
  • 如何计算猫鼬中具有一个不同字段的记录?

    在探索 Nodejs 的 mongoose 时 我遇到了需要知道我的集合中用户数量的问题 我的收藏有记录 每条记录都有一个用户 我想知道独特 不同 用户的数量 我怎样才能用猫鼬做到这一点 EDIT 数据库增长得非常快 是否有办法从数据库中获
  • Django ImageField 将可调用对象传递给 upload_to

    我正在尝试将自定义 upload to 函数传递给我的模型 imageField 但我想将该函数定义为模型函数 这可能吗 class MyModel models Model image models ImageField upload t
  • gganimate 绘图,其中点保留而线淡出

    这是一个可重现的静态图示例 我想要为其制作动画 我想展示 MCMC 采样器的行为方式 library tidyverse library gganimate set seed 1234 plot data lt tibble x cumsu
  • 更改 PDF 文件的文本和背景颜色

    我想以编程方式更改 PDF 文档中的背景颜色和文本颜色 以便它们在晚上更适合阅读 有点像在 Adob e Reader 中 编辑 gt 首选项 gt 辅助功能 gt 替换文档颜色 有没有好的 Windows 命令行工具或 API 可以做到这
  • 如何以编程方式绑定到静态属性?

    如何以编程方式绑定到静态属性 我可以用 C 来制作什么 Binding Source x Static local MyClass StaticProperty Update 是否可以进行 OneWayToSource 绑定 我知道 Two
  • d3 v4 geo绘制倒置边界

    当我在 SVG 元素中绘制百慕大三角形时 比例不是我所期望的 三角形应该延伸到框的边缘 并且填充是向后的 不是绘制三角形 而是绘制一个切掉三角形的正方形 var geojson features type Feature propertie
  • 在选定选项更改时显示和隐藏 html 元素

    在 JSP 页面中 我有一个下拉列表 当选择列表的第一个元素时 我希望在单击时显示一个文本区域 我是 Javascript Jquery 的新手 所以我显然在函数中遗漏了一些东西 文本区域从未显示 希望有人能帮忙 这是 HTML tr cl
  • 模型上的猫鼬 findOne 是否返回承诺?

    我有一个简单的 Node 模块 它导出一个进行数据库查询的函数 问题是该函数在数据库查询完成之前返回 use strict var mongoose require mongoose Model require entities user
  • 安装的python3.9在linux中不显示

    我按照此中的步骤安装了 python 3 9link sudo apt update sudo apt install python3 9 python3 9 sudo update alternatives install usr bin
  • 如何确定嵌入式系统中的最大堆栈使用率?

    当我给Keil编译器 callgraph 选项时 它为我静态计算准确的 最大堆栈使用量 唉 今天它给了我一条 最大堆栈使用量 284 字节 未知 没有堆栈大小的函数 消息 以及 没有堆栈信息的函数 列表 Nigel Jones 表示递归在嵌