在單片機項目開發過程中,經常會出現一個有趣的問題,即弄清楚如何延遲代碼執行。有時,單片機開發人員可能只是希望有10微秒的延遲,以使I/O線在讀取之前穩定下來,或者可能希望在兩次讀取之間指定的時間間隔使它反跳。在本文中,我們將探討五種延遲代碼執行的技術。
一、條件循環
第一種技術是使用條件循環(可能是最常用和最簡單的)。條件循環延遲通常會使用for、while或do while循環重復執行無操作(NOP)指令。例如:
for(int i = 0; i < 100000; i++)
{
__NOP();
}
條件延遲在緊要關頭可能會很有用,但很難準確或有效。如果開發人員要針對其他操作模式(例如低功耗操作)調整時鐘頻率,則延遲時間將完全不同。另外,總會有一個問題,那就是到底有多長時間?有人可能會認為這是100000條指令,但是每次通過循環時,都會有其他指令來檢查循環變量并遞增i。這些時序循環對于在任何生產代碼中使用來說都是不可預測的。
二、使用計時器
可以使用的第二種技術是利用單片機內置的硬件計時器。通常有幾種不同的硬件計時器可用于跟蹤系統時間,生成波形,捕獲輸入和通用。如果開發人員需要延遲(例如10微秒),則可以向硬件計時器加載表示10微秒的計數值。在這種情況下,計時器將設置為單次計時器。該代碼將啟動計時器并等待計時器溢出標志被設置,然后該標志將指示時間已過。
該代碼類似于以下內容:
Timer_Reload (DELAY_VALUE );
while(Timer_Expired ()== false )
{
__NOP ();
}
這種技術比條件循環要強大得多。它還具有更高的靈活性,并且可以更輕松地針對所需的延遲時間進行調整。實際上,可以在整個代碼中重用該API,以允許單個計時器用于所需的任何數量的延遲。
三、使用系統刻度(HAL示例)
在某些情況下,可能沒有專用的硬件計時器。在這種情況下,單片機開發人員可以利用板載系統時鐘來創建延遲。即使是裸機系統,通常也具有作為系統時鐘的后臺計時器,以便從單片機啟動的那一刻起,軟件就具有時間參考。通常,在典型系統中,將這些系統時鐘設置為每1或10毫秒發生一次。
系統通常使用一些API,這些API允許開發人員訪問當前的系統刻度,例如SysTick_Get()。開發人員可以利用此延遲來創建類似于以下內容的延遲:
TimeStart = SysTick_Get();
do
{
TimeNow = SysTick_Get();
TimeDelta = TimeNow – TimeStart;
}while(TimeDelta < DelayTime);
單片機開發人員只需要確保如果他們這樣做,就不會陷入計算問題或其他潛在問題中,因此應檢查邊界條件。
四、使用RTOS產量函數
在使用實時操作系統(RTOS)的更高級的系統中,開發人員可以利用內置的RTOS API調用來產生創建延遲的任務。例如,如果開發人員正在使用FreeRTOS,則在他們的任務中他們可以使用如下代碼:
VTaskDelay (1);
此延遲功能將使任務產生一個RTOS滴答聲的當前任務。取決于配置,RTOS滴答可以設置為1毫秒或10。使用這樣的延遲機制可能會出現問題,因為任務將在該時間段內產生CPU,但不能保證一旦系統滴答時間到期,該任務將是最高優先級的任務!如果任務是準備運行的最高優先級任務,則該任務僅在延遲后立即運行,因此延遲時間可能會有些抖動。
五、使用RTOS對象
使用RTOS對象來延遲時間。如果你仔細查看自己喜歡的RTOS中的對象(例如信號量、互斥對象和隊列)的API,你會注意到大多數等待等待的API調用還將包含延遲時間。此延遲時間也可導致應用程序延遲。
與RTOS對象相關的是,大多數RTOS都還包含軟定時器。這些是基于軟件的計時器,是從運行中的硬件計時器觸發的。然后,可以將與上面第一、二點中顯示的技術相似的技術與這些軟計時器一起使用,以在代碼執行中產生延遲。
單片機開發人員想要延遲代碼執行,可以使用多種不同的技術,使用的技術將取決于系統中可用的軟件和硬件資源。然后,開發人員可以決定他們要使用的解決方案的復雜程度??傊?,肯定有很多種機制可以幫助將代碼執行延遲一定的時間。
以上就是英銳恩單片機開發工程師分享的單片機開發過程中5種延遲代碼執行的技術。英銳恩專注單片機應用方案設計與開發,同時提供8位單片機、16位單片機、32位單片機、運放芯片和模擬開關。如果你需要更多單片機方案產品的信息,請撥打官網電話:4007-888-234,或點擊“在線咨詢”,我們的客服人員將為你提供更詳細的解答。