Cortex-M3 SoC芯片的主栈指针

david 2022-01-24 09:00:14 1748

以Cortex-M3 SoC芯片的hello_world仿真为例子:

keil编译后:

放大看:

Program Size: Code=664 RO-data=224 RW-data=8 ZI-data=864

  • ① Code为代码,本质上就是一大堆ARM指令;
  • ② RO DATA为只读的数据,

    例如,

    char *name= "TOM";TOM三个字符就存在ROM中作为RO-DATA;

    char cmd[]= "AT"; AT两个字符会在RAM和FLASH中各有一份。

    有些常量会在RO区中,例如立即数,会直接被编译在code区中。

  • ③ RW DATA为非0初始化的全局和静态变量占用的RAM大小.

    注意:同时还要占用等量的ROM大小用于存放这些非0变量的初值;

  • ④ ZI DATA(zero initialize)为0初始化的内存区的大小(该区域3个用途:0初始化的全局和静态变量+堆区+栈区)。

简单的说,程序运行时,芯片FLASH占用的空间为:Code + RO Data + RW Data,芯片RAM 占用的空间为:RW Data + ZI Data;打开hex文件,看一下前四个字节0x2000_0368。

很惊喜,hex文件的前4个字节为主堆栈指针MSP的初值。

主堆栈指针大小:

0x2000_0368 - 0x2000_0000(SRAM起始地址)

= 0x368(十进制872),

刚好是 RW-data(8) + ZI-data(864) = 872 的大小。 这就解释了MSP主堆栈指针是怎么产生的疑惑了。同时,也证明了RAM的大小确实=RW+ZI的大小。

理论上初始化时给堆栈指针赋值为RAM的最高地址即可,如下图,初始化时给堆栈指针赋值0x2000_0000 + 0x10000 = 0x2001_0000;但是用keil编译时,keil并不是按RAM的最高地址生成的HEX前4字节(也即MSP的初值),而是按照:

全局和静态变量的容量+Heap_Size+Stack_Size三者之和,作为HEX文件的前4字节。

通常还是把0x10000+0x2000_0000(RAM起始地址)作为MSP的初值更好,但keil不是这么做的,keil仅把这个值用作编译检测:检查全局和局部静态变量(含0初始化和非0初始化两部分)所占的空间+堆区+栈区,它们所占空间之和是否超过了上图红框里0x10000值,如果超了就编译报错。

Heap Size:keil编译时,会把C库函数支持的malloc、free所需的内存指向heap内存区,当我们不断的malloc吃内存堆时,malloc函数会检测程序已吃掉的内存堆是否超过了Heap_Size,超了的话就会返回NULL。如果我们不打算使用C库提供的动态内存分配,而打算使用自己写的内存堆管理程序,甚至干脆不打算使用动态内配功能,这些情况下,没有用到标准库的malloc,直接设置heap size为0即可。参考链接:https://blog.csdn.net/qq\_31073871/article/details/102569983

感谢阅读文章,如果文章有用,麻烦点个“在看”或转发分享。

转载:全栈芯片工程师

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
david
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
david
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区