1.考虑栈分配的场景

  • 无论是 裸机 还是 RTOS 都需要用户合理的分配栈空间,如果栈空间分配的小了,可能会出现栈溢出,分配的大了则会产生浪费。
  • 尤其是在使用 RTOS 的场景下,因为每一个 任务 都需要分配独立的栈,所以合理的分配栈空间就显得尤为重要。

2.利用 keil 自带的工具分析栈的使用情况

  • 选中如下选项,编译工具链会自动分析函数的调用关系,并生成对应文档
    在这里插入图片描述

  • 生成的文档和可执行文件在同一目录下
    在这里插入图片描述

  • 文档中有每个函数的调用关系,通常会有如下内容:
    在这里插入图片描述

  • 利用上述信息足够分析出栈的最大使用情况,也可以利用这些信息分析程序结构。

3. 注意点

  • 在使用裸机时(以cortex-m为例),如果没有特别的设置,无论是主程序中还是中断程序通常只使用一个栈,也就是MSP,这时候预估栈的大小是就是 主程序调用链的栈 + 中断程序调用链的栈 + 产生中断或者异常时的硬件或者软件保存上下文的压栈(考虑中断抢占产生的嵌套压栈)
  • 在使用 RTOS(以freertos为例) 中断和主程序使用MSP, 任务使用PSP,MSP的分配主要考虑中断的调用链,主程序的调用链所使用的栈会在调度器开始调度后被回收。每个任务都有独立的栈,任务栈的分配主要考虑 任务函数本身调用链的栈 + 任务切换时保存上下文所用的空间
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐