通常的说法是,程序在RAM中运行的效率比FLASH中的运行效率高,但是你见过程序在FLASH中运行比在RAM中运行效率高的芯片吗?
想要了解芯片是如何取指的,需要对MCU系统的结构有一定的了解,特别是对ICode、DCode和系统总线,下面就对STM32F103系列MCU的系统总线进行一个简单的讲解,带领大家认识MCU取指过程。
下图是STM32F103大容量系列单片机的系统结构,主要由以下部分组成:
本节主要针对Corte-M3内核ICode总线(I-bus),DCode总线(D-bus),和系统总线(S-bus)进行讲解,它是ARM公司定义的总线架构,框图如下所示。
简单来说,也就是I-BUS是指令总线,负责CPU指令的正确执行,如果I-BUS出现问题,程序就不能正常运行了(程序下载到FLASH中)。
D-BUS也就是数据总线,比如访问存储在FLASH或者RAM中的数据,例如数组的值,是通过D-BUS完成的。
S-BUS是系统总线,它既可以取指,也可以访问数据,也可以访问外设。
对于STM32F103系列来说,当代码存储在FLASH中,S-BUS主要负责访问外设,I-BUS取指,D-BUS访问数据;当代码存储在RAM中的时候,此时I-BUS空闲,取指主要是通过S-BUS。
要弄明白后面的问题,这里讲一下Latency的含义,Latency也就是Flash读取数据的等待时间,根据时钟频率不同,这个时间有所不同。
下图是Flash读时序图,可以看出,当读使能(RE)拉高之后,MCU向Flash发送需要读取的地址,Flash收到这个地址之后,有一个等待时间(Tkq),当等待的时间大于等于Tkq的时候,才能读出有效的数据,否则数据无效,这个Tkq就是我们常说的Latency。
从系统结果框图可知,Cortex-M3内核对Flash的操作路径比对SRAM的操作路径更短(操作SRAM多走了一条总线矩阵),按照路径的长短,内核读取Flash的数据比读取SRAM的数据更快,但是STM32F103系列单片机的FLASH在写入读取的地址之后,需要有一个等待时间,满足这个等待时间之后,才能读取有效的数据(等待时间根据主频不同有所不同),而SRAM则没有这个等待时间,所以,SRAM的取指速度比Flash快的原因就体现在Flash读取数据有一个等待时间,我们把这个等待时间叫做latency。
下图是STM32F103不同的系统时钟下,FLASH读取数据的延迟时间。
通过查看GD32F303的手册发现,GD32F303对Flash前256K字节的读取没有等待时间。
再查看GD32F303的系统框图,发现操作SRAM的路径比Flash的路径长,如果程序小于256KB,那么程序在GD32F303这款芯片的Flash中的运行效率比SRAM的运行效率高。