- void Delay
- {
- unsigned char i, j;
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
-
-
-
- void Delay
- {
- unsigned char i, j;
- i = 11;
- j = 190;
- while(i--)
- {
- while (--j);
- }
- }
-
復制代碼
以上兩段代碼,第一段為STCISP提供的1ms延時函數(shù),第二段為改編版。按照個人對C語言的理解,這兩種寫法所得到的結果應該是一致的,最起碼在Dev-C++上以下兩端代碼輸出結果相同,均為2739:
- int main(int argc, char *argv[])
- {
- unsigned char i, j;
- int num = 0;
- i = 11;
- j = 190;
- while(i--)
- {
- while (--j)
- {
- num++;
- }
- }
- printf("num=%d\n",num);
- return 0;
- }
- int main(int argc, char *argv[])
- {
- unsigned char i, j;
- int num = 0;
- i = 11;
- j = 190;
- do
- {
- while (--j)
- {
- num++;
- }
- } while (--i);
- printf("num=%d\n",num);
- return 0;
- }
復制代碼
但開頭提到的兩段代碼,在STC15F104(11.0592M)單片機上跑起來其延時結果卻截然不同。實測在預設延時500ms時(即重復運行上述函數(shù)500次),第一段代碼比較符合實際,第二段要比第一段要慢一倍左右,即將第二段代碼中的11改為6后可以得到大體相同的延時結果。
造成這種現(xiàn)象的原因,到現(xiàn)在也沒搞清楚,我發(fā)表在開源電子網的提問貼截止到目前也沒有收到合理的解釋。我不打算再耗下去,只能強行解釋一波了:
造成延時結果不同的原因是單片機在執(zhí)行 while()...; 和 do...while(); 時的效率不同。
這解釋很有道理,因為在 while()...; 和 do...while(); 在匯編代碼中的長度的確相差一倍左右。但仍不能很好解釋延時結果相差之大。因為無論是 while()...; 和 do...while(); ,在延時函數(shù)中僅僅執(zhí)行了11次而已,真正起決定性作用的應該是中間那段 while (--j); ,在如此大基數(shù)的循環(huán)下, while()...; 和 do...while(); 相差的那點時間應該顯得微不足道才對啊。
算了,這件事告一段落了,不打算再在這上面浪費時間了。下面附上 while()...; 和 do...while(); 的匯編代碼。代碼來源于網絡,其實我也不懂。
- /**** while 語句 pseudo-code ********/
- while ( condition )
- {
- body of loop;
- }
- /****while 語句 assembly language *******/
- while:
- ; code to set FLAGS based on condition
- jxx endwhile
- ; body of loop
- jmp while
- endwhile:
- /****while 語句 assembly language (end) ***/
- /**** Do while 語句 pseudo-code ********/
- do
- {
- body of loop;
- }while ( condition )
- /****Do while 語句 assembly language *******/
- do_while:
- ; body of loop
- ; code to set FLAGS based on condition
- jxx do_while
- /****Do while 語句 assembly language (end) ***/
復制代碼
|