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.

一些关于DSP执行步骤的疑问?



①在DSP 2809中,我有以下执行语句:

long VinActualValue=3000;

int FixedDutyValue=361;

int VoutCalValue=0;

VoutCalValue=(VinActualValue*FixedDutyValue)/1000;

请问DSP在执行此条语句"VoutCalValue=(VinActualValue*FixedDutyValue)/1000;"时的顺序是什么呢?我能确定(VinActualValue*FixedDutyValue)/1000的值不超过int的长度.

猜想一:VoutCalValue=VinActualValue*FixedDutyValue;(int型乘以long型,会强制把int型转换成long型(正确否?),此条语句执行导致数据溢出)

            VoutCalValue=VoutCalValue/1000;(运行结果出错)

猜想二:Temp=VinActualValue*FixedDutyValue;(Temp是DSP临时为语句执行分配的一个long型变量)

             VoutCalValue=Temp/1000;(运行结果正确)

  • Haypin Tse,
     VoutCalValue=(VinActualValue*FixedDutyValue)/1000的执行顺序是先乘再除。
    将你的代码转化成汇编之后:(硬件:F28027)
    143         VoutCalValue=(VinActualValue*FixedDutyValue)/1000;
    000162:   761F001C    MOVW         DP, #0x1c    
    000164:   8F0003E8    MOVL         XAR4, #0x0003e8     //XAR4 = 1000;
    000166:   56210000    MOVX         TL, @0x0                  //XT= FixedDutyValue)
    000168:   A842        MOVL         *-SP[2], XAR4
    000169:   56440008    IMPYL        ACC, XT, @0x8         // ACC = VinActualValue*FixedDutyValue
    00016b:   00C00262    FFC          XAR7, L$$DIV            // ACC = (VinActualValue*FixedDutyValue)/1000
    00016d:   9601        MOV          @0x1, AL     
     
    因此你的猜想二是正确的,只是没有用Temp。
  • Martin Yu老师,汇编我忘了,还是看不懂呢。

    意思是说VoutCalValue=(VinActualValue*FixedDutyValue)/1000.意思是不是在执行VinActualValue*FixedDutyValue时,把结果放到ACC中,从而不会溢出.

    故可以说:

    ong VinActualValue=3000;

    int FixedDutyValue=361;

    int VoutCalValue=0;

    VoutCalValue=(VinActualValue*FixedDutyValue)/1000;

    它的执行结果不会出错。可以在程序中使用吧?

  • 是的,3000*361 = 108300=0x00108678,肯定不会溢出的。

  • 嗯,懂了,它中间结果是存在累加器里面.所以不会溢出。最终结果才从累加器赋值到VoutCalValue.