Keil STM32查看堆栈使用量及调用链.htm文件

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等),要查看静态调用图文件,了解程序的栈使用情况,给程序分配合适的栈空间。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Keil STM32是一种基于Cortex-M微控制器的嵌入式系统开发工具,它提供了一种方便快捷的开发方式,可以用来开发各种应用。但是在实际开发中,我们经常要使用许多现成的库来加速开发效率。 在Keil STM32调用库分为两种方式,一种是使用静态库,另一种是使用动态库。如果使用静态库,需要在Keil STM32中将库文件引入到工程中,并在代码中调用对应的函数即可。如果使用动态库,则需要在编译时接相应的库文件,运行时再加载调用。 对于STM32的库函数,Keil提供了许多可靠和高效的解决方案。例如,STMicroelectronics提供了一个非常强大的STM32库,可以方便地进行各种操作。如果使用这个库,则需要将库代码和头文件引入工程。引入代码后,就可以在源代码中使用库函数来完成各种任务,例如:初始化设备,读取检测设备状态等等。 此外,Keil STM32 还提供了其他许多库函数,例如:USB库函数、协议库函数、数字信号处理库函数、驱动库函数等等。开发者可以根据自己的需求选择相应的库函数进行开发。 在使用Keil STM32时,我们最好先查看各种库函数的使用说明,了解函数的输入输出,功能等方面的信息。这有助于我们编写正确的代码和更快地解决问题。 ### 回答2: Keil是一款著名的集成开发环境,常用于嵌入式系统的开发,而STM32则是一种常见的嵌入式芯片。在进行STM32开发时,我们经常需要调用ST官方提供的库函数来完成一些基本的操作,比如GPIO控制、定时器计时等。在Keil中如何调用这些库函数呢? 首先需要在Keil中建立一个新的工程,选择适合自己芯片型号的模板,例如STM32F10x_StdPeriph_Template。然后在工程中添加需要使用的库文件,这些库文件通常是以“lib”结尾的静态库文件。在这里我们以stm32f10x_lib为例,步骤为: 1.在Keil的Project菜单下选择:Options for Target... 2.在弹出的对话框中选择:Library 3.在Target选项中选择正确的芯片类型,例如STMicroelectronics->STM32F10x 4.在中间的Use MicroLIB选项中选择No (use standard library) 5.在右边的Additional libraries中添加所需要的静态库文件,例如stm32f10x_lib.lib 添加完毕后,我们就可以开始在代码中调用库函数了。首先需要在源文件的开头添加相应的头文件,例如: #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" 然后就可以使用库函数了,例如控制一个LED灯闪烁,可以使用以下代码: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); while(1) { GPIO_SetBits(GPIOB, GPIO_Pin_5); Delay(1000); GPIO_ResetBits(GPIOB, GPIO_Pin_5); Delay(1000); } 上述代码实现了控制PB5引脚的GPIO口输出高电平和低电平,从而使一个连接在该引脚上的LED灯不断闪烁。其中的GPIO_InitTypeDef是GPIO初始化结构体,通过修改其中的各项参数来控制GPIO的行为,比如输入/输出、推挽/开漏等。Delay()函数是一个自定义延时函数,可以通过SysTick定时器来实现。 总的来说,Keil调用STM32的库函数并不是很复杂,只需要正确地配置工程和添加相应的库文件,然后按照官方文档中所示的API调用方式来编写代码即可。需要注意的是,不同的芯片型号和库版本之间可能存在差异,因此在编写代码时需要仔细查看对应的库函数文档,以确保正确地调用。 ### 回答3: KeilMDK提供了方便使用的库管理工具,用于管理和调用各种库文件。可以通过以下步骤调用Keil STM32的LIB库: 1. 打开MDK-ARM软件,在Project-Options for Target的C/C++选项中设置Include Paths和Define Symbols。将LIB库的路径添加到Include Paths路径中,并设置Define Symbols的宏定义。 2. 在Project-Options for Target的Linker选项中添加LIB库文件。将LIB库所在文件夹的路径添加到Object/ Library Modules的列表中。 3. 在STM32应用程序中调用LIB库函数。需要包含相应的头文件,然后通过函数名来调用库函数。 例如,如果要调用Keil STM32的LIB库中的GPIO_Init函数,则需要在应用程序中包含stm32f10x_gpio.h头文件,并使用以下代码调用函数: GPIO_Init(GPIOC, GPIO_Pin_0,GPIO_Mode_Out_PP); 以上是使用MDK-ARM软件调用KeilSTM32的LIB库的基本步骤。需要注意的是,在使用Keil STM32的LIB库时,需要仔细查看相关文档,了解库函数的使用方法和限制。同时,在设置Keil STM32的LIB库路径时,也需要注意路径设置的正确性,在编译和调试过程中遇到问题时,需要进行调试和排除错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值