打印

STM32的代码,跑在ram里快?还是跑在flash里快?

[复制链接]
10250|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lut1lut|  楼主 | 2008-1-14 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测试手段如下:
主循环一直在做一个变量的自加(sum1++),当然前提保证不会溢出。
用Cortex-M3内部的systick计数,计一秒之类,这个sum1加到多少了,以此来看谁跑的快。为了严密,看从第一秒到第二秒之间的计数效果;而不是从第0秒到第1秒(因为使能systick到真正开始执行sum1++可能有间隙)。SYStick的ISR中,第一次进入时,记录sum1的值;第二次进入时,再次记录sum1的值,两次值之差即为一秒之类sum1执行了多少次自加。由此看出谁跑得快。


同样的测试前提:
Prefetch Buffer Enable + Flash Latenty=2 (根据Flash Programming Manual中要求的那样,当48MHz<SYSCLK<=72MHz时,对flash的访问插入两个等待周期)

测试结果如下:
不对代码优化@ RAM   :计数69467
不对代码优化@ FLASH :计数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    :计数98993
打开速度优化开关@ FLSASH :计数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)就体现出来了。
相关链接:https://bbs.21ic.com/upfiles/img/20081/2008114153454168.zip
沙发
lut1lut|  楼主 | 2008-1-14 15:52 | 只看该作者

sorry,把中的“#include "lcd.h"”删掉

结论1是不言而喻的,但是至于结论2,如何解释为什么在执行无优化的代码时,flash比ram执行的慢;为什么在执行优化的代码时,flash比ram执行的快,我也没有想得很清楚,希望大家都来各抒己见,本贴仅在此抛砖引玉。

使用特权

评论回复
板凳
香水城| | 2008-1-14 16:28 | 只看该作者

哈哈,很有见地的试验,值得加酷!

没有优化时,指令执行时要到Flash中取常数,结果造成指令预取队列的取指中断,取完常数后需要重新填充指令预取队列,而Flash访问需要插入等待周期,当然时间就比较长了。

经过代码优化后,指令执行时不用再到Flash中取常数,指令预取队列不会被打断,而Flash访问需要插入等待周期的效应被下面贴子中介绍的取指缓冲区抵消,所以自然速度就快了;而这个时候在RAM中执行反而慢了是因为RAM不在ICode总线上,从RAM取指需要绕一圈,当然要比在ICode总线上的Flash慢了。

STM32从Flash中运行程序的时序分析
 

另外,STR9与STM32的总线架构是一样的,这里有一个在STR9上实现的FFT函数的实测数据,可以进一步说明在Flash中运行代码可以比在RAM中快!

使用特权

评论回复
地板
xiahua68| | 2008-1-16 19:12 | 只看该作者

厉害

不错,LZ厉害

使用特权

评论回复
5
huanan_| | 2008-1-19 16:06 | 只看该作者

利害阿

情况比较复杂,看什么处理器,是内部还是外部的

使用特权

评论回复
6
qjy_dali| | 2008-1-23 15:43 | 只看该作者

内核研究得比较深入了

不错

使用特权

评论回复
7
ammie| | 2008-1-25 11:55 | 只看该作者

嗯,很有意思的比较

使用特权

评论回复
8
luxinsun| | 2008-5-5 18:09 | 只看该作者

st的flash运行程序慢

1.st的flash最快运行程序为20~30M。
2.LM的flash运行程序可达到50M。因为他采用先进的FLASH技术。
3.TI的flash运行程序可达到60M以上,他的ARM7是60M。DSP好象是100M多。
想其他办法都是没用,FLASH折腾到RAM中,那么就算在RAM执行。
请大家发表看法。

使用特权

评论回复
9
香水城| | 2008-5-5 18:16 | 只看该作者

楼上说的有一定道理,但你忽略了很重要的东西

请看这个帖子的13、14楼:STM32从Flash中运行程序的时序分析

使用特权

评论回复
10
uuchy000| | 2008-12-19 13:34 | 只看该作者

re

1秒种完成10w次左右的自加?这个效率也太慢了吧?就算1us完成一次自加也要100w次,而stm32的指令周期是14个纳秒左右啊!

使用特权

评论回复
11
lidreamer| | 2014-8-13 09:28 | 只看该作者
谢谢分享

使用特权

评论回复
12
STM32初学者| | 2014-8-30 09:30 | 只看该作者
应该是RAM中快吧

使用特权

评论回复
13
1398117027| | 2014-8-30 14:20 | 只看该作者
有点意思!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

483

帖子

3

粉丝