STM32获取最大堆栈空间

参考

  1. stackflow相关讨论

原理

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

实现

  1. 先实现如下代码:
c 复制代码
// 在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. 如果想要获得最大的栈使用空间,就需要保证所有的代码都被遍历。这种方式只能看到已经运行代码的最大栈使用空间!
相关推荐
日晨难再20 分钟前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian43 分钟前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__2 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou8 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵8 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
PegasusYu11 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi15 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生65615 小时前
输出比较简介
stm32
哔哥哔特商务网15 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式15 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件