本帖最后由 dontium 于 2014-10-9 10:28 编辑
比较两数大小编译器:CCS V6CPU: C2000任务:比较两数大小目的:看看CCS会不会用C28 的MAX、MIN指令
例句:
使用C语言编程,其C语句如下, if ( xyz >abc ) abc= xyz; 即判断最大数,并将其保留。 在C28的CPU中,有16位最大(最小)数的比较指令,也有32位的最大(最小)数的比较指令,16位及32位的比较指令均为单周期,16位比较指令可以嵌套重复指令,32位的却不能。如果使用汇编语言,最少可以用两个指令(MOVW指令为定位数据段,如果之前的指令在同一段内,可以省去)。最佳效果为: MOVW DP,#_abc ; 1周期,定位数据段,并假设两数均在同一段内(下同) MOV AL, @_abc ; 1周期 MAX AL, @_xyz ; 1周期 现在使用CCS V6编译器,在不同情况下对上述C语句进行编译,以下是几种情况下的编译结果一、不优化时 MOVW DP, #_abc MOV AL,@_abc ; 1周期 CMP AL,@_xyz ; 1周期 B $C$L2,HIS ;7周期(条件真)/ 4周期(条件假)| MOV AL,@_xyz ;1周期 MOV @_abc,AL ; 1周期$C$L2,HIS: ……二、0级优化语句同上三、1级优化, MOV AL,@_abc MOVB @_xyz,#55,UNC CMPB AL,#55 ; B $C$L2,LOS ; MOV @_xyz,AL ; $C$L2,LOS: ……四、2级优化 MOVW DP,#_xyz ; MOV AL,@_abc ; . MOVB @_xyz,#55,UNC ; CMPB AL,#55 ; MOV @_xyz,AL,HI ; 五、3级优化 MOVW DP,#_xyz ; MOV AL,@_abc ; MOVB @_xyz,#55,UNC ; CMPB AL,#55 ; MOV @_xyz,AL,HI ;六、4级优化 MOVW DP,#_xyz ; MOV AL,@_abc ; MOVB @_Txyz,#55,UNC ; CMPB AL,#55 ; MOV @_Txyz,AL,HI ; 七、4级优化+优化速度最快 MOVW DP,#_xyz ; MOV AL,@_abc ; MOVB @_xyz,#55,UNC ; CMPB AL,#55 ; MOV @_xyz,AL,HI ;
由上可见,在1级优化以前,都使用了跳转指令,它会占用很多时间(7个或4个周期), 而在后面的优化级别里,使用了有条件保存(MOV loc16, AX, COND)这样一条指令,但是,用这个指令必须要有标志位的支持,所以都不例外地使用了CMP指令。 在所有的优化级别里,均未用到C28中的MAX(MIN)指令,可见,编译器对CPU指令的应用还不到位,对CPU效率的发挥还存在障碍。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
楼上说的有道理。楼主可以用计算圆周率或者其他测试mcu性能的算法来测试
一周热门 更多>