您的位置 首页 新能源

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

这肯定是很多人关心的问题,下面通过一个例子看看会有什么样的结论:测试手段如下:主循环一直在做一个变量的自加(sum1++),当然前提保证不

这肯定是很多人关怀的问题,下面通过一个比如看看会有什么样的定论:

测验手法如下:
主循环一直在做一个变量的自加(sum1++),当然条件确保不会溢出。
用Cortex-M3内部的Systick计数,以一秒钟为限,这个sum1的数值巨细,能够判别哪种方法比较快。为了紧密,咱们调查榜首秒到第二秒之间的计数作用;而不是从第0秒到第1秒(由于使能Systick到真实开端履行sum1++可能有空隙)。在榜首次进入Systick的ISR时,记载下sum1的值;第2次进入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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/254488.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部