我对文件中显示的堆栈大小,缩略图和最大深度有点困惑。这是由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.我可以从哪里获得有关我的问题的知识?
对于这几个问题,我在互联网上找到了关于一个整体的答案,但最终没有得到任何答案。我在哪里以及如何了解这些知识?
谢谢。