打印

STM32 FLASH 预取与 延时的理解

[复制链接]
8561|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinguangwei|  楼主 | 2010-12-3 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 参考手册有这么一段话:

闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。

读访问可以有以下配置选项:
● 等待时间:可以随时更改的用于读取操作的等待状态的数量。
● 预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓冲区的存在,CPU可以工作在更高的主频。CPU每次取指最多为32位的字,取一条指令时,下一条指令已经在缓冲区中等待。
● 半周期:用于功耗优化。


这段话怎么理解啊?

等待时间 指的是谁等待 ?   网上有说CPU时钟高时,需要延时,以等待总线同步操作,什么意思?   闪存的带宽是 64 位 怎么理解? 就是读取一次(一个读指令)可以读取64位的数据吗 ? 如果是这样,CPU是32位的,怎么协调呢 ?
这段话一直没有理清,哪位朋友帮指导一下啊
沙发
airwill| | 2010-12-3 10:45 | 只看该作者
等待当然是 CPU 等待(外部)了.
外部来不及, CPU 就浪费几个周期不干活, 等待外部就绪嘛
闪存的带宽是 64 位 怎么理解? 就是一个读操作可以读取64位的数据
CPU是32位的, 协调的问题由总线接口来完成, 对 CPU 不可见.

不过,事实上, 预取缓冲区(2个64位):还是存在瓶颈的, 据我测试, 全部 32 指令就有等待了, 幸好 新的 STM32F-2 采用了 128 位了.

使用特权

评论回复
板凳
say_sth_freely| | 2010-12-3 10:50 | 只看该作者
等待时间:网上说的没错,cup的运行频率高,而内部flash的运行频率低,所以cpu要从flash中取指令当然要有个等待的时间了。
怎么协调:cortex内核“意识”到它的缓冲区没有指令了,它就会去flash中预取,当缓冲区中有预取的指令,它自然就不执行预取了,当然cortex内核肯定不是当缓冲区中没有指令了才去取指令,而是它认为被cpu译码后剩余的预取指令少到一定程度后就去预取指令。

使用特权

评论回复
地板
香水城| | 2010-12-3 13:51 | 只看该作者
我有一篇博客,LZ可以去看看。

使用特权

评论回复
5
yinguangwei|  楼主 | 2010-12-3 22:40 | 只看该作者
2# airwill
谢谢指教,是不是可以这样理解: FLASH以一定的速度将指令放到缓冲区,(是不是I-Code来做?) 然而由于CPU 的读取速度快,虽然是32位,但是由于读取速度比 FLASH的指令放入64位的缓冲区的速度快很多,所以CPU要等待?

I-Code 总线也应该是连接到CPU内核的吧?  它是用来预取指令的(将指令预取放到缓冲区,以供CPU读取) , 既然连接到CPU内核总线,I-Code的预取速度由谁决定? 这里会涉及到FLASH的速度, 具体指什么?  

是否可以这样理解:FLASH 虽然一次可以预读取64位,但是单位时间内读取的并没有64位,所以造成其速度较慢,CPU需要等待?

使用特权

评论回复
6
yinguangwei|  楼主 | 2010-12-3 22:43 | 只看该作者
3# say_sth_freely
非常感谢!   网上有说的: CPU时钟高时,需要延时,以等待总线同步操作。       这个总线操作具体指什么呢?

使用特权

评论回复
7
yinguangwei|  楼主 | 2010-12-3 22:43 | 只看该作者
4# 香水城
谢谢,我看过您写的那篇博客了,但是没有看多明白 :'(

使用特权

评论回复
8
香水城| | 2010-12-5 09:29 | 只看该作者
预取缓冲区相当于一个蓄水池,上游流速慢但水道宽,下游流速快但水道窄,CPU取指的过程是间歇的放水过程,有2种模式,一是以16位方式出水,二是以32位方式出水;1)如果一直以16位方式出水,则蓄水池不会干枯,也就是说下游出水不会断流;2)如果是间隔地以16位和32位的方式交叉出水,则蓄水池不会断流;3)如果一直以32位方式出水,则蓄水池会不断干涸,下游会间歇式地断流。

根据Cortex-M3的指令特点,上述的第3种(一直以32位方式出水)方式所占比例比较低,即因为有了预取缓冲区这个蓄水池,大大减小了Flash拖慢CPU的运行问题。

使用特权

评论回复
9
say_sth_freely| | 2010-12-5 10:53 | 只看该作者
香主解释非常形象,在此拍马一下

使用特权

评论回复
10
yinguangwei|  楼主 | 2010-12-10 10:59 | 只看该作者
本帖最后由 yinguangwei 于 2010-12-10 11:13 编辑

8# 香水城
非常感谢香主,小弟差不多已经理解了。 现在有几个概念还有点迷糊:

1、关于存储器的宽度与速度问题:

二者之间没有必然的联系吧? 就比如你说的蓄水池,虽然宽度很宽但是速度不一定很快;

不同的存储器(FLASH,RAM等)的宽度也叫位宽,对吧,就是指一次读取命令可以读取的数据位数 ;比如 上面所说的 闪存的宽度是64位,这个宽度指:一个读取指令可以读取64位的数据,

而速度指单位时间内可以读取的位数;闪存的速度由什么决定的呢?



2、闪存相当于上游,水道宽,速度慢,这个速度就是I-Code 总线预取 闪存中指令的速度吧?

3、STM32的 RAM 中一个地址0x4000 0000 ,这个地址应该指代的一个4字节的字;

而8位CPU 一个地址0x10 只代表一个字节?

使用特权

评论回复
11
airwill| | 2010-12-10 13:23 | 只看该作者
CPU 通常需要 4 个周期( 72Mhz下, 2 个等待周期)读取 64 位数据进入指令缓冲.
CPU 通常需要 1 到 2 个周期执行一条指令(16位或者32位).

使用特权

评论回复
12
efen| | 2012-9-20 14:47 | 只看该作者
学习,mark

使用特权

评论回复
13
gligudi| | 2013-10-8 14:01 | 只看该作者
新手入门中,对预取也觉得不太理解,楼上几位的讨论很有帮助mark

使用特权

评论回复
14
cailantu| | 2013-10-8 14:07 | 只看该作者
学习了,感谢大家的分享

使用特权

评论回复
15
tianli1980| | 2013-10-14 15:36 | 只看该作者
新手不太理解,看此贴后根据各位朋友的提示,查查资料,琢磨一下。

使用特权

评论回复
16
chuangpu| | 2013-10-14 16:55 | 只看该作者
到香主的博客里看看  应该有我需要的知识点   谢谢香主  

使用特权

评论回复
17
liuruoshui1987| | 2014-2-12 10:56 | 只看该作者
谢谢,闪存读取!

使用特权

评论回复
18
| | 2014-6-17 15:32 | 只看该作者
学习了,。。。。。。
香水城版主的博文写的不错。

使用特权

评论回复
19
suguibin02| | 2015-10-16 16:54 | 只看该作者
香水城 发表于 2010-12-5 09:29
预取缓冲区相当于一个蓄水池,上游流速慢但水道宽,下游流速快但水道窄,CPU取指的过程是间歇的放水过程, ...

香主威武!:D

使用特权

评论回复
20
hello、C| | 2020-6-4 14:51 | 只看该作者
学习,Mark 一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

101

帖子

1

粉丝