cortex m3 R13堆栈指针

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

「MCU」Cortex-M3 SoC的主栈指针

我们先以keil编译结果为例说明,gcc的编译另文讲。

「MCU」Cortex-M3 SoC的主栈指针

放大看:

Program Size:

Code=664

RO-data=224

RW-data=8

ZI-data=864

「MCU」Cortex-M3 SoC的主栈指针

  • ① Code为一堆ARM指令代码,存放在eflash;
  • ② RO DATA为只读数据;
  • ③ RW DATA为非0初始化的全局和静态变量,需从flash搬运到sram;
  • ④ ZI DATA(zero initialize)为0初始化的内存区的大小(包含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的大小。

「MCU」Cortex-M3 SoC的主栈指针

理论上初始化时给堆栈指针赋值为RAM的最高地址即可,如下图,初始化时给堆栈指针赋值0x2000_0000 + 0x10000 = 0x2001_0000;

但是用keil编译时,keil并不是按RAM的最高地址生成的HEX前4字节(也即MSP的初值),而是按照:

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

「MCU」Cortex-M3 SoC的主栈指针

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

「MCU」Cortex-M3 SoC的主栈指针

「MCU」Cortex-M3 SoC的主栈指针

Heap Size:

keil编译时,会把C库函数支持的malloc、free所需的内存指向heap内存区,当我们不断的malloc吃内存堆时,malloc函数会检测程序已吃掉的内存堆是否超过了Heap_Size,超了的话就会返回NULL。

如果我们不打算使用C库提供的动态内存分配,而打算使用自己写的内存堆管理程序,甚至干脆不打算使用动态内配功能,这些情况下,没有用到标准库的malloc,直接设置heap size为0即可。

补充一下,还有个重要问题,中断向量表中的向量值是多少呢?怎么指向中断服务函数的入口地址呢?

比如复位中断服务函数:Reset_Handler,这个函数的命名不能是随意的,中断服务函数的命名必须和xx_start.s里面对应的向量名相同,这样cpu才能从向量表中查找到对应中断的中断服务函数的入口地址,也就是说,从向量表中对应中断位置读出的向量值就是PC值,CPU从该PC值地址去取中断服务函数指令。

还有一点,xx_start.s里面对应的向量名后面都有个WEAK,也就是各中断服务函数都可以被软件人员开发的中断服务函数自动覆盖。

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 9月 22日 下午12:03
下一篇 2023年 9月 22日 下午12:09

相关推荐

  • 四月一日大事件

    主角打败了异次元之神。 却发现实际上异次元之神背后竟然还有什么东西,他意识到之前看到的那些不可思议的事情并不是异次元之神造成的,那是一个不能见,不能说的存在。 他渐渐失去了自己的意…

    综合百科 2022年 11月 24日
  • 荆棘的后花园,阳光的荆棘花园

    街的拐角处有一片花园。 花园外面围了一圈矮墙,矮墙的高度只到大人的胸口,小孩子却怎么踮脚都够不着。 真想看看里面是什么样子啊。小孩子想。 大概种了成片的向日葵,葵花籽已经熟透饱满。…

    综合百科 2023年 5月 13日
  • 白居易的王莽谦恭未篡时(白居易王莽篡汉)

    王莽谦恭未篡时 王莽篡汉指的是西汉末年王莽篡夺汉朝政权建立新朝的历史事件。 西汉自汉武帝以后,皆以外戚辅政,汉元帝皇后王政君,六十余年为天下母,辅佐了四个皇帝。外戚王莽以姑母王政君…

    2023年 2月 20日
  • 恶贯满盈十恶不赦

    女人付出身体,自寻死路 ——读严歌苓《天浴》有感 作者:梁爱琴 严歌苓,一个极其优雅的女性,她的写作总是直抵人心,她从不避讳美,也不回避丑,她把人性的至美至丑、至善至恶都写得淋漓尽…

    综合百科 2022年 12月 11日
  • 高纯度三氧化二铝,氧化铝熔点高硬度大是什么原因

    目 录 “三高”氧化铝,完成进口替代 纸艺魔术师,纸艺的空间艺术 点石成金,降解“塑料”的炼金术 本期看点: “三高”产品打破国际垄断,氧化铝如何让铁锤望“铝”兴叹?纸艺空间魔术师…

    2023年 5月 15日
  • 山东最值得去的海滨小镇(山东什么海边小城市值得去旅游)

    这里是刘小顺的旅行和生活研究所。 位于我国华东地区的山东省是一个经济非常发达的省份,GDP总量在我国各个省级行政区都一直排名前列,备受大家关注。 而且,山东省自然风光优美、人文底蕴…

    2023年 9月 2日
  • 安徽这所“土里土气”的院校,更名后变得很“洋气”,容易入坑

    上个世纪八九十年代,中国高校掀起了一股改名热潮,并延续至今。据相关数据统计,从2008年-2015年,短短的8年时间里,一共有470多所高校进行过更名,占高校总数的17%。学校的名…

    2022年 12月 7日
  • bci到底是一个什么组织? 3.26

    BCI,英语:Better Cotton Initiative,翻译过来就是,良好棉花发展协会,号称是一个非营利的第三方机构。 BCI,作为一个棉花发展协会,但是他不生产棉花,也没…

    2023年 7月 26日
  • 什么兔子繁殖快好养活还赚钱

    现在在市面上,牛肉的价格非常高,有人说养牛赚钱,这时候有人就会出来反驳,牛的繁殖效率太慢了,那么养殖要选择繁殖快的,这时候有人就会说了,养兔子不是很好,养兔子一是繁殖快,而且还只是…

    2022年 12月 8日
  • 汉字的编码,查询任意汉字的Unicode编码,UTF8编码,GB2312编码,GBK编码

    在所有IT项目中,汉字字符编码带来的问题是一个不小的工作量,经常导致乱码的发生。 快速查询任意汉字的编码能够更快的定位错误。 糖果云库新增了汉字字符集库,可查询任意汉字的Unico…

    2022年 12月 9日