9131|9

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32的代码,跑在ram里快?还是跑在flash里快? [复制链接]

测试手段如下:
主循环一直在做一个变量的自加(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.eeworld.com.cn/upfiles/img/20081/2008114153454168.zip
此帖出自stm32/stm8论坛

最新回复

                                 1秒种完成10w次左右的自加?这个效率也太慢了吧?就算1us完成一次自加也要100w次,而stm32的指令周期是14个纳秒左右啊!   详情 回复 发表于 2008-12-19 13:34
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

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

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

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

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

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

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

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 

厉害

                                 不错,LZ厉害
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 

利害阿

                                 情况比较复杂,看什么处理器,是内部还是外部的
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 

内核研究得比较深入了

                                 不错
此帖出自stm32/stm8论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

7
 

嗯,很有意思的比较

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 

st的flash运行程序慢

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

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 

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

请看这个帖子的13、14楼:STM32从Flash中运行程序的时序分析
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 

re

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

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表