微控制器(MCU)如何运行存储在Flash的程序???

忙,太忙了!!!忙完就好了。MCU运行不也就如此?在微控制器单元(MCU)中,我们所编写的程序时通常是存储在闪存(Flash)中。当MCU启动时,它会从闪存中读取程序代码,并将其加载到RAM中执行。

相信基于以上,大家会有几个疑问:

1、既然程序在RAM中运行,那为什么要存储在Flash?为什么不存储在RAM?

2、如果存储在Flash的程序大小比RAM大小还要大,那又如何处理?

......

......

目录

1、程序为什么要存储在Flash?

2、程序为什么不存储在RAM?

3、存储在Flash的程序比RAM大时如何执行程序?

4、如果程序确实超过了RAM的限制,会发生什么?

4.1、性能下降

4.2、内存不足错误

4.3、功能限制

5、微控制器(MCU)运行存储在Flash中的程序时通常有哪些步骤?

5.1、启动和引导

5.2、程序加载

5.3、按需读取

5.4、缓存机制

5.5、分支和跳转

5.6、动态搬运

5.7、循环和重复

5.8、注意事项

6、总结


1、程序为什么要存储在Flash?

解:闪存(Flash)是一种非易失性存储介质,可以确保断电后,存储在其中的数据不会由于断电而丢失,且内存相较于RAM来说大得多,因此闪存(Flash)适合用例存储程序代码。

2、程序为什么不存储在RAM?

解:随机存取存储器(RAM)是一种易失性存储介质,在断电后存储在其中得数据就会丢失,但其读写速度相较于闪存(Flash)来说更快,适合用来数据存储和处理。所以不适合用来永久存储程序;而适合来执行程序。

3、存储在Flash的程序比RAM大时如何执行程序?

解:众所周知,Flash大小往往是RAM的几倍甚至十几倍,那么如果存储在Flash的程序比RAM本身还大时,MCU又当如何运行程序?,大家要相信,我们能想到的前人大多都考虑到了。微控制器(MCU)通常会采用分页或分段技术管理相关内存。

4、如果程序确实超过了RAM的限制,会发生什么?

4.1、性能下降

程序在Flash与RAM中频繁交换代码段;

4.2、内存不足错误

如果程序尝试访问的代码或数据不在RAM中,可能就会引发内存不足的错误;

4.3、功能限制

由于RAM空间的限制,实际代码中不得不较少程序的部分功能。

5、微控制器(MCU)运行存储在Flash中的程序时通常有哪些步骤?

5.1、启动和引导

当MCU上电或复位时,它会从预定义的地址开始执行代码,这个代码一般是引导加载程序(Bootload)的起始地址。引导加载程序负责初始化硬件、配置系统时钟,然后跳转到主程序的起始地址。其实这部分主要涉及到中断向量表的迁移,感兴趣的可以私信作者。

5.2、程序加载

程序的代码存储在Flash中,但并不需要一次性全部加载到RAM,MCU的CPU会根据程序的执行流程,通过程序计数器(PC)指示当前需要执行的指令地址。

5.3、按需读取

当CPU需要执行一个指令时,但此时指令并不在CPU的指令缓存中,那么就会从Flash中读取该指令。控制器负责将指令从Flash存储器中读取出来,并通过数据总线传递给CPU。

5.4、缓存机制

许多MCU都具有指令缓存机制,它可以减少对Flash的访问次数,以提高执行效率。如果指令已经存在于缓存中,那么CPU可以直接从缓存中读取指令,从而无需访问Flash。这里涉及多级缓存相关内容。相关内容见《缓存机制原理及其应用

5.5、分支和跳转

当程序执行到分支(函数调用或跳转指令)时,CPU会更新程序计数器(PC)以指向新地址。如果新地址不在当前缓存的代码段中,CPU可能会需要从Flash中加载新的代码段。

5.6、动态搬运

对于不支持指令缓存的简易MCU,或出现缓存MISS时,CPU会直接从Flash读取指令;对于支持代码搬运的MCU,如果需要执行的代码不在RAM中,操作系统或程序代码会负责将必要的代码段从Flash搬运到RAM中。

5.7、循环和重复

程序执行是一个循环的过程,CPU会不断重复上述步骤,直至程序执行完毕。

5.8、注意事项

以上过程对于不同的MCU可能会有所不同,其依赖于具体的硬件架构、指令集、内存管理单元(MMU)、缓存策略等因素。

6、总结

以上应该是可以帮助大家了解关于存储在Flash的程序至RAM运行的过程,当然,可能涉及其他的知识点(缓存机制、为什么要有缓存?、缓存MISS会发生什么?、多级缓存的目的是什么?又有什么优点?。。。。。。)大家不是很了解,作者会持续更新维护文章,充分将各个知识点进行相关联。这里也解释下为什么不在此文章中做发散,嵌入式领域知识体系之广泛,并不能通过寥寥万字/十几万字可以解释的,其知识体系在兼容的同时是不断更新迭代,做这一行毕生都将持续学习,所以作者只能针对单个知识点逐一讲解。

相关推荐
SundayBear9 小时前
零基础入门MQTT协议
c语言·单片机
嗯嗯=9 小时前
STM32单片机学习篇9
stm32·单片机·学习
松涛和鸣14 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客17 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆18 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
jghhh0119 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖19 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3219 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发
v_for_van19 小时前
STM32低频函数信号发生器(四通道纯软件生成)
驱动开发·vscode·stm32·单片机·嵌入式硬件·mcu·硬件工程
电化学仪器白超20 小时前
③YT讨论
开发语言·python·单片机·嵌入式硬件