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语言启动文件替换原本的汇编启动文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-11-28 数组和结构体趣谈