ARM-KEIL的堆栈模型

《这么好用?!99%开发者从未听说过的堆栈模型(加量增强版)》

堆,栈,arm的堆和栈增长方向:堆是用于动态分配,栈是用于上下文切换(譬如函数调用,线程调用)参数,返回值,局部变量的包含。Cortex-M系统栈的生长方向是自上而下(从地址值较大的位置向地址值较小的位置移动)。

二 堆栈的3种模型及优缺点:

  • 大聪明型:对向生长造成相互侵入埋入隐患
  • 两段式+水印金丝雀:堆栈中间用oxdeadbeef进行填充并检查
  • 两面包夹芝士:背向生长避免相互伤害;static侵入IRAM触发hardfault被主动检查出来;通过链接脚本主动将剩于空间都分配给Heap空间(通过scat链接脚步对汇编启动文件和链接脚步进行修改)。

   修改链接脚步时需注意:

     1 手抖勾选了“Use Memory Layout from Target Dialog”,它的内容就会立即被覆盖掉;所以要将另外改名并拷贝到非默认空间并加载。

           2 可以用宏头将栈大小,堆大小做成Linker_cfg.h进行工程包含配置。链接文件中调用宏以变量形式进行配置。说明在进行分配前Stack和Heap都以ZI的形式存在。

          3 随着ram的使用,最终heap的高地址可能超范围所以要根据芯片大小进行限制。

          4为随时随地的了解栈的最大使用可编写函数用printf进行打印,即用水印法(2种算法)是实现“最大栈用量统计”

          5 随着Arm Compiler 6的逐步普及,更多的芯片公司正在追随Arm的脚步 用CMSIS 目录下所提倡的纯C语言启动文件替换原本的汇编启动文件。

 

 

 

 

 

posted on 2022-11-28 23:04  杰瑞鼠  阅读(254)  评论(0编辑  收藏  举报