打印

用C语言看CCS的编译效率 -- ( 1 ) 比较两数大小

[复制链接]
1614|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dontium|  楼主 | 2014-10-8 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dontium 于 2014-10-9 10:28 编辑

比较两数大小
编译器CCS V6
CPU C2000
任务:比较两数大小
目的:看看CCS会不会用C28 的MAX、MIN指令
例句:

    使用C语言编程,其C语句如下,
      if  ( xyz >abc )
              abc= xyz;
        即判断最大数,并将其保留。
    在C28CPU中,有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       @_abcAL       ; 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中的MAXMIN)指令,可见,编译器对CPU指令的应用还不到位,对CPU效率的发挥还存在障碍。

相关帖子

沙发
aozima| | 2014-10-8 17:31 | 只看该作者
DSP的编译器主要任务针对重复度很高的特定算法优化做得很利害。
如果仅是比较大小,我觉得效率差异不是很明显。
当然,如果也能优化上去肯定是最好的。

使用特权

评论回复
板凳
dirtwillfly| | 2014-10-8 19:47 | 只看该作者
感谢楼主分享。
楼上说的有道理。楼主可以用计算圆周率或者其他测试mcu性能的算法来测试

使用特权

评论回复
地板
angerbird| | 2014-10-17 17:56 | 只看该作者
谢谢分享,,讲解的非常详细的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:官向官来民向民,穷人向的是穷人

151

主题

1173

帖子

10

粉丝