当前位置: 首页 > article >正文

STM32获取最大堆栈空间

参考

  1. stackflow相关讨论

原理

  1. 通过参考链接,可知探测Stack的最大深度是先在stack中填充不常用的特定值,然后实时检测这些值哪些发生了变化,变化的表示使用到了这个空间,如果程序完全遍历后,有些值还是没变,则表示这些空间是没有使用到的。
  2. 本文是针对没有使用RTOS的情况下使用的,即查看的是系统stack空间的使用情况。不过使用RTOS的任务栈也可以通过这种方式确认任务栈的使用情况,但是一般RTOS都已经集成了这个功能,不需要自己实现。

实现

  1. 先实现如下代码:
// 在ARM-MDK中测试了,其他IDE应该也是可以直接用的;
// ARM-MDK 平台需要开启 MicroLib 选项
void stack_fill(void)
{
    #define STACK_SIZE (0x600)
    extern uint32_t __initial_sp;
    uint8_t buf[STACK_SIZE];
    memset(buf, 0x57, STACK_SIZE);
    LOG_DBG("stackTop[%p] bufAddr[%p] stack_area[last] = [%d]\n", &__initial_sp, &buf, buf[STACK_SIZE-1]);
}
  1. 在初始化完成后调用以上函数,编译成功后烧录并进入仿真,通过watch memory实时查看内存数据:
    在这里插入图片描述
  2. 然后全速运行程序,查看还有哪些数据没有被改变,就可以相应调整stack大小了;比如:
    在这里插入图片描述

注意

  1. stack_fill()函数中,需要根据实际需求更改STACK_SIZE的值,要尽可能得填充所有当前剩余的栈空间,但是不能超出剩余的栈空间。可以把这个函数先放在LOG使能后的地方,查看一下__initial_sp栈顶地址是多少,然后根据在startup.s文件中定义的stack size,定义一个合理的STACK_SIZE值;
  2. 如果想要获得最大的栈使用空间,就需要保证所有的代码都被遍历。这种方式只能看到已经运行代码的最大栈使用空间!

http://www.kler.cn/a/137519.html

相关文章:

  • 【linux系统之redis6】redisTemplate的使用方法
  • Android 来电白名单 只允许联系人呼入电话
  • 《Spring Framework实战》4:Spring Framework 文档
  • WPF中RenderTargetBitmap问题解决
  • 概率基本概念 --- 离散型随机变量实例
  • 51单片机——蜂鸣器模块
  • 生成式 AI 落地制造业的关键是什么?亚马逊云科技给出答案
  • MindSpore基础教程:使用 MindCV和 Gradio 创建一个图像分类应用
  • shell脚本之条件语句
  • 鸿蒙系统扫盲(二):再谈鸿蒙是不是安卓套壳?
  • 全志XR806基于http的无线ota功能实验
  • 开发知识点-uniapp微信小程序-开发指南
  • 阿里云3M固定带宽服务器速度快吗?是否够用?
  • 本地私域线上线下 线上和线下的小程序
  • spring面试题合集介绍
  • vivado产生报告阅读分析14-时序报告10
  • RedisConnectionFactory is required已解决!!!!
  • 机器学习第7天:逻辑回归
  • JVM对象创建与内存分配
  • 【漏洞复现】IP-guard WebServer 存在远程命令执行漏洞
  • MySQL InnoDB 引擎底层解析(一)
  • 数据库-索引
  • 传输层协议-TCP协议
  • 键盘快捷键工具Keyboard Maestro mac中文版介绍
  • 【JVM】JVM异常不打印堆栈信息 [ -XX:-OmitStackTraceInFastThrow ]
  • 第十一章 目标检测中的NMS