Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 嵌入式软件的调用树_C_Embedded_Stack_Microcontroller - Fatal编程技术网

C 嵌入式软件的调用树

C 嵌入式软件的调用树,c,embedded,stack,microcontroller,C,Embedded,Stack,Microcontroller,有人知道一些工具来为运行在微控制器(Cortex-M3)上的C应用程序创建调用树吗?它可以从源代码(不理想)、目标代码(首选解决方案)或运行时(可接受)生成。我已经看过gprof,但是要让它在嵌入式系统上工作,还缺少很多东西 一个额外的好处是,该工具还提供了最大的堆栈深度 更新:解决方案最好是免费的。请查看。只是一个想法。是否可以在虚拟机(如Valgrind)中运行它并获取堆栈样本?从源代码中,您可以使用,即使您尚未使用Doxygen来记录代码。可以对其进行配置,使其包含所有函数和方法,无论它们

有人知道一些工具来为运行在微控制器(Cortex-M3)上的C应用程序创建调用树吗?它可以从源代码(不理想)、目标代码(首选解决方案)或运行时(可接受)生成。我已经看过gprof,但是要让它在嵌入式系统上工作,还缺少很多东西

一个额外的好处是,该工具还提供了最大的堆栈深度


更新:解决方案最好是免费的。

请查看。

只是一个想法。是否可以在虚拟机(如Valgrind)中运行它并获取堆栈样本?

从源代码中,您可以使用,即使您尚未使用Doxygen来记录代码。可以对其进行配置,使其包含所有函数和方法,无论它们是否有文档注释。安装AT&T Graphviz后,Doxygen将包括大多数函数和方法的调用和调用图

从目标代码来看,我没有现成的答案。我认为这将高度依赖于目标,因为即使存在调试信息,它也必须解析目标代码以查找调用和其他堆栈用户。在最坏的情况下,这种方法似乎需要有效地模拟目标

在目标硬件上运行时,您的选择将部分取决于存在何种嵌入式操作系统,以及它如何管理每个线程的堆栈

一种常见的方法是将每个堆栈初始化为一个已知值,该值似乎不太可能通常存储在自动变量中。然后,中断处理程序或线程可以检查堆栈并测量近似的高水位线

即使不预先填充堆栈并随后遍历堆栈以查找封装外形,中断也可以只对堆栈指针的当前值(对于每个线程)进行采样,并保留其最大观察范围的记录。这将需要存储每个线程SP的一个副本,而中断处理程序不需要做很多工作来维护信息。当然,它必须访问所有活动线程的保存状态

我不知道有哪种工具能明确做到这一点


如果您碰巧使用的是来自的µC/OS-II作为您的操作系统,您可以看看他们的µC/Probe产品。我自己并没有使用过它,但它声称允许连接的PC近乎实时地观察程序和操作系统状态信息。如果它可以在需要时适用于另一个RTO,我也不会感到惊讶。

实现这一点的一个好方法是对作为RVCT一部分的ARM链接器(armlink)(不是免费的)使用
--callgraph
选项

欲知更多详情-


我从其中一条评论中了解到,您正在寻找一个基于gcc的解决方案,但事实并非如此。但是它可能仍然有帮助。

源代码调用图没有问题,如上所述,您的编译器或doxygen可以从源代码生成此信息。大多数现代编译器都可以在编译过程中生成调用图

在以前的一个嵌入式项目中,我用一个模式填充堆栈并运行一个任务。检查堆栈破坏我的模式的点。使用模式重新加载堆栈并运行下一个任务。这使您的代码非常简单。。。。但它是免费的。它不是完全准确的,因为所有的数据都在计时,代码在错误处理程序中花费了大量时间


在某些处理器上,您可以获得一个跟踪盒,以便在处理器需要全速运行以进行测试时可以监视代码覆盖率,而不是什么,并且您也可以不使用插入指令的代码。不幸的是,这些类型的工具非常昂贵。看看你有没有钱。这使得所有类型的调试都更容易。

我没有使用过这些,但是您知道:

因为他们分析源代码,所以不计算堆栈深度

注意,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查看器、,