htm 静态调用图文件
Keil编译成功之后在Output 目录下。
**有一个以工程文件命名的后缀为 .bulid_log.htm 及 .htm 文件 如”Template_F4VE.bulid_log.htm”及”Template_F4VE.htm”,使用浏览器打开。其中 *.build_log.htm 是工程的构建过程日志,而 *.htm 是链接器生成的静态调用图文件。
在静态调用图文件中包含了整个工程各种函数之间互相调用的关系图,而且它还给出了静态占用最深的栈空间数量以及它对应的调用关系链。
该文件说明了:
一、工程静态栈空间最大占用 3264 字节 (Maximum Stack Usage = 3264 bytes + Unknown(Cycles, Untraceable Function Pointers);
二、工程最大的堆栈的调用链,这个占用最深的静态调用“main ⇒ nmea_decode_test ⇒ nmea_parse ⇒ nmea_parser_push ⇒ nmea_parser_real_push ⇒ nmea_parse_GPRMC ⇒ _nmea_parse_time ⇒ nmea_error ⇒ vsnprintf ”。
注意这里给出的空间只是静态的栈使用统计,链接器无法统计动态使用情况,例如链接器无法知道递归函数的递归深度。在本文件的后面还可查询到其它函数的调用情况及其它细节。
利用这些信息,我们可以大致了解工程中应该分配多少空间给栈,有空间余量的情况下,一般会设置比这个静态最深栈使用量大一倍, 在 STM32 中可修改启动文件改变堆栈的大小;如果空间不足,可从该文件中了解到调用深度的信息,然后优化该代码。
STM32 启动文件默认的栈空间大小 0x00000400,即1024 字节。
如果程序默认的栈空间小于工程静态栈空间,在编译过程中可能没有错误,但实际运行的时候可能会不会工作,也可能正常,可能只是因为它使用的栈溢出 RAM 空间恰好没被程序其它部分修改而已。
上文中我的工程最大工程静态栈空间是3264字节,这里我将栈空间改为8kb(0x2000)
所以,在实际的大型工程应用中 (特别是使用了各种外部库时,如 Lwip/emWin/Fatfs等),要查看静态调用图文件,了解程序的栈使用情况,给程序分配合适的栈空间。