测试手段如下: 主循环一直在做一个变量的自加(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 |