原创 【分析】STM32从Flash中运行程序的时序分析

2008-4-12 10:45 13558 9 15 分类: MCU/ 嵌入式

大家都知道STM32的CPU时钟频率可以达到72MHz,以后还会更快,但是由于半导体制造工艺的限制,存放程序的Flash存储器不可能达到这么高的工作频率,这样当CPU直接访问Flash存储器时必须插入等待周期以得到正确的结果。


问题是在Flash的速度比CPU慢的情况下,是不是可以简单地说STM32在执行Flash中的程序时每条指令都需要插入等待周期呢?等待周期的插入对程序的执行到底有多大的影响?请看下面的分析:


首先,STM32的内部Flash是组织成64位宽度,即每次可以读出64位;在Flash与CPU的取指队列之间有两个缓冲器,用于暂存Flash中取出的指令,见下图。


点击看大图


其次,STM32的指令有16位的也有32位的,指令是从图中绿色的缓冲器取出;当绿色缓冲器变空时,黄色缓冲器中的内容会被复制到绿色缓冲器中;这样取指与读取Flash互不干扰。


正因为STM32的指令有不同长度,所以程序执行的等待周期与程序的内容有关。


图一是假定所有指令都是16位的指令:
1)时刻t0时黄色缓冲器和绿色缓冲器都为空,此时CPU等待3个周期后,到时刻t1时才能读到指令;
2)时刻t1时绿色缓冲器被填满,黄色缓冲器仍为空,Flash控制器继续读取后续指令;
3)时刻t2时绿色缓冲器还有两个字节,黄色缓冲器被填满;此时因为两个缓冲器都有数据,读取Flash的操作暂停(图一中的绿色虚线框所示);
4)当黄色缓冲器变空时,绿色缓冲器被复制到黄色缓冲器,同时恢复读取Flash的操作;
5)时刻t3时缓冲器的状态又变为上述第3)步的状态。


从以上分析可以看出,CPU的指令执行是没有等待周期的。但当执行跳转指令时,Flash缓冲器中的内容作废,系统回到了上述第1)步的状态。


图二是假定每三条指令中有两条16位的指令和一条32位的指令。这种情况下,如图所示,CPU的指令执行也是没有等待周期的。


图三是假定所有指令都是32位的指令,从图中可看出,CPU每执行两条指令,要插入一个等待周期。


上面的分析只是针对每个CPU周期都有取指操作的情况,而实际的操作中情况并没有这么简单,因为Cortex-M3的指令不都是单周期指令。


实际的程序执行情况是受很多因素影响的,单纯静态的分析也是不现实的,因此才会出现这么多评测的标准和数据。我们应该以平均的性能指标作为参考的依据,而不是简单的有没有或有多少等待周期作为判断的依据。

PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户1844471 2015-7-23 10:42

非常好

用户1571414 2011-7-4 23:02

我是初学者 麻烦您抽点时间为我解答一下好吗 万分感谢您了

用户1571414 2011-7-4 23:01

(1)CPU想从FLASH里取指令,是必须要经过指令缓冲器吗? (2)原文:“STM32的内部Flash是组织成64位宽度” 内部Flash是组织成64位宽度,是不是要从Flash里取东西,必须一次取64位呢?假如数据总线想从Flash里面取8bit/16bit/32bit可以实现吗,我听有人说对Flash操作至少要16bit,是吗? (3)是不是永远都是Flash的指令先被黄的读,读满后黄的把指令写到绿的里,然后黄的再从Flash里读64bit,如果绿的空了,就把这后读的64bit写给绿并重复以上过程,绿没空黄的就暂时不读了?黄的是不是只会和绿的之间有数据传输,不会直接把指令传给CPU的取指队列吧? (4)原文:“1)时刻t0时黄色缓冲器和绿色缓冲器都为空,此时CPU等待3个周期后,到时刻t1时才能读到指令” CPU等待3个周期后,应该是黄的装满了对吧,然后黄的把内容都写给绿的,CPU从绿的里读到了指令? (5)原文:“3)时刻t2时绿色缓冲器还有两个字节,黄色缓冲器被填满;此时因为两个缓冲器都有数据,读取Flash的操作暂停” 按原文的描述,CPU指令队列从绿里读指令不是一次读64bit然后把绿都清空吧,而是读一个16bit的指令在绿中清16bit,再读一个32bit在绿中清32bit,CPU自己应该知道下一条指令应该读一个16bit的还是32bit的是吧。 (6)原文:“当黄色缓冲器变空时,绿色缓冲器被复制到黄色缓冲器,同时恢复读取Flash的操作” 这个很不解,我一直以为只是黄往绿里面复制,然后CPU从绿里面取数,怎么这次变成了黄的清空,绿复制到黄里面去了? 您的这篇文章对我真的帮助很大,让我明白了很多问题,也许正因为明白了一些才能进一步提出问题。麻烦您帮我解答一下,我找了很久特意找到这篇文章的原创者,我先也只有您能为我解答了。谢谢!

用户281339 2010-5-6 15:26

LZ,我在用STM32做个数据(或视频)采集的系统,能否带下我? 我QQ:502892779 邮箱:tangtao87657560@126.com

用户1447124 2009-3-24 22:08

好多都是解我疑惑的地方,文章我得好好看看。

用户1079511 2008-4-16 20:47

明白了,谢谢香水城版主!END你有博客啊,以后多向你学习
相关推荐阅读
用户1090342 2010-08-05 12:33
使用STM32定时器输出任意相位差的方波
记得曾经有不少人问起这个问题,方法十分简单,不用说明,看图即知(这里画了2路输出,同样道理可以产生3路甚至4路输出)。此方法不但可以在STM32上实现,因为STM8定时器的多数功能与STM32一样,所...
用户1090342 2010-05-06 16:11
STM32的功能引脚重映射和复用功能
STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能,本文对一些在使用引脚重映射时所遇到的有关问题加以说明。我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出脚位都是固...
用户1090342 2010-04-23 11:04
改正了每次只能发送一个字节的USB虚拟串口例程
目前发布的STM32_USB-FS-Device_Lib中有一个USB虚拟串口的例程,这个例程演示了把STM32配置为一个USB虚拟串口设备,STM32从它的USART接口接收数据并通过USB传送到上...
用户1090342 2010-03-06 12:30
STM32定时器的预装载寄存器与影子寄存器之间的关系
本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/products/literature/rm/13902.pdf中译文:http:...
用户1090342 2010-02-26 12:18
使用BSRR和BRR寄存器直接操作STM32的I/O端口
STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'。GPIOx_BSRR的高16位中每一...
用户1090342 2010-01-28 16:23
如何使用STM32的USB库支持延迟HID的GET_REPORT请求
首先,请参考我的另一篇博客:以HID的SET REPORT为例说明如何使用STM32的USB库支持控制端点0如果要支持HID的GET_REPORT请求,按照上一篇博客中的说明,只需要在STM32 US...
我要评论
6
9
关闭 站长推荐上一条 /3 下一条