单片机中的代码是运行在FLASH中还是RAM中

序言

马上就要国庆了,今年是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引脚来决定从哪里启动程序。

序言

马上就要国庆了,今年是2019年,又是十年一次的大阅兵。时间过得真快,仿佛上次大阅兵还是昨天,原来十年是如此短暂。最近工作也确定了,估计以后就干工控嵌入式了,感谢这么多年来父母、祖国、老师、以及身边所有陪伴我一路走来的朋友们。

扫描二维码关注公众号,回复: 11612988 查看本文章

今天早上,我和往常一样打开电脑,开始看代码,我准备好好研究一下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引脚来决定从哪里启动程序。

猜你喜欢

转载自blog.csdn.net/qq_43448742/article/details/102524807