|
0006 ?C0010: 0006 22 RET FUNCTION _delay2 (END) 真是不看不知道~~~一看才知道這個(gè)延時(shí)程序是多么的不準(zhǔn)點(diǎn)~~~光看主要的那四條語句,就需要6個(gè)機(jī)器周期。也就是說,它的精度頂多也就是6us而已,這還沒算上一條 lcall 和一條 ret。如果我們把調(diào)用函數(shù)時(shí)賦的i值根延時(shí)長度列一個(gè)表的話,就是: i delay time/us 0 6 1 12 2 18 ... 因?yàn)楹瘮?shù)的調(diào)用需要2個(gè)時(shí)鐘周期的lcall,所以delay time比從函數(shù)代碼的執(zhí)行時(shí)間多2。順便提一下,有的朋友寫的是這樣的代碼: void delay2(unsigned char i) { unsigned char a; for(a = i; a != 0; a--); } 可能有人認(rèn)為這會(huì)生成更長的匯編代碼來,但是事實(shí)證明: FUNCTION _delay2 (BEGIN) SOURCE LINE # 18 ;---- Variable ''i'' assigned to Register ''R7'' ---- SOURCE LINE # 19 SOURCE LINE # 21 ;---- Variable ''a'' assigned to Register ''R7'' ---- 0000 ?C0007: 0000 EF MOV A,R7 0001 6003 JZ ?C0010 0003 1F DEC R7 0004 80FA SJMP ?C0007
|