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