C 嵌入式软件的调用树
有人知道一些工具来为运行在微控制器(Cortex-M3)上的C应用程序创建调用树吗?它可以从源代码(不理想)、目标代码(首选解决方案)或运行时(可接受)生成。我已经看过gprof,但是要让它在嵌入式系统上工作,还缺少很多东西 一个额外的好处是,该工具还提供了最大的堆栈深度C 嵌入式软件的调用树,c,embedded,stack,microcontroller,C,Embedded,Stack,Microcontroller,有人知道一些工具来为运行在微控制器(Cortex-M3)上的C应用程序创建调用树吗?它可以从源代码(不理想)、目标代码(首选解决方案)或运行时(可接受)生成。我已经看过gprof,但是要让它在嵌入式系统上工作,还缺少很多东西 一个额外的好处是,该工具还提供了最大的堆栈深度 更新:解决方案最好是免费的。请查看。只是一个想法。是否可以在虚拟机(如Valgrind)中运行它并获取堆栈样本?从源代码中,您可以使用,即使您尚未使用Doxygen来记录代码。可以对其进行配置,使其包含所有函数和方法,无论它们
更新:解决方案最好是免费的。请查看。只是一个想法。是否可以在虚拟机(如Valgrind)中运行它并获取堆栈样本?从源代码中,您可以使用,即使您尚未使用Doxygen来记录代码。可以对其进行配置,使其包含所有函数和方法,无论它们是否有文档注释。安装AT&T Graphviz后,Doxygen将包括大多数函数和方法的调用和调用图 从目标代码来看,我没有现成的答案。我认为这将高度依赖于目标,因为即使存在调试信息,它也必须解析目标代码以查找调用和其他堆栈用户。在最坏的情况下,这种方法似乎需要有效地模拟目标 在目标硬件上运行时,您的选择将部分取决于存在何种嵌入式操作系统,以及它如何管理每个线程的堆栈 一种常见的方法是将每个堆栈初始化为一个已知值,该值似乎不太可能通常存储在自动变量中。然后,中断处理程序或线程可以检查堆栈并测量近似的高水位线 即使不预先填充堆栈并随后遍历堆栈以查找封装外形,中断也可以只对堆栈指针的当前值(对于每个线程)进行采样,并保留其最大观察范围的记录。这将需要存储每个线程SP的一个副本,而中断处理程序不需要做很多工作来维护信息。当然,它必须访问所有活动线程的保存状态 我不知道有哪种工具能明确做到这一点
如果您碰巧使用的是来自的µC/OS-II作为您的操作系统,您可以看看他们的µC/Probe产品。我自己并没有使用过它,但它声称允许连接的PC近乎实时地观察程序和操作系统状态信息。如果它可以在需要时适用于另一个RTO,我也不会感到惊讶。实现这一点的一个好方法是对作为RVCT一部分的ARM链接器(armlink)(不是免费的)使用
--callgraph
选项
欲知更多详情-
我从其中一条评论中了解到,您正在寻找一个基于gcc的解决方案,但事实并非如此。但是它可能仍然有帮助。源代码调用图没有问题,如上所述,您的编译器或doxygen可以从源代码生成此信息。大多数现代编译器都可以在编译过程中生成调用图 在以前的一个嵌入式项目中,我用一个模式填充堆栈并运行一个任务。检查堆栈破坏我的模式的点。使用模式重新加载堆栈并运行下一个任务。这使您的代码非常简单。。。。但它是免费的。它不是完全准确的,因为所有的数据都在计时,代码在错误处理程序中花费了大量时间
在某些处理器上,您可以获得一个跟踪盒,以便在处理器需要全速运行以进行测试时可以监视代码覆盖率,而不是什么,并且您也可以不使用插入指令的代码。不幸的是,这些类型的工具非常昂贵。看看你有没有钱。这使得所有类型的调试都更容易。我没有使用过这些,但是您知道:
编译器工具可能支持堆栈深度和/或调用树生成。例如,对于Renesas micros,有一个名为.Eclipse with CDT的实用程序具有C/C++索引,并将向您显示一个调用图。据我所知,您不需要在Eclipse中构建索引器,只要确保所有源文件都在项目中即可 它工作得很好
VisualStudio也会这样做(但它不是免费的)。我使用VisualStudio处理嵌入式项目;使用MaFrimeProject,我可以做所有的工作,除了VS IDE中的调试。 < P>我已经在嵌入式开发中已经提出了这种方法,但是如果你真的需要一个调用图,以及堆栈使用信息,所有这些都是免费的,我个人会考虑使用一个开源模拟器来模拟整个事情。通过向仿真器本身添加少量挂钩来检测目标代码以获取此数据 我不熟悉这个特定的目标,但有大量的开源ARM模拟器可用(freshmeat、sourceforge、google),您可能最感兴趣的是与call/ret和push/pop相关的操作码? 比如退房 因此,即使您发现扩展编译器或仿真器来提供这些信息并不简单,也应该可以创建一个简单的脚本来查找入口点、所有调用/ret以及与堆栈使用相关的操作码
当然,关于堆栈使用情况的唯一可靠信息将来自运行时插装,最好是执行所有重要的代码路径。一个非常轻的工具:我的调用树图生成器,在bash中实现,使用cscope和dot 可以生成上游调用方、下游被调用方以及函数之间调用关联的图形。您可以将其设置为以多种方式查看图形,包括xfig、.png查看器、,