欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 延時程序時間精度的深度分析 [打印本頁]

作者: yantao    時間: 2010-5-28 11:09
標(biāo)題: 延時程序時間精度的深度分析

對于需要精確計時的場景,用C語言開發(fā)單片機應(yīng)用就有些困難了,本文將在開源軟件SDCC環(huán)境下對延時程序進行深入分析,不正確的地方請大家指正。

 

首先是單片機的三個周期: 

先看這個延時程序代碼:

void delay(unsigned int val)
{
    unsigned int j = 0;
    for (; val>0; val--)
    {
        for (j=0; j<125; j++)
        {
            ;
        }
    }
}

 

通過SDCC對其進行編譯,生成*.asm(sdcc -c *.c)。雖然我們可以使用C語言開發(fā)單片機應(yīng)用,但是并不代表我們不需要掌握匯編語言,在很多場合下雖然不需要我們編寫匯編語言代碼,但是看懂編譯器生成的匯編語言代碼的能力還是需要具備的。

 

 

_delay:

ar2 = 0x02

ar3 = 0x03

ar4 = 0x04

ar5 = 0x05

ar6 = 0x06

ar7 = 0x07

ar0 = 0x00

ar1 = 0x01

mov r2,dpl ; 寄存器尋址方式,將DPTR低字節(jié)存入r2中,2個機器周期

mov r3,dph; 寄存器尋址方式,將DPTR低字節(jié)存入r3中,2個機器周期

; comm.c:7: unsigned int j = 0;

00104$:

; comm.c:8: for (; val>0; val--)

mov a,r2; 寄存器尋址,2個機器周期

orl a,r3; r3a進行邏輯或操作,1個機器周期

jz 00110$; 如果是零,則將r40,并傳給a,在jz 00108$將跳到結(jié)束,2個機器周期

mov r4,#0x01; 否則執(zhí)行內(nèi)循環(huán),立即數(shù)尋址,1個機器周期

sjmp 00111$; 短無條件跳轉(zhuǎn)指令,2個機器周期

00110$:

movr4,#0x00; 立即數(shù)尋址,1個機器周期

00111$:

mov a,r4; 寄存器尋址,2個機器周期

jz 00108$; 判斷外循環(huán)是否結(jié)束,2個機器周期

; comm.c:10: for (j=0; j<125; j++)

mov r4,#0x7D; 0x7D125,立即數(shù)尋址,1個機器周期

mov r5,#0x00; 立即數(shù)尋址,1個機器周期

00103$:

dec r4; 把內(nèi)循環(huán)改為for (j=125; j>0; j--)了,寄存器尋址,1個機器周期

cjne r4,#0xff,00121$; r40xff比較,不等于轉(zhuǎn)移到00121$處,等于時表明需要向上借位,2個機

                                ; 器周期

dec r5; 寄存器尋址,1個機器周期

00121$:

mov a,r4; 寄存器尋址,2個機器周期

orl a,r5; r3a進行邏輯或操作,1個機器周期

jnz 00103$; 不為零轉(zhuǎn)到內(nèi)循環(huán)開始處,2個機器周期

; comm.c:8: for (; val>0; val--)

dec r2; 寄存器尋址,1個機器周期

cjne r2,#0xff,00123$; 判斷是非需要借位,2個機器周期

dec r3; 寄存器尋址,1個機器周期

00123$:

sjmp 00104$; 短無條件跳轉(zhuǎn)指令,2個機器周期

00108$:

ret; 2個機器周期


val*34+2個機器周期,如果采用f_osc=11.0592MHz晶振,機器周期Tcy=1.085us,則delay函數(shù)的精度為(1*34+2)*1.085us=39.06us

 

 






歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1