# 什么是等待周期?
l 等待周期是指在读取Flash数据时,CPU需要等待的时间周期。由于Flash存储器的访问速度有限,CPU不能在Flash准备好数据之前继续执行后续指令。因此,需要设置等待周期来确保数据的正确读取。
# 这里的“等待”,是谁在等待?
l 主要是CPU在等待。当CPU发出对Flash的读取请求时,如果Flash需要更多的时间来准备数据,CPU会进入“等待”状态,直到Flash完成该操作。
# 影响等待周期的因素?
l HCLK:CPU的时钟频率,HCLK的变化将影响CPU和Flash的读速度关系。
l 电源电压:电源电压的变化会影响Flash存储器的性能和最大可支持的HCLK频率。不同的电压范围对应不同的HCLK最大值和X值(即访问Flash的基数)。
# 具体情况
l 当设定的等待周期为n时,HCLK的范围被划分为(nX)和((n+1)X)。这意味着,如果HCLK的频率在这两个值之间,CPU将会等待。具体来说,若当前的HCLK频率高于Flash存储器的响应能力,CPU就会进行等待,直到Flash数据准备就绪。
# 举例:快餐店的点餐
为了更容易理解这段描述,我这里举一个简单例子加以说明。
假设有一个快餐店,顾客(CPU)来到了店里(系统),想要点餐(访问Flash存储器)。快餐店的厨房(Flash存储器)负责准备食物,但厨房的速度比较慢。
l 顾客点餐:
¡ 顾客走到柜台,告诉服务员自己想要的食物(发出读取请求)。这时,服务员开始把这个订单传递到厨房。
l 厨房准备食物:
¡ 厨房接到订单后开始准备食物,但这需要一些时间。假设厨房每天只能做10份食物(Flash的读取速度有限)。
l 顾客等待:
¡ 在这段时间,顾客不能立即吃到食物,只能在柜台旁边等待(CPU进入等待状态)。如果厨房的准备时间比较长,顾客就需要等得更久。
l 高峰时段:
¡ 如果顾客非常多(HCLK频率高),而厨房的处理能力有限(Flash的响应能力),那么顾客可能会排队等待很久。为了解决这个问题,快餐店可能会采取一些措施,比如增加厨房的厨师(增加等待周期),使厨房能够更快地处理订单。
l 电源电压的影响:
¡ 如果快餐店的电力不够(电源电压低),可能会导致厨房的设备运行不稳定,食物准备速度更慢(Flash性能下降)。在这种情况下,顾客更是需要耐心等待。
# 如何理解128位带宽?
l 一次读取128位数据:
¡ 当发出一个读指令时,闪存能够在一次操作中返回128位的数据。这相当于闪存的输出数据总线宽度为128位。
l 与32位CPU的协调:
¡ 如果CPU是32位的,意味着每次CPU可以处理32位的数据。为了协调这两者,CPU通常会分多次读取128位数据。
l 例如,CPU可以分成四个32位的数据块进行处理:
¡ 第一次读取32位数据(即128位的前32位)。
¡ 第二次读取32位数据(即128位的第二组32位)。
¡ 第三次读取32位数据(即128位的第三组32位)。
¡ 第四次读取32位数据(即128位的最后32位)。
l 这样,CPU通过多次读取来处理完整的128位数据。
# 具体流程
l 发出读指令:
¡ CPU发出一个读取Flash的指令,请求获取128位的数据。
l Flash返回数据:
¡ Flash存储器在响应中同时返回128位的数据。
l 数据分割与处理:
¡ CPU接收到128位后,将其分割成四个32位的数据块,分别存储到CPU寄存器或缓存中,进行后续处理。
# 为什么低于2.1V关闭预取缓冲区?
l 稳定性问题:
¡ 当电压低于2.1V时,系统的稳定性会受到影响。就像我们在晚上用手电筒看书,如果电池电量低,光线会变得暗淡,可能看不清楚。这时候,预取缓冲区可能无法正常工作,导致数据错误或无法获取。
l 功耗管理:
¡ 在低电压下,系统通常会进入省电模式。关闭预取缓冲区可以减少能耗,就像我们晚上关掉不需要的电器,来节省电量。
l 性能优先:
¡ 在低电压时,存储器的读写速度可能下降,预取缓冲区的作用也就不大了。就像我们在低光环境下尝试快速阅读,而文字模糊不清,反而慢了下来。
# 为什么高于2.1V需要开启预取缓冲区?
l 提高访问速度:
¡ 当电压在2.1V以上时,系统性能得到保障,预取缓冲区可以帮助CPU更快地获取数据。这就像我们在明亮的环境中阅读,能很快找到所需的信息。
l 充分利用带宽:
¡ 在高电压条件下,CPU可以同时处理更多的数据。预取缓冲区可以提前加载即将需要的数据,充分利用这一高带宽,就像我们在大超市里提前准备好购物清单,能更快完成购物。
l 降低等待时间:
¡ 如果没有预取缓冲区,CPU在执行指令时可能会因等待数据而停下来。开启预取缓冲区后,CPU可以在需要之前就获取数据,减少等待时间。这就像我们在厨房准备晚餐时,提前切好所有的菜,等烹饪的时候就能节省很多时间。
# I-cache(指令缓存)
l 是什么?
¡ I-cache就是一个用来存储程序指令的缓存。它的主要作用是加快CPU获取指令的速度。CPU需要执行的指令会被存储在I-cache中,这样CPU就可以快速获取所需的指令,而不需要每次都去慢速的Flash存储器中读取。
l 如何理解?
¡ 假设有这么一个场景,我们在图书馆里查资料。每次都得跑到书架上去找书(Flash),这会浪费很多时间。如果图书馆有一个小柜子(I-cache),里面存放着最常用的书籍,这样就可以快速地从柜子里取书,而不必每次都去书架上找。这就大大提高了查资料的效率。
l 例子:
¡ 比方说,某程序需要反复执行一个循环。这个循环的指令会被存储在I-cache中。当CPU需要执行这个循环时,它可以直接从I-cache中取得指令,不用等待慢慢从Flash中读取,省下了很多时间。
# D-cache(数据缓存)
l 是什么?
¡ D-cache是用于存储数据的缓存。与I-cache不同,D-cache主要存储的是程序运行过程中需要的数据。它帮助CPU快速访问这些数据,减少从Flash读取数据的等待时间。
l 如何理解?
¡ 继续用图书馆的例子。除了查资料,我们可能还需要一些特定的统计数据。这些数据会在查阅时频繁使用。如果图书馆的柜子(D-cache)里有一个专门的区域存放这些常用数据,我们就能快速拿到这些数据,而不用每次都去书架上查找。
l 例子:
¡ 假设某程序在处理一组图像数据,CPU需要频繁读取这些数据来进行处理。如果这些数据存储在D-cache中,CPU就能快速访问它们,避免每次都去慢速的Flash中读取,提升了整体性能。
多维讲解MCU中的重点知识Flash,通过举例的方式更便于理解FLASH的等待周期概念。闪存带宽的理解与CPU的协调问题、FLASH 预取缓冲区等讲解的也较为细腻,作者在官方手册的基础上添加自己的理解,使内容跟容易消化。