在嵌入式項目中,軟件開發(fā)基本上都會使用到延時,那么,該用軟件延時還是硬件延時?它們又有什么區(qū)別呢?
今天就來講講關(guān)于硬件延時和軟件延時的內(nèi)容,以及它們的區(qū)別。
一、硬件和軟件延時
延時的種類很多,先給大家普及一下延時相關(guān)概念和分類。
硬件延時:
指利用具有計數(shù)功能的硬件進(jìn)行延時。
比如:定時器(Timer)、 實時時鐘(RTC)、系統(tǒng)滴答定時器(SysTick)等具有計數(shù)功能的硬件。
軟件延時:相對硬件延時而言,軟件延時就是寫一段軟件代碼,通過消耗CPU時間進(jìn)行延時。比如軟件延時函數(shù):
void Delay(uint32_t Cnt){ uint32_t i;
while(Cnt--) { for(i=0; i<0x80000; i++); }}
二、阻塞和非阻塞延時
實際應(yīng)用中,延時分阻塞和非阻塞延時。阻塞延時:指CPU一直停留阻塞,不去做其它事情,直到延時結(jié)束結(jié)束。像上面那個軟件延時(Delay)就是一個典型的阻塞延時,一直消耗CPU,直到延時結(jié)束。
非阻塞延時:
指在延時期間,沒有阻塞CPU,也就是說CPU在延時期間可以執(zhí)行其它代碼。
比如:利用定時器中斷延時,只需要開啟定時器,在中斷(計數(shù))到來之前,CPU可以執(zhí)行其它代碼。
額外舉例:
利用定時器也能實現(xiàn)阻塞延時,比如STM32的HAL自帶的阻塞延時:
__weak void HAL_Delay(uint32_t Delay){ uint32_t tickstart = HAL_GetTick(); uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */ if (wait < HAL_MAX_DELAY) { wait += (uint32_t)(uwTickFreq); }
while ((HAL_GetTick() - tickstart) < wait) { }}
利用RTOS自帶的系統(tǒng)延時實現(xiàn)非阻塞延時,這個實現(xiàn)原理實際是利用了硬件延時(系統(tǒng)滴答定時器)。
當(dāng)然,這個延時的原理(延時函數(shù)代碼)相對比較復(fù)雜,對于普通用戶只需要知道如何調(diào)用以及簡單原理即可,感興趣的老鐵可以自行研究一下。
通常在一些RTOS的(Demo)例子的任務(wù)中都有系統(tǒng)延時,比如ucos非阻塞延時:
OSTimeDly(10);
再比如FreeRTOS非阻塞延時:
vTaskDelay(10);
關(guān)于RTOS的延時,這里額外拓展一下關(guān)于RTOS中的相對延時和絕對延時的內(nèi)容,請移步至文章《RTOS中相對延時和絕對延時的區(qū)別》
三、阻塞和非阻塞延時
通過以上分析,其實不難得出,硬件延時相對軟件延時更普遍。
1.軟件相對硬件延時精度更差;2.軟件延時為阻塞延時,硬件延時可阻塞,也可非阻賽延時;
3.硬件延時應(yīng)用更靈活、更廣泛;
......實際應(yīng)用中,硬件延時、非阻塞延時相對更普遍。
-
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317579 -
軟件
+關(guān)注
關(guān)注
69文章
5154瀏覽量
89221 -
單片機(jī)硬件
+關(guān)注
關(guān)注
0文章
3瀏覽量
6792
發(fā)布評論請先 登錄
單片機(jī)軟件延時精確如何計算
51單片機(jī)的幾種精確延時
單片機(jī)精確毫秒延時函數(shù)
單片機(jī)有哪些品牌和單片機(jī)軟件延時10ms的程序及有哪些排序算法

使用51單片機(jī)進(jìn)行延時時間計算實例的詳細(xì)資料說明

單片機(jī)延時是怎么實現(xiàn)的
單片機(jī)延時問題20問

51單片機(jī)實戰(zhàn)教程(四 延時程序)

51單片機(jī)的幾種精確延時

評論