随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

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   杰瑞鼠  阅读(279)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2018-11-28 数组和结构体趣谈
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示