STM32的代码,跑在RAM里快?还是跑在Flash里快?

发布者:JoyfulHearted最新更新时间:2015-04-14 来源: eechina关键字:STM32  代码  RAM  Flash 手机看文章 扫描二维码
随时随地手机看文章
这肯定是很多人关心的问题,下面通过一个例子看看会有什么样的结论:
 
测试手段如下:
 
主循环一直在做一个变量的自加(sum1++),当然前提保证不会溢出。
 
用Cortex-M3内部的Systick计数,以一秒钟为限,这个sum1的数值大小,可以判断哪种方式比较快。为了严密,我们观察第一秒到第二秒之间的计数效果;而不是从第0秒到第1秒(因为使能Systick到真正开始执行sum1++可能有间隙)。在第一次进入Systick的ISR时,记录下sum1的值;第二次进入Systick的ISR时,再次记录sum1的值,两次值之差即为一秒钟间隔中sum1执行了多少次自加。由此看出哪种方式比较快。
 
同样的测试前提:Prefetch Buffer Enable + Flash Latenty="2" (根据Flash Programming Manual中要求的那样,当48MHz
 
测试结果如下:
 
不对代码优化,在RAM中执行程序:sum1计数69467/秒
不对代码优化,在FLASH中执行程序:sum1计数43274/秒 (Flash里跑得慢)
 
/***********循环体内代码为N个以下的block*************/
(1)LDR R0,[PC, #0x154]
(2)LDR R1,[PC, #0x154]
 
(3)LDR R1,[R1,#0]
(4)ADDS R1, R1,#0x1
 
(5)STR R1,[R0, #0]
 
    ......
/****************************************************/
 
打开速度优化开关,在RAM中执行程序:sum1计数98993/秒
打开速度优化开关,在FLASH中执行程序:sum1计数115334/秒 (Flash里跑得快)
 
/***********循环体内代码为N个以下的block*************/
(1)LDR R1,[R1,#4]
(2)ADDS R1, R1,#0x1
(3)STR R1,[R0, #0]
    ......
/****************************************************/
 
结论就是:
 
1)程序运行在RAM里速度快还是运行在Flash里速度快,不是绝对的一概而论的,取决于代码;
 
2)就以上两种具体的代码情况来说,我觉得无优化时,如果在Flash里执行:(1)(2)的取指(读flash)->译码->执行 (读flash);取指和执行阶段flash的目标地址不是连续的,因此是non-sequencial access,所以会很慢;
打开优化时,(1)(2)(3)都不会造成flash的non-sequential access,所以在flash里的优势(取指和取数据走不同的总线ICode和DCode以及Prefetch)就体现出来了。
 
再进一步的分析,又有这样一些结论:
 
没有优化时,指令执行时要到Flash中取常数,结果造成指令预取队列的取指中断,取完常数后需要重新填充指令预取队列,而Flash访问需要插入等待周期,当然时间就比较长了。
 
经过代码优化后,指令执行时不用再到Flash中取常数,指令预取队列不会被打断,而Flash访问需要插入等待周期的效应被下面贴子中介绍的取指缓冲区抵消,所以自然速度就快了;而这个时候在RAM中执行反而慢了是因为RAM不在ICode总线上,从RAM取指需要绕一圈,当然要比在ICode总线上的Flash慢了。
 
关于Flash的性能,请看我的另一篇分析:【分析】STM32从Flash中运行程序的时序分析
 
另外,STR9与STM32的总线架构是一样的,这里有一个在STR9上实现的FFT函数的实测数据,可以进一步说明在Flash中运行代码可以比在RAM中快!
 
在ST的网站上有一个DSP的函数库,这是它的文档《STR91x DSP library (DSPLIB)》,在这篇文档中有一节讨论FFT运算速度的,那里给出了实际的运算时间比较,摘录如下:
 
Radix-4
Complex FFT     Operation Mode     Cycle Count     Microseconds
64 Point     Program in Flash & Data in SRAM     2701     28.135
64 Point     Program & Data in SRAM     3432     35.75
64 Point     Program & Data in Flash     3705     38.594
256 Point     Program in Flash & Data in SRAM     13740     143.125
256 Point     Program & Data in SRAM     18079     188.323
256 Point     Program & Data in Flash     19908     207.375
关键字:STM32  代码  RAM  Flash 引用地址:STM32的代码,跑在RAM里快?还是跑在Flash里快?

上一篇:如何使用STM32的USB非控制端点发送多个数据包
下一篇:STM32中如何使用PC14和PC15

推荐阅读最新更新时间:2024-03-16 13:58

三星NAND Flash 传四年后重返iPhone
    韩厂积极打进苹果iPhone供应链。韩国媒体报导,三星电子计画提供NAND型快闪记忆体给iPhone,这将是睽违4年后三星电子NAND型快闪记忆体重返iPhone供应链。 韩国网站媒体ET News报导,苹果从2012年iPhone 5推出开始,就没有采用三星电子(Samsung Electronics)的NAND型快闪记忆体,在于三星电子并未接受苹果要求、在NAND型快闪记忆体封装技术上采用电磁干扰屏蔽(EMI shielding;Electro Magnetic Interference shielding)技术。 报导引述产业人士消息,三星电子正在与韩国Protec、美国Asymtek、韩松化学株式会社(Han
[手机便携]
Moto E7核心规格解密:骁龙632处理器+2GB内存
作为去年上线的Moto E6继任者,近日入门手机Moto E7现身Google Play Console,并透露了一些关键规格参数,包括内存、系统、屏幕分辨率以及芯片组等等。不过遗憾的是,该网站上并没有提供手机的渲染图。   根据Google Play Console的上市信息,Moto E7将采用骁龙632 SoC,搭配Adreno 506 GPU和2GB RAM,但也可能会有其他的衍生机型。 根据信息显示,Moto E7将采用HD+显示屏,分辨率为720×1520像素,像素密度为280DPI。该机搭载接近于原生的Android操作系统,但其他信息尚不清楚。
[手机便携]
STm32驱动74HC595引脚图时序图工作原理
74HC595和74hc164一样是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个数码管的引脚,他还具有一定的驱动能力,可以免掉三极管等放大电路,所以这块芯片是驱动数码管的神器.应用非常广泛,点这里可以下载完整的74HC595中文资料: http://www.51hei.com/f/74HC595中文资料.pdf 74HC595引脚图 74HC595管脚功能 下面我来介绍一下 74HC595工作原理: 74HC595的数据端: QA--QH: 八位并行输出端,可以直接控制数
[单片机]
<font color='red'>STm32</font>驱动74HC595引脚图时序图工作原理
stm32时钟初始化分析
之前在系统应用中都是直接用的void SystemInit (void)函数进行系统时钟的初始化,从来没有考虑怎样进行时钟初始化的细节,但是突然硬件时钟无法起振了,所以才考虑利用系统内部,stm32内部提供了一个8M的内部时钟,不是很准确,但是可以用。如果还是按照调用系统时钟的方法,程序运行起来会很慢,因为SystemInit函数运行之后如果硬件晶振无法启动,就是自动切换到HSI时钟启动,所以只能用8M的时钟,不能用PLL进行倍频。在网上找到一串内部晶振初始化的程序,先贴上。 void RCC_Configuration(void) { RCC_DeInit(); RCC_HSICmd(ENABLE); while(
[单片机]
自制bootloader 之文本代码
想移植uboot1.4到板子上,搞了半天没成功,决心弄明白uboot原理,大概流程,所以决定写个简单的bootloader来理顺一下应该做些什么,怎么做~~~~ 首先应该描述一下该bootloader的基本功能:板子上电后能进行LED流水灯(万能的流水灯啊 )。实现该功能分两步:第一步,真正的bootloader功能,即实现硬件的初始化以及将内核程序(LED流水灯)从ROM(flash)搬移到RAM(sdram);第二步,内核程序的实现 第一步也可分两段:1,板子硬件初始化;2,内核程序的搬移。代码文件:boot.s 板子硬件初始化:1. 异常向量初始化        2. 初始化CPSR,包括关闭中断及设定svc模式等
[单片机]
面向三网融合的RIA新媒体技术及平台架构
一、概述   “理解未来电视的关键,是不再把电视当电视看。从比特的角度来思考电视才能给它带来最大收益。”在电信、广播电视、计算机“三网融合”的趋势下,近年来,以创新信息传播方式为核心业务的新媒体领域开始了积极的探索,电视与电信行业互相渗透同时催生了“以用户为中心融合业务”的市场需求,以视频业务为代表的新媒体业务、融合终端和高价值客户的需求推动,大大加快了网络和业务融合的进程,为用户提供了多种获取信息的渠道和选择的范围,满足了人们多样化、专业化和个性化的需求。   近年来的技术发展趋势表明,所谓三网融合,不是目前三大独立网络的简单延伸和叠加,而是“表现为技术上趋向一致,网络层上实现互联互通,业务层上互相渗透和交叉”。基于互联网所
[家用电子]
面向三网融合的RIA新媒体技术及平台架构
STM32的USART接收数据通过DMA传输所遇到的问题
出现的问题: 先使用USART中断函数接收数据,判断是否接收到每帧数据的起始标记字符。如果接收到就关闭USART中断,然后开启DMA用于后续串口数据的接收。但是出现一个问题是每帧数据的起始标记为:A5 4A 05 00 00 40 81 然后开启DMA传输后所接收收到的第一个数据为0x81,也就是起始标志字符的最后一个数据。 造成这样问题的原因是: 在USART初始化时使用了函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); 虽然此时DMA没有被使能,但是硬件上已经开始做DMA传输检测了。 解决办法: 将函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENA
[单片机]
stm32专题三十六:MDK编译过程和文件类型(二)
MDK工程的文件类型: 1 下图为 Project 目录下的工程文件 实际上,只需要有 unprojx 文件,就可以恢复整个工程。 具体描述: 2 源文件 3 output 和 list 文件 详细分析: 1 uvprojx 文件 uvprojx 文件就是我们平时双击打开的工程文件,它记录了整个工程的结构,如芯片类型、工程包含了哪些源文件等内容。 可以使用vscode直接打开 uvprojx ,来看一下里面的具体内容: 2 uvoptx 文件 uvoptx 文件记录了工程的配置选项,如下载器的类型、变量跟踪配置、断点位置以及当前已打开的文件等。 我们在程序 main.c 的第81行
[单片机]
<font color='red'>stm32</font>专题三十六:MDK编译过程和文件类型(二)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved