
在Flash的速度比CPU慢的情况下,并不能简单地说程序的执行是否有等待周期;请看下面的分析:7 p3 \( x! ~ n5 x7 g 首先,STM32的内部Flash是组织成64位宽度,即每次可以读出64位;在Flash与CPU的取指队列之间有两个缓冲器,用于暂存Flash中取出的指令,见下图。 点击查看图片, n& U m2 J+ H. Y6 d1 L 其次,STM32的指令有16位的也有32位的,指令是从图中绿色的缓冲器取出;当绿色缓冲器变空时,黄色缓冲器中的内容会被复制到绿色缓冲器中;这样取指与读取Flash互不干扰。 . q. Y1 }8 S( O3 ?: t- S! P: T 正因为STM32的指令有不同长度,所以程序执行的等待周期与程序的内容有关。 - a: J3 a, W6 h! F 图一是假定所有指令都是16位的指令:* ^, K/ }2 }, z X# [# Z0 F5 q) L1 o 1)时刻t0时黄色缓冲器和绿色缓冲器都为空,此时CPU等待3个周期后,到时刻t1时才能读到指令; 2)时刻t1时绿色缓冲器被填满,黄色缓冲器仍为空,Flash控制器继续读取后续指令; 3)时刻t2时绿色缓冲器还有两个字节,黄色缓冲器被填满;此时因为两个缓冲器都有数据,读取Flash的操作暂停(图一中的绿色虚线框所示); 4)当黄色缓冲器变空时,绿色缓冲器被复制到黄色缓冲器,同时恢复读取Flash的操作; 5)时刻t3时缓冲器的状态又变为上述第3)步的状态。 3 @: g( d2 ^6 z" a 从以上分析可以看出,CPU的指令执行是没有等待周期的。但当执行跳转指令时,Flash缓冲器中的内容作废,系统回到了上述第1)步的状态。 9 r( M2 h; j5 m9 L7 y$ m; m+ I, c $ G4 X% p% s8 g3 P% K; I% ^) I 图二是假定每三条指令中有两条16位的指令和一条32位的指令。这种情况下,如图所示,CPU的指令执行也是没有等待周期的。 * r# u+ o+ f9 z$ k7 a3 _$ I0 O ( S: F+ j% ?: J/ P 图三是假定所有指令都是32位的指令,从图中可看出,CPU每执行两条指令,要插入一个等待周期。 . `1 c/ f8 P1 B% m : [. n3 Q/ I& Z* s, w" v, y" e 上面的分析只是针对每个CPU周期都有取指操作的情况,而实际的操作中情况并没有这么简单,因为Cortex-M3的指令不都是单周期指令。 所以说,实际的程序执行情况是受很多因素影响的,单纯静态的分析也是不现实的,因此才会出现这么多评测的标准和数据。我们应该以平均的性能指标作为参考的依据,而不是简单的有没有或有多少等待周期作为判断的依据。 8 o! z8 h ]/ i9 e + `/ U8 }2 K% l+ K) b) W 出处:浪淘沙 |
学习了 |