2017-07-29 22 views
0

我对文件中显示的堆栈大小,缩略图和最大深度有点困惑。这是由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.我可以从哪里获得有关我的问题的知识?

对于这几个问题,我在互联网上找到了关于一个整体的答案,但最终没有得到任何答案。我在哪里以及如何了解这些知识?

谢谢。

回答

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

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

    • Thumb是指令集模式。
    • 450 bytes是函数大小。
    • 608 bytes是可预测的堆栈深度。 它不能跟随中断!
    • ff.o(i.f_open)是链接器把它的对象。
  2. 它给你的,你可以分析信息的报告。
    z。最大可预测的堆栈使用情况。
    a。它显示你在哪里调用最多的功能。 b。它显示recursive功能。这些可能是危险的。
    c。它列出了所有功能和符号。 e。本地符号是非全局符号。基本上与static。 f。我不知道全局符号是什么。我的项目似乎没有。

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

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

  5. ARM Infocenter提供有关核心和工具链的文档。 根据你的教育情况,你可能也看到了这些科目正在教授。