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语言启动文件替换原本的汇编启动文件。