如何阅读由ARM链接器生成的<静态调用图>?
我对文件中显示的堆栈大小,缩略图和最大深度有点困惑。这是由ARM链接器生成的。如何阅读由ARM链接器生成的<静态调用图>?
1.我在哪里可以找到这些信息,这几个字究竟意味着什么?
例如:
f_open (Thumb, 450 bytes, Stack size 608 bytes, ff.o(i.f_open))
[Stack]
Max Depth = 840
Call Chain = f_open ⇒ dir_register ⇒ dir_find ⇒ dir_next ⇒ create_chain ⇒ put_fat ⇒ move_window ⇒ sync_window ⇒ disk_write
[Calls]
>> get_fattime
>> st_clust
>> remove_chain
>> move_window
>> ld_clust
>> inc_lock
>> follow_path
>> find_volume
>> enq_lock
>> dir_register
>> chk_lock
我所知道的最大深度是需要的最长调用链的堆栈。这是否意味着,对于这个功能,它所需要的堆栈恰好等于最大深度?
如果是这样,那么'堆栈大小'呢?这是否意味着当前函数本身的堆栈大小需要?
如果是这样,什么是'拇指'?这是否意味着'Thumb'指令集?
我可以说: Max Depth=Thumb + all Stack Size in the call chain + some other unknown exception
?
2.如何读取Call Graph文件? 我注意到,文件中有几个部分
z。最大堆栈使用率= xxxx字节+未知(周期,不可追踪功能指针)
a。调用链最大堆栈深度
b。相互递归函数
c。功能指针
d。全球符号
e。局部符号
f。未定义的全局符号
是对“.h”头文件中未引用的函数的“本地符号”响应吗?
3.为什么调用链不显示函数的堆大小?
4.最大堆栈使用情况是否表明需要真正的最大堆栈?
例如,我的项目之一,它显示在静态调用图文件中的Maximum Stack Usage = 78160 bytes + Unknown(Cycles, Untraceable Function Pointers)
。
但是我在启动文件中设置的堆栈大小是0xDFA0(57248字节,我通过实验发现了这个值),在这个堆栈大小中,我的程序在大多数时间运行良好,并且在某些情况下它没有工作得很好。为什么它仍然可以正常工作?
5.我可以从哪里获得有关我的问题的知识?
对于这几个问题,我在互联网上找到了关于一个整体的答案,但最终没有得到任何答案。我在哪里以及如何了解这些知识?
谢谢。
-
书籍,文档。或者通过Google搜索并在这里询问。
我现在无法找到在信息中心the callgraph非常详细的文档,但我认为:f_open(拇指,450个字节,堆栈大小608个字节,ff.o(i.f_open))
-
Thumb
是指令集模式。 -
450 bytes
是函数大小。 -
608 bytes
是可预测的堆栈深度。 它不能跟随中断! -
ff.o(i.f_open)
是链接器把它的对象。
-
它给你的,你可以分析信息的报告。
z。最大可预测的堆栈使用情况。
a。它显示你在哪里调用最多的功能。 b。它显示recursive功能。这些可能是危险的。
c。它列出了所有功能和符号。 e。本地符号是非全局符号。基本上与static
。 f。我不知道全局符号是什么。我的项目似乎没有。堆是运行时使用的malloc。这是不可预测的,因为malloc的大小可以在其他运行时值上定义。你用堆吗?
那就是很多的堆栈。这是可预测的堆栈使用。基于函数调用和自动变量。它不考虑中断。所以你需要手动计算最坏情况下的中断路径,如果你有一个堆栈。 (Cortex M4使用两个堆栈)
这将是:最大堆栈+在此期间所有允许的中断+故障处理程序。ARM Infocenter提供有关核心和工具链的文档。 根据你的教育情况,你可能也看到了这些科目正在教授。