news 2026/4/18 10:56:24

stm32如何了解栈的使用情况

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
stm32如何了解栈的使用情况

随着项目变得复杂,有时候系统会莫名卡死,原因之一很可能就是栈溢出了。而栈溢出不一定会立刻出问题,所以不容易及时发现。那如何了解栈的使用情况呢?下面就使用嵌入式操作系统和裸机系统分别介绍查看方法。

嵌入式操作系统(FreeRTOS)

这里以FreeRTOS系统为例,它提供了获取栈使用量的函数和栈溢出时的回调函数,直接调用和配置即可。

这个函数会获取task运行过程中栈空间的最小剩余量,这个值越小栈越接近溢出,根据这个值调整栈空间的大小,一般预留20%左右的余量。

FreeRTOS还提供了栈溢出钩子函数,发生栈溢出时调用,它只能做一些善后工作,无法恢复系统,

想要调用钩子函数,还需要在FreeRTOSConfig.h中定义下面的宏

这个宏的值可以是1、2、3(较新的版本才会有3),1检测栈指针是否越界,2检测栈区最后的20字节是否被覆盖,3检测ISR的栈。实测1会直接触发系统的HardFault并调用HardFault_Handler回调函数,2会调用钩子函数,推荐设置成2,3不会调用钩子函数。建议在HardFault回调中也输出信息,

裸机系统

对于裸机系统,可以自己定义函数检测。用特定的字符填充栈区,后面通过这些字符判断栈的使用情况

栈的信息在ld链接文件中定义,ld中的=是设置变量的地址,而不是变量的值,所以引用的时候需要加&。栈指针指向的是栈区已使用的末端地址,而不是未使用的首地址,所以要先减再赋值。

stack_init函数可以在main中最开始调用,不过会破坏进入main的调用栈数据,由于嵌入式系统进入main后一般不会返回,所以不影响程序的运行。如果不想破坏可以把这个函数放到startup文件中的Reset_Handler函数内SystemInit之前,这样完全不会影响后边程序运行的栈区数据。

之后从栈区开始逐个比较栈区数据和填充数据,如果不一样说明这个地址的数据被入栈操作覆盖,这样便可以得出栈的最大使用量。

调用时尽量放到程序执行的末尾,让所有函数都执行一次,这样才能获得较准确的栈最大使用量。

读取sp寄存器可以获得当前栈指针位置,获取当前栈使用情况

标准库的printf有多层函数调用,尤其打印浮点数时,有log打印和没log打印栈的使用情况是不同的,所以有时候栈溢出程序异常时,去掉printf就能正常运行。如果必须输出log,除了调大栈空间,也可以使用其它轻量级的printf库,比如FreeRTOS的printf-stdarg.c,这些库可以一定程度优化栈的使用,不过一般不支持浮点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 17:46:01

快速搭建企业级财务系统:Vue2财务管理平台完整指南

Vue2财务管理平台基于Vue2 Element UI技术栈,为企业提供专业级的预算分析与财务数据可视化解决方案。这套系统通过现代化的前端架构,实现了财务数据的实时监控、预算执行的精准跟踪以及多维度财务分析,帮助企业快速构建高效的财务管理体系。…

作者头像 李华
网站建设 2026/4/16 10:01:20

2025新版QQ音乐解析高效技巧:三步操作快速获取免费音乐资源

2025新版QQ音乐解析高效技巧:三步操作快速获取免费音乐资源 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 想要轻松获取QQ音乐的高品质音频资源?2025年最新版的QQ音乐解析工具让您无需…

作者头像 李华
网站建设 2026/4/18 8:19:47

Open-AutoGLM源码深度剖析:3大核心模块拆解与二次开发建议

第一章:Open-AutoGLM项目背景与架构概览Open-AutoGLM 是一个开源的自动化通用语言模型(General Language Model, GLM)推理优化框架,旨在降低大模型在实际部署中的资源消耗并提升推理效率。该项目由社区驱动开发,聚焦于…

作者头像 李华
网站建设 2026/4/18 8:18:14

anything-llm用户体验反馈汇总:优点与待改进点分析

Anything-LLM用户体验反馈汇总:优点与待改进点分析 在企业知识管理日益智能化的今天,一个核心矛盾正变得越来越突出:大语言模型虽然“见多识广”,却常常对组织内部的具体业务一无所知;而员工每天面对堆积如山的文档、制…

作者头像 李华
网站建设 2026/4/17 17:57:03

工程设计领域:多软件协同调度的依赖冲突破解术

工程设计领域:多软件协同调度的依赖冲突破解术在工程设计领域,项目复杂度的提升和协作方式的多样化,多软件协同调度已成为常态。依赖冲突破解术却成为了许多工程师在实际操作中绕不开的一个技术难点。是在项目涉及多个设计软件、模型数据互通…

作者头像 李华
网站建设 2026/4/18 10:50:47

孤能子视角:“伪数据“及用户端智能体“数据投毒“

我的问题:1.我们分析一下AI的"伪数据"。2.我们说用户端智能体的"伪数据",它是用户有意生产的情形。智能体用户协议,往往包含用户交互数据也作为训练数据。智能体的概率选择,新事物新说法有天然优势。手机端智能体深度&qu…

作者头像 李华