This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28335 求模指令:% 是怎么处理的 速度快不快 用没用到除法



x=x%y

if(x>y)

{

     x-=y

}

哪个效率高一点 在中断中执行

  • %求模没有使用除法,而是通过repeat多次减法来实现的,原理上与你的方法一样,但由于它是固定次数,时间上要多一些。

    你可以尝试看一下指令集里里有关%运算的汇编代码,或者自己简单测试一下,我这看到的是对于Unit16的数,使用clock计算,%需要34个时钟,而后者大概10来个,应该更少,因为我多赋了一次值。

    下面是对应的汇编代码供参考:

    Uint16 aaa;
    Uint16 bbb;
    Uint16 ccc;

       ccc = aaa%bbb;

       if(aaa>bbb)
       {
            aaa-=bbb;
            ccc = aaa;
       }

    111        ccc = aaa%bbb;
            C$DW$L$_main$2$E, C$L2:
    008aed:   761F0284    MOVW         DP, #0x284
    008aef:   9201        MOV          AL, @0x1
    008af0:   9300        MOV          AH, @0x0
    008af1:   00C08C0C    FFC          XAR7, U$$MOD
    008af3:   9602        MOV          @0x2, AL
    113        if(aaa>bbb)
    008af4:   9200        MOV          AL, @0x0
    008af5:   5401        CMP          AL, @0x1
    008af6:   6704        SB           C$L3, HIS
    115             aaa-=bbb;
    008af7:   7401        SUB          @0x1, AL
    116             ccc = aaa;
    008af8:   9201        MOV          AL, @0x1
    008af9:   9602        MOV          @0x2, AL

  • 我为什么我测试出来的时间 %所用的时间更短一下,我用的PWM CTR的值计算的时间

  • 你如何确定你的PWM CTR没有越过多个周期?

    如果单独地想测试时间,可以使用CCS的clock功能,更简单粗暴的是在语句前后加入GPIO翻转,直接通过示波器观察。