如何正確計(jì)算多重循環(huán)延時(shí)程序的延時(shí)時(shí)間
題目:MCS-51單片機(jī),使用 6MHz 晶振,一個(gè)機(jī)器周期為 2us,計(jì)算出下列程序的延時(shí)時(shí)間。
DEL: MOV R5, #100
DEL0: MOV R6, #200
DEL1: MOV R7, #248
DEL2: DJNZ R7, DEL2
DJNZ R6, DEL1
DJNZ R5, DEL0
RET
最佳答案: 題目中的答案是錯(cuò)的。應(yīng)該是:19 960 606 us。
本題目的程序,共有三重循環(huán),耗時(shí)的正確計(jì)算方法,可見下圖。
后記:
能夠精確計(jì)算程序的執(zhí)行時(shí)間,是匯編語言的長(zhǎng)處。而用C語言編寫程序,執(zhí)行的時(shí)間只能進(jìn)行估算和測(cè)試。
但是有很多網(wǎng)友,都把這兩者弄混了:
在用C語言編程的時(shí)候,偏要追問程序執(zhí)行時(shí)間的計(jì)算公式;
在用匯編語言編程的時(shí)候,卻采用簡(jiǎn)略的時(shí)間計(jì)算方法。
特別是現(xiàn)在這道題,要求精確算出 us 量級(jí)的數(shù)值,很明顯是應(yīng)該采用精確的計(jì)算方法。多數(shù)網(wǎng)友卻馬虎的很!采用了簡(jiǎn)略的算法。如果這是考試題,顯然會(huì)掛科一批人。
精確的計(jì)算方法,其實(shí)并不難,看看插圖,劃分出幾個(gè)循環(huán)結(jié)構(gòu)的圈,逐“層”計(jì)算即可。
如果用簡(jiǎn)易的估算方法,只是計(jì)算主要的循環(huán)體(本題僅為2T)的循環(huán)耗時(shí)時(shí)間,過程如下:
100 * 200 * 248 * 2T = 9 920 000 T
如:T = 2us,則延時(shí)時(shí)間為:19 940 000 us 。
這個(gè)數(shù)字和精確計(jì)算的結(jié)果相比,誤差約為千分之一。這個(gè)算法,在實(shí)際應(yīng)用方面,是完全可以的。
但是,這個(gè)簡(jiǎn)易的算法,精度僅在 10ms 的等級(jí),如果作為理論分析來用,誤差還是相當(dāng)大的。
另外,用 keil 軟件進(jìn)行單步調(diào)試的時(shí)候,所耗用所機(jī)器周期和時(shí)間, keil 都能夠十分清晰給出,它要比 Proteus 軟件的效果好得多。
對(duì)于本題目,做而論道提出的答案,完全得到了驗(yàn)證,可見插圖所示。