我对文件中显示的Stack Size,Thumb和Max Depth有点困惑。这是由ARM Linker生成的。
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
我知道Max Depth是最长调用链所需的堆栈。这意味着,对于这个功能,它所需的堆栈是否与Max Depth完全相等?
如果是这样,那么“堆栈大小”呢?这意味着当前函数本身需要的堆栈大小?
如果是这样,那么'拇指'是什么?是什么意思,'拇指'指令集?
我能说:
Max Depth=Thumb + all Stack Size in the call chain + some other unknown exception
?
2。如何阅读Call Graph文件? 我注意到文件中有几个部分
ž。最大堆栈使用= xxxx字节+未知(循环,不可捕获的功能指针)
一个。最大堆栈深度的调用链
湾相互递归函数
C。功能指针
d。全球符号
即本地符号
F。未定义的全局符号
“本地符号”对.h头文件中未引用的函数的响应是什么?
第3。为什么调用链没有显示函数的堆大小?
4。最大堆栈使用量是否可以指示真正的最大堆栈需要?
例如,我的一个项目,它在静态调用图文件中显示Maximum Stack Usage = 78160 bytes + Unknown(Cycles, Untraceable Function Pointers)
。
但是我在启动文件中设置的堆栈大小是0xDFA0(57248字节,我通过实验发现了这个值),在这个堆栈大小中,我的程序在大多数时候运行良好,在某些情况下它不起作用好。为什么它仍能正常运作?
5。我在哪里可以获得有关我的问题的知识?
对于这几个问题,我在互联网上找到了大约一个整体的答案,但最后什么都没得到。我在哪里以及如何了解这些知识?感谢。
答案 0 :(得分:0)
书籍,文档。或者通过谷歌搜索并在这里询问 我现在无法在信息中心找到the callgraph的非常详细的文档,但我认为:
f_open(Thumb,450字节,堆栈大小608字节,ff.o(i.f_open))
Thumb
是指令集模式。450 bytes
是函数大小。608 bytes
是可预测的堆栈深度。 无法跟踪中断! ff.o(i.f_open)
是链接器放入的对象。它会为您提供可以分析的信息报告
ž。最大可预测的堆栈使用量
一个。它显示了调用大多数函数的位置
湾它显示了recursive个函数。这些都很危险
C。它列出了所有功能和符号
即局部符号是非全局符号。基本上是static
。
F。我不知道未定义的全局符号是什么。我的项目似乎没有。
堆是malloc的运行时使用。这是不可预测的,因为malloc的大小可以在其他运行时值上定义。你使用堆吗?
这是很多的堆栈。这是堆栈的可预测用途。基于函数调用和自动变量。它不会考虑中断。因此,如果您有一个堆栈,则需要手动计算最坏情况的中断路径。 (Cortex M4使用两个堆栈)
那将是:最大堆栈+在此期间允许的所有中断+故障处理程序。
ARM信息中心提供有关核心和工具链的文档。 根据您的教育程度,您可能也会看到这些科目被教授。