如何阅读ARM Linker生成的<static call =“”graph =“”>?

时间:2017-07-29 21:03:20

标签: c debugging compiler-construction arm stm32

我对文件中显示的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。我在哪里可以获得有关我的问题的知识?

对于这几个问题,我在互联网上找到了大约一个整体的答案,但最后什么都没得到。我在哪里以及如何了解这些知识?

感谢。

1 个答案:

答案 0 :(得分:0)

  1. 书籍,文档。或者通过谷歌搜索并在这里询问 我现在无法在信息中心找到the callgraph的非常详细的文档,但我认为:

      

    f_open(Thumb,450字节,堆栈大小608字节,ff.o(i.f_open))

    • Thumb是指令集模式。
    • 450 bytes是函数大小。
    • 608 bytes是可预测的堆栈深度。 无法跟踪中断!
    • ff.o(i.f_open)是链接器放入的对象。
  2. 它会为您提供可以分析的信息报告 ž。最大可预测的堆栈使用量 一个。它显示了调用大多数函数的位置 湾它显示了recursive个函数。这些都很危险 C。它列出了所有功能和符号 即局部符号是非全局符号。基本上是static
    F。我不知道未定义的全局符号是什么。我的项目似乎没有。

  3. 堆是malloc的运行时使用。这是不可预测的,因为malloc的大小可以在其他运行时值上定义。你使用堆吗?

  4. 这是很多的堆栈。这是堆栈的可预测用途。基于函数调用和自动变量。它不会考虑中断。因此,如果您有一个堆栈,则需要手动计算最坏情况的中断路径。 (Cortex M4使用两个堆栈)
    那将是:最大堆栈+在此期间允许的所有中断+故障处理程序。

  5. ARM信息中心提供有关核心和工具链的文档。 根据您的教育程度,您可能也会看到这些科目被教授。