测试手段如下: 主循环一直在做一个变量的自加(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)->译码->执行(读flash);取指和执行阶段flash的目标地址不是连续的,因此是non-sequencial access,所以会很慢; 打开优化时,(1)(2)(3)都不会造成flash的non-sequential access,所以在flash里的优势(取指和取数据走不同的总线ICode和DCode以及Prefetch)就体现出来了。 出处:lut1lut |
回复:跑在ram里快?还是跑在flash里快?