news 2026/6/13 19:15:11

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/6/10 1:50:53

Editor.md:打造高效在线Markdown编辑体验

Editor.md:打造高效在线Markdown编辑体验 【免费下载链接】editor.md The open source embeddable online markdown editor (component). 项目地址: https://gitcode.com/gh_mirrors/ed/editor.md 在当今内容创作和技术文档编写中,Markdown已经成…

作者头像 李华
网站建设 2026/6/6 13:19:47

Windows安卓应用安装器终极指南:一键实现跨平台应用体验

Windows安卓应用安装器终极指南:一键实现跨平台应用体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为在Windows电脑上无法直接安装安卓应用而烦恼…

作者头像 李华
网站建设 2026/6/13 18:34:31

抖音评论数据分析神器:三步搞定海量用户反馈收集

抖音评论数据分析神器:三步搞定海量用户反馈收集 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 还在为分析抖音视频评论而烦恼吗?这款工具将彻底改变你的数据采集方式。无论你是内容…

作者头像 李华
网站建设 2026/6/12 18:08:54

m3u8下载器:5分钟掌握流媒体视频下载的完整指南

m3u8下载器:5分钟掌握流媒体视频下载的完整指南 【免费下载链接】m3u8-downloader m3u8 视频在线提取工具 流媒体下载 m3u8下载 桌面客户端 windows mac 项目地址: https://gitcode.com/gh_mirrors/m3u8/m3u8-downloader 还在为无法保存在线视频而烦恼&#…

作者头像 李华
网站建设 2026/6/7 18:24:17

精准把控外协环节,进销存软件让生产更顺畅

在制造业的生产链条中,工序外协早已成为企业整合资源、缓解产能压力的重要选择。无论是面对订单激增时的产能缺口,还是特殊工艺的技术壁垒,将部分工序委托给专业外协厂商,都能帮助企业降低运营成本、提升生产灵活性。但随之而来的…

作者头像 李华
网站建设 2026/6/13 18:11:45

VMware macOS解锁工具2025最新安装教程:从痛点分析到完美解决方案

VMware macOS解锁工具2025最新安装教程:从痛点分析到完美解决方案 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unlo/unlocker 想在Windows或Linux系统上体验macOS的魅力吗?VMware macOS Unlocker正是您需要的终极解决方…

作者头像 李华