• 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 在初始化完成后调用以上函数,编译成功后烧录并进入仿真,通过watch memory实时查看内存数据:
      在这里插入图片描述
    2. 然后全速运行程序,查看还有哪些数据没有被改变,就可以相应调整stack大小了;比如:
      在这里插入图片描述

    注意

    1. stack_fill()函数中,需要根据实际需求更改STACK_SIZE的值,要尽可能得填充所有当前剩余的栈空间,但是不能超出剩余的栈空间。可以把这个函数先放在LOG使能后的地方,查看一下__initial_sp栈顶地址是多少,然后根据在startup.s文件中定义的stack size,定义一个合理的STACK_SIZE值;
    2. 如果想要获得最大的栈使用空间,就需要保证所有的代码都被遍历。这种方式只能看到已经运行代码的最大栈使用空间!
  • 相关阅读:
    智能时代的高效协作工具-TeamLinker,让团队像局域网一样工作
    使用代理IP常见问题及解答
    95后工程师上班哼小曲?那些愉快上班的打工人,到底怎么做到的?
    layui增删改查
    数据仓库之BI
    Onnxruntime之tensorrt加速
    git merging两边都被删除的文件
    java mysql体检管理系统源码
    Python练习题:实现除自身以外元素的乘积
    网络编程 版本校验
  • 原文地址:https://blog.csdn.net/qq_29506411/article/details/134514426