#有奖活动# #申请原创# 1、前言 APM32F411系列MCU的SRAM容量128KB、FLASH容量最高512KB。SRAM时钟频率等于APM32F411主频,FLASH时钟频率与电源电压相关,如下图所示(APM32F411用户手册3.5.1章节)。 从上图可以看出,FLASH时钟频率最大30MHz。APM32F411的最高主频可以达到120MHz,所以SRAM的最大时钟频率可以达到120MHz。 在需要提高程序运行速度的工程中,有时候会考虑把全部或部分程序从FLASH中搬运到SRAM中运行。 接下来,通过实例测试,感受一下APM32F411部分程序在FLASH和SRAM的运行速度。根据极海官网APM32F4xx_SDK_V1.4的GPIO_Toggle例程修改,APM32F411系统时钟设置为120MHz。 2、移植部分程序到SRAM前的准备工作 打开工程中的“.sct”文件,添加下图红色框的内容,“*.o(RAMCODE)”。 点击KEIL的“魔法棒”菜单,打开“Linker”界面。取消“Use Memory Layout from Target Dialog”选项。在Scatter File选项选择上一步修改的“.sct”文件。点击“OK”,完成配置。 3、程序在FLASH和SRAM中运行时间对比 3.1 程序在FLASH中运行时间 部分测试程序,如下图所示。主函数包括两个函数:LED2(PE6)引脚翻转函数和测试函数。测试函数主要内容是循环执行减法运算。 通过逻辑分析仪抓取PE6的电平变化情况,评估程序执行时间。 在FLASH中执行该测试程序,IO翻转时间约34.37us,如下图所示。 3.2 程序在SRAM中运行时间 将测试函数test_function的程序搬运到SRAM中运行,如下图所示。在test_function前后行各添加一条语句,这样,程序就在SRAM中运行了,其他程序与3.1章节一致。 在SRAM中执行测试函数程序,IO翻转时间约68.56us,如下图所示。 测试函数在FLASH中执行速度居然比在SRAM中执行速度快!这是什么原因呢? APM32F411是一款基于32位Arm Cortex-M4F内核的微控制器,带有ART加速器。根据APM32F411用户手册3.5.1.1章节描述,ART加速器的存在,提高了程序在FALSH的执行速度。 4、ART加速器原理说明 ART加速器是如何加速的?为什么程序在FLASH中运行速度比SRAM的快? ARM加速器能实现指令预取队列和分支缓存,从而提高了FLASH程序执行时间。 4.1 指令预取 APM32F411的CPU指令总线和数据总线都是32位宽,根据哈佛结构,指令总线和数据总线可以同时进行。SRAM和FLASH不管指令还是数据都是一组总线,读指令和读数据不能同步进行。 对于第3章节的例程,SRAM时钟频率等于系统时钟频率,即120MHz,FLASH时钟频率30MHz。SRAM的时钟频率是FLASH的4倍。FLASH通信总线是128位,SRAM通信总线位宽是32位,结合时钟频率和位宽,APM32F411的程序在FLASH和SRAM中运行速度基本一致。 如下图所示(以系统时钟频率是FLASH时钟频率4倍为例),由于ART加速器的指令预取功能,不需要等CPU读取完数据,FLASH就可以读取下一组指令到指令预取队列,相当于FLASH读指令和读数据也可以同步进行。所以,FLASH读操作时间接近SRAM读操作时间的2倍。 4.2 分支缓存 当遇到非顺序执行的代码时,跳转指令可能并不存在指令预取队列中,此时,需要重新获取指令。为了弥补指令跳转产生的时间损耗,ART加速器有指令缓存存储器,可以保存最近使用的64行128位的指令。如果跳转指令已存在指令缓存区,则无需任何延时,直接获取指令。 5、结论 对于APM32F411,由于ART加速器的存在,程序在FLASH运行时间比SRAM运行时间快。非特殊情况,不建议把代码放到SRAM中运行。 FLASH时钟频率与系统电压有关(参考APM32F411用户手册3.5.1章节),如果系统电压低,主频高的场景,程序在FLASH和SRAM中的运行时间差不多。 我们经常听说的程序在SRAM中运行时间比FLASH快,是在什么情况下会出现?对于Arm Cortex-M3内核的MCU,没有ART加速器模块,FLASH通信总线位宽只有64位的情况下,非顺序执行程序在SRAM中运行时间比在FLASH的运行时间更快。 6、参考例程 |