STM32
直播中

陈韵瑄

8年用户 1063经验值
私信 关注
[问答]

跑在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
测试结果如下:
不对代码优化@ 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)- gt;译码- gt;执行(读flash);取指和执行阶段flash的目标地址不是连续的,因此是non-sequencial access,所以会很慢;
打开优化时,(1)(2)(3)都不会造成flash的non-sequential access,所以在flash里的优势(取指和取数据走不同的总线ICode和DCode以及Prefetch)就体现出来了。

出处:lut1lut

回帖(1)

倪驰銮

2024-5-18 15:35:24
在RAM中跑得快
举报

更多回帖

发帖
×
20
完善资料,
赚取积分