本帖最后由 人人學會單片機 于 2021-4-4 19:08 編輯
好久沒有發貼子了,最近都在51hei論壇上回答網友問題。我發現很多個網友都有提問同樣的問題,如何精確的計算delay 里面多少個循環是1ms 。或者說for循環的語句時間多少,循環一次多少時間???比如這樣的一個單片機延時代碼:
void delay_ms(unsigned char ms)
{
unsigned char i,k;
for(i=0;i<ms;i++)
for(k=0;k<110;k++);
}
我今天發這個貼子,并不是告訴小白們如何去計算這種參數,因為真正搞工程項目設計的,壓根就不去計算這種參數的。理由如下:
1、假設在同一個硬件上做測試,單片機CPU指令周期是一致的。那么 變量i、K,存放在data跟存放在XDATA,讀寫速度能一樣?精確計算有意義嗎?
2、假設都存放在data,延遲1ms只需要char類型的變量即可完成,但是,延遲100ms必須16位變量,那么執行時間還能照著公式去套算?
3、假設上述條件都一樣,計算好的延遲時間是1ms并且誤差1%,打開中斷之后,延遲時間變成了5毫秒了。誤差500%了,精確計算有意義嗎?
4、假設上述條件不影響延遲時間,那么,編譯器呢?誰敢說編譯器不同的優化等級不影響delay的延遲時間?
5、還有硬件不同的情況,就需要重新計算了。比如晶振頻率不同,CPU內核速度不同,STC8H單片機就比STC15快了很多了比89系列快了十幾倍了。
實例說明:
下面的代碼,都是使用STC8H8K單片機測試,晶振頻率24M(既FOSC=24000000UL),并且沒有使用任何中斷資源。但是使用了其他函數。
第一種情況,函數延遲時間是1.004ms。
#define FOSC 24000000UL
void TFT_Delay1ms(u8 x)
{
u16 data i;
i=FOSC/10000;
while(i--);
}
第二種情況,給x賦值200,延遲時間是0.1807秒=180.7ms,嘿嘿,多寫一層while死循環,居然少于200ms。
#define FOSC 24000000UL
void TFT_Delay1ms(u8 x)
{
u16 data i;
i=FOSC/10000;
while(i--)
{
while(x--);
}
}
第三種情況,也給x賦值200,變量先減后判,延遲時間是0.1547秒=154.7ms。比上面兩種情況都快。
#define FOSC 24000000UL
void TFT_Delay1ms(u8 x)
{
u16 data i;
i=FOSC/10000;
while(--i)
{
while(--x);
}
}
所以,不要去精確的計算delay 延遲了多少時間,畢竟單片機的運行情況有很多變數。學會提高CPU的代碼執行效率,是很有必要的!
“什么是單片機?咱玩的就是時間!”
WQX-15開發板02 模塊功能展示.jpg (3.01 MB, 下載次數: 120)
下載附件
2021-3-26 10:57 上傳
WQX-15開發板03 核心板.jpg (1.18 MB, 下載次數: 109)
下載附件
2021-3-26 10:57 上傳
WQX-15開發板01 高配全亮.jpg (2.61 MB, 下載次數: 112)
下載附件
2021-3-26 10:57 上傳
|