整理STC延時函式時遇到的玄學問題

2022-09-09 00:30:23 字數 1813 閱讀 7730

void

delay

while (--i);

}

void

delay

}

以上兩段**,第一段為stcisp提供的1ms延時函式,第二段為改編版。按照個人對c語言的理解,這兩種寫法所得到的結果應該是一致的,最起碼在dev-c++上以下兩端**輸出結果相同,均為2739:

int main(int argc, char *ar**) 

}printf(

"num=%d\n

",num);

return0;

}int main(int argc, char *ar**)

} while (--i);

printf(

"num=%d\n

",num);

return0;

}

但開頭提到的兩段**,在stc15f104(11.0592m)微控制器上跑起來其延時結果卻截然不同。實測在預設延時500ms時(即重複執行上述函式500次),第一段**比較符合實際,第二段要比第一段要慢一倍左右,即將第二段**中的11改為6後可以得到大體相同的延時結果。

造成這種現象的原因,到現在也沒搞清楚,我發表在開源電子網的提問貼截止到目前也沒有收到合理的解釋。我不打算再耗下去

,只能強行解釋一波了:

造成延時結果不同的原因是微控制器在執行 while()...; 和 do...while(); 時的效率不同。

這解釋很有道理,因為在while()...; 和 do...while();在彙編**中的長度的確相差一倍左右。但仍不能很好解釋延時結果相差之大。因為無論是 while()...; 和 do...while(); ,在延時函式中僅僅執行了11次而已,真正起決定性作用的應該是中間那段

while (--j); ,在如此大基數的迴圈下, while()...; 和 do...while();  相差的那點時間應該顯得微不足道才對啊。

算了,這件事告一段落了,不打算再在這上面浪費時間了。下面附上 while()...; 和 do...while(); 的彙編**。****於網路,其實我也不懂。

/*

*** while 語句 pseudo-code *******

*/while

( condition ) /*

***while 語句 assembly language ******

*/while

: ; code to

setflags based on condition

jxx endwhile

; body of loop

jmp

while

endwhile:

/****while 語句 assembly language (end) **

*//*

*** do while 語句 pseudo-code *******

*/do

while

( condition )

/****do while 語句 assembly language ******

*/do_while:

; body of loop

; code to

setflags based on condition

jxx do_while

/****do while 語句 assembly language (end) **

*/

分享下常用函式 工作時遇到的

工作幾個月了,現在暫時做測試,理由就是開發在思維上有一定侷限性,暫時做一段時間的測試吧,但是php一直還在看,總結下自己曾經用到過的函式有興趣的可以自己去查查 數字 ctype digit is numeric intval 看看ctype digit與is numeric過濾數字時候的 區別,in...

分享下常用函式 工作時遇到的

工作幾個月了,現在暫時做測試,理由就是開發在思維上有一定侷限性,暫時做一段時間的測試吧,但是php一直還在看,總結下自己曾經用到過的函式有興趣的可以自己去查查 數字 ctype digit is numeric intval 看看ctype digit與is numeric過濾數字時候的 區別,in...

C語言 使用函式時遇到的問題

函式是一段 塊,由 返回型別 函式名 函式引數 構成。定義函式有兩種方式。一種是宣告與函式體放在一起,另一種是在main函式之前進行宣告,把函式塊放在 最後。我們通常使用後者 如下所示 include intfunction int a,int b int main intfunction int ...