本帖最后由 DKENNY 于 2024-11-22 20:11 编辑
#申请原创# #技术资源# @21小跑堂
前言
这次我们来聊聊关于APM32 Flash里面的几个关键概念,我们平时经常会使用到,但往往也容易忽略。为了更好的理解这些概念,我总结了以下几个问题和主题,同时也作为本文的一个摘要目录,以便于各位逐步深入探讨。
1、Flash的等待周期是什么?怎么理解?有什么作用?
2、闪存的带宽是128位,怎么理解?可以理解为读取一次(一个读指令)可以读取128位的数据吗?如果是这样,实际MCU芯片的CPU却是32位的,这两者之间怎么协调呢?
3、Flash预取缓冲区到底是个啥?为什么低于2.1V需要关闭预取缓冲区?为什么高于2.1V需要开启预取缓冲区?
4、如何理解I-CACHE和D-CACHE?芯片设计时,为什么D-CACHE要优先于I-CACHE访问?
5、flash中的并行位数到底是什么?影响因素?
Q1. Flash的等待周期
APM32F4手册上只简单提了怎么根据系统时钟配置等待周期,并未阐述其概念以及作用。以下是手册原文的一个截图。
# 什么是等待周期?
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性能下降)。在这种情况下,顾客更是需要耐心等待。
l 总结
在这个例子中,顾客的等待就像是CPU在访问Flash时的等待。厨房的速度(Flash的访问速度)和顾客的耐心(CPU的处理速度)之间的关系决定了整体的点餐效率(系统性能)。合适的等待周期就像是快餐店合理安排厨房工作,使得顾客在较短的时间内可以拿到食物,从而提高顾客的满意度(提升系统性能)。
综上所述,Flash的等待周期主要影响的是CPU在访问Flash时的效率和响应速度。合理设置等待周期可以优化CPU频率与Flash读速度之间的匹配,提高系统性能。
Q2. 闪存带宽的理解与CPU的协调问题
同时,我们注意flash闪存的带宽为128bit,闪存的带宽为128位意味着在一次读取操作中,闪存可以传送128位的数据。这个数据宽度是指在每次读取指令时,闪存可以同时输出128位的信息。
# 如何理解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寄存器或缓存中,进行后续处理。
# 总结
虽然闪存的带宽为128位,但CPU可以通过多次读取和分割数据来协调这两者的差异。这种设计使得系统能够高效地利用闪存的带宽,同时确保CPU能够处理它所需的数据宽度。
Q3、FLASH 预取缓冲区
# 预取缓冲区是什么?
预取缓冲区就像一个小仓库,当CPU需要数据时,它可以提前把即将使用的数据放入这个仓库里。这样,当CPU需要这些数据时,就可以快速获取,而不需要每次都去慢速的Flash存储器那里取。
关于预取缓冲区,手册中还有一部分关于这个的描述,原文如下。
# 为什么低于2.1V关闭预取缓冲区?
l 稳定性问题:
¡ 当电压低于2.1V时,系统的稳定性会受到影响。就像我们在晚上用手电筒看书,如果电池电量低,光线会变得暗淡,可能看不清楚。这时候,预取缓冲区可能无法正常工作,导致数据错误或无法获取。
l 功耗管理:
¡ 在低电压下,系统通常会进入省电模式。关闭预取缓冲区可以减少能耗,就像我们晚上关掉不需要的电器,来节省电量。
l 性能优先:
¡ 在低电压时,存储器的读写速度可能下降,预取缓冲区的作用也就不大了。就像我们在低光环境下尝试快速阅读,而文字模糊不清,反而慢了下来。
# 为什么高于2.1V需要开启预取缓冲区?
l 提高访问速度:
¡ 当电压在2.1V以上时,系统性能得到保障,预取缓冲区可以帮助CPU更快地获取数据。这就像我们在明亮的环境中阅读,能很快找到所需的信息。
l 充分利用带宽:
¡ 在高电压条件下,CPU可以同时处理更多的数据。预取缓冲区可以提前加载即将需要的数据,充分利用这一高带宽,就像我们在大超市里提前准备好购物清单,能更快完成购物。
l 降低等待时间:
¡ 如果没有预取缓冲区,CPU在执行指令时可能会因等待数据而停下来。开启预取缓冲区后,CPU可以在需要之前就获取数据,减少等待时间。这就像我们在厨房准备晚餐时,提前切好所有的菜,等烹饪的时候就能节省很多时间。
# 总结
这样是不是更容易理解了呢,也就是说,预取缓冲区在低于2.1V时关闭是为了保证系统的稳定性和节约能耗,而在高于2.1V时开启,则是为了提高数据访问速度和效率,减少等待时间。这种设计确保了CPU能在不同电压条件下以最佳状态运行,就像在不同环境下采取适合的阅读或工作方式,最终提高整体的工作效率。
Q4. 如何理解I-CACHE和D-CACHE
# 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中读取,提升了整体性能。
# 总结
I-cache和D-cache都是为了提高CPU的效率,减少等待时间。I-cache专注于存储程序指令,而D-cache则专注于存储程序运行时需要的数据。
通过这两个缓存,CPU可以快速执行指令和访问数据,使得整个系统的运行更加流畅和高效。就像在图书馆中,有了快速存取的柜子,查找和获取信息的过程变得更加高效。
那么这里有人会有疑问,在D-bus的描述中,“D-bus的访问优先于I-bus”,为什么要这么设计呢?
# D-bus和I-bus的区别
l I-bus:用于访问指令,比如CPU执行的程序代码。
l D-bus:用于访问数据,比如程序运行过程中需要处理的信息。
# 为什么D-bus优先于I-bus?
l 1. 程序执行的流畅性:
¡ 在许多程序中,数据的读取往往比指令的读取更频繁。例如,程序可能在执行过程中反复使用某些数据来进行计算,而指令可能会相对固定。为了确保程序能够快速处理数据,系统设计上让数据的访问优先于指令的访问。
l 2. 避免数据等待时间:
¡ 如果数据访问被设置为低于指令访问的优先级,CPU在执行指令时可能会因为等待数据而停滞不前。这就像是我们在图书馆查找一本书,但需要用到的数据却在柜子里慢慢取出,导致我们无法继续查找或阅读其他书籍。优先处理数据访问,可以减少这种等待,从而提高整体效率。
# 例子说明
l 图书馆的查找过程:
¡ 假设我们在图书馆中正在查阅某个专题的资料。我们需要先找到一些具体的数据来支持相关论点(数据),然后再查看相关的参考书籍(指令)。
¡ 如果我们在查找数据的时候,柜子里的图书(D-cache)可以快速提供所需的信息,而这时我们还得等指令(I-cache)慢慢取出来,这时研究进程就会受到影响。
l 程序中数据处理的优先性:
¡ 设想一个程序正在进行图像处理。每当CPU要执行图像处理的指令时,它需要同时获取这些图像的数据。如果数据访问的优先级低于指令访问,当CPU需要处理这些图像时,就会发生等待,导致整个图像处理的速度变慢。
¡ 而如果D-bus的访问优先于I-bus,CPU能够迅速获取图像数据并立即进行处理,这样可以显著提高程序的执行效率。
# 总结
通过设计D-bus的访问优先于I-bus,系统能够确保CPU在执行指令时,能够更快地获取到必要的数据,从而避免因等待数据而造成的性能瓶颈。这种设计优化了程序的执行流程,使得整体性能更加高效,就像在图书馆中,优先取出需要的数据可以让我们的查阅和研究更为顺畅。
Q5. 并行位数的理解与配置
并行位数是指在对Flash存储器进行擦写操作时,能够同时处理的字节数。简单来说,就是一次可以并行操作的数据宽度,它直接影响Flash存储器的擦写速度和效率。
# 如何理解并行位数?
l 并行处理的概念:
¡ 假设我们在一个餐馆里点餐,如果只有一个服务员在处理所有的订单(串行处理),那么每个人都需要排队等候,点餐的速度就会很慢。
¡ 而如果有多个服务员同时为不同的顾客服务(并行处理),那么每个人都能更快地得到自己的食物,整体的服务效率就会提高。
l 在Flash中的应用:
¡ 在Flash存储器中,并行位数就像是服务员的数量。假如并行位数是8位(8-bit),那么每次操作只能处理8位的数据,相当于一次只能处理1个字节。如果并行位数是32位(32-bit),那么一次可以处理4个字节,效率明显提升。
# 举个例子:
假设我们有一份大文档,文件大小为32个字节。
l 8-bit并行位数:
¡ 如果Flash的并行位数是8-bit,那么就需要进行32次操作,每次只能写入1个字节。这个过程会比较耗时。
l 32-bit并行位数:
¡ 如果并行位数提高到32-bit,这样只需进行8次操作,4个字节一次写入。这就大大缩短了写入时间,提高了效率。
l 影响因素
并行位数的设置取决于电源电压和是否使用外部电源。这意味着在不同的电压范围内,Flash存储器的性能会有所不同。例如,就像手册提到的:
¡ 当电压为1.8-2.1V时,最大支持8-bit的并行位数。
¡ 当电压在2.7-3.6V并且使用外部电源时,最高可达64-bit并行位数。
# 总结
并行位数是一种反映Flash存储器在擦写操作时能够同时处理的数据量的指标,它直接影响操作的速度和效率。通过调整电压和使用外部电源,可以实现更高的并行位数,从而提高整个系统的性能。就像在餐馆中,更多的服务员能让顾客更快地享用美食,Flash存储器越高的并行位数意味着数据处理的速度越快。
以上的这些问题,都是我根据APM32 手册上Flash章节的原文,加以理解及思考提出来的,当然这可能源于我自己理解的一部分,各位还有什么补充的话,欢迎评论或留言,我们一起讨论~
|
多维讲解MCU中的重点知识Flash,通过举例的方式更便于理解FLASH的等待周期概念。闪存带宽的理解与CPU的协调问题、FLASH 预取缓冲区等讲解的也较为细腻,作者在官方手册的基础上添加自己的理解,使内容跟容易消化。