序言
马上就要国庆了,今年是2019年,又是十年一次的大阅兵。时间过得真快,仿佛上次大阅兵还是昨天,原来十年是如此短暂。最近工作也确定了,估计以后就干工控嵌入式了,感谢这么多年来父母、祖国、老师、以及身边所有陪伴我一路走来的朋友们。
今天早上,我和往常一样打开电脑,开始看代码,我准备好好研究一下CM3的内核架构,在看完它的整体架构后,各个模块的作用,存储器映射我都大概了解了,我于是想看看,代码到底被放在了哪里,执行的时候,又是在哪里,于是我打开调试器开始观察,卧槽,我突然发现代码运行的地址和CM3给的SRAM地址不对应。后来上网搜了一下才发现原来单片机并不用把程序加载到RAM中。下面我将会详细介绍我的这次探索历程
CM3存储器映射
上面是CM3的存储器映射,一共分成了八段,其中SRAM段和Code段各占了512M,我本以为:代码永久存储在Code段中,运行的时候加载到SRAM段中。
STM32中的闪存
我用的是STM32F103RBT6,它是中容量,芯片内置的FLASH大小为128K,地址映射情况如下图所示
也就是说ST公司把CM3内核的0x0800 0000
- 0x0800 13FF
这个部分的地址给了片上FLASH,这部分地址空间在0x0000 0000
- 0x1FFF FFFF
上,代码将来就会永久地存储在这里。
调试时候的现象
???,代码运行的时候就是在FLASH中,并没有被加载到SRAM中,震惊!!!
现象解释
首先
,单片机中SRAM很小,STM32F10XX只有64K,普通PC机的RAM几个G,所以把程序加载到SRAM中,不太合适,再者
,把程序加载到SRAM中会增加内存管理开销,除此之外
,ARM采用哈弗结构,SRAM取数据,FLASH取指令,两者同时进行,效率杠杠的。当然
,ST公司也给了我们选择,可以通过设置boot0和boot1引脚来决定从哪里启动程序。