news 2026/4/15 7:35:07

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/12 12:16:34

告别手动保存!这款Python图片批量下载神器让你效率翻倍

告别手动保存!这款Python图片批量下载神器让你效率翻倍 【免费下载链接】Image-Downloader 项目地址: https://gitcode.com/gh_mirrors/ima/Image-Downloader 还在为了一张张手动保存网络图片而抓狂吗?🤔 每天花费大量时间在右键另存…

作者头像 李华
网站建设 2026/4/10 19:21:53

零基础学嵌入式:STM32F4 CubeMX下载配置指南

从零开始玩转STM32:CubeMX安装配置全解析,新手也能快速上手 你是不是也曾在网上搜了一堆“STM32CubeMX下载教程”,结果点进去不是链接失效,就是步骤跳得太快、根本跟不上? 别急——今天这篇,专为 零基础…

作者头像 李华
网站建设 2026/4/13 15:03:20

如何用Tiny11Builder轻松打造超轻量Windows 11系统

想要让Windows 11系统运行更流畅、占用空间更小吗?Tiny11Builder正是你需要的终极解决方案!这个强大的PowerShell工具能够自动化构建精简版Windows 11镜像,特别适合老旧电脑或追求极致性能的用户。通过移除不必要的预装应用和冗余组件&#x…

作者头像 李华
网站建设 2026/4/15 5:59:43

5分钟快速上手:screenshot-to-code截图转代码完整部署指南

5分钟快速上手:screenshot-to-code截图转代码完整部署指南 【免费下载链接】screenshot-to-code 上传一张屏幕截图并将其转换为整洁的代码(HTML/Tailwind/React/Vue) 项目地址: https://gitcode.com/GitHub_Trending/sc/screenshot-to-code…

作者头像 李华
网站建设 2026/4/10 4:38:33

【开源神器Open-AutoGLM】:10倍提升大模型研发效率的秘密武器

第一章:Shell脚本的基本语法和命令Shell 脚本是 Linux 和 Unix 系统中自动化任务的核心工具,它通过解释执行一系列命令来完成特定功能。编写 Shell 脚本时,通常以 #!/bin/bash 作为首行,指定脚本使用的解释器。脚本的执行方式 She…

作者头像 李华