大家都知道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的指令不都是单周期指令。
实际的程序执行情况是受很多因素影响的,单纯静态的分析也是不现实的,因此才会出现这么多评测的标准和数据。我们应该以平均的性能指标作为参考的依据,而不是简单的有没有或有多少等待周期作为判断的依据。
stm32/stm8
意法半导体/st/stm
AM081230PA-P2功率放大器
负极电阻和负载电容对晶体振荡器的重要性
东芝存储器收购台湾光宝科技SSD业务
防爆分区及电气硬件设计要求
可控硅调光灯电路-TRIAC Light Dimmer
STM32从Flash中运行程序的时序分析
如何制作eip文件,eip格式制作方法
车载空气质量传感器检测车内空气污染物VOC
手势识别产品特性和主要应用领域
iPhone 12和Pixel 5的详细对比
不只是口罩,霍尼韦尔强劲工业解码设备助力企业复工按下"快进键"
一文详解单相双极性SPWM
富士康首发获通过_仅用36天创造最快记录
一个低噪声输出的HiFi前置放大器电路图
成来飞:陶瓷基复合材料的应用延伸是必然趋势
华为新一代间接蒸发冷却制冷技术可满足机房制冷需求
什么牌子的投影仪最清晰?人气数码博主盘点高清投影仪推荐
基于PIC16C65单片机的扫描隧道显微镜的电子学系统
传统封装工艺流程简介
内存管理问题之后谷歌又多了一个充电过热关机的BUG