1- 簡介
1.1 軟件定時器簡述
軟件定時器就是允許函數(shù)設(shè)置一定的等待時間,然后執(zhí)行。定時器執(zhí)行的函數(shù)被稱為定時器的回調(diào)函數(shù)。定時器從啟動到執(zhí)行回調(diào)函數(shù)之間的時間稱為定時器的周期。定時器的回調(diào)函數(shù)在定時器的時間到達時執(zhí)行。
軟件定時器要先創(chuàng)建才能使用。
1.2 軟件定時器有效的實現(xiàn)
軟件定時器功能的實現(xiàn)是非常容易的,但是想要有效的實現(xiàn)可能會優(yōu)點困難,FreeRTOS的定時器,不會從中斷中執(zhí)行定時器的回調(diào)函數(shù),除非定時器到達了,否則不會消耗任何的運算時間,不會像時鐘中添加任何的運算負擔,如果中斷禁用了,也不會遍歷任何的鏈表結(jié)構(gòu)。
定時器服務(wù)任務(wù)主要利用了FreeRTOS的一些特性,允許像應(yīng)用程序添加定時器功能,而對于應(yīng)用程序可執(zhí)行的程序影響最小。
1.3 有關(guān)定時器的回調(diào)函數(shù)
定時器回調(diào)函數(shù)在定時器服務(wù)任務(wù)中進行執(zhí)行,所以定時器回調(diào)函數(shù)不要試圖阻塞。比如,定時器回調(diào)函數(shù)在訪問隊列或信號量時不能調(diào)用vTaskDelay()、vTaskDelayUntil()或指定非零阻塞時間。
2- 定時器服務(wù)和定時器命令隊列
計時器功能是可選的,不是FreeRTOS核心內(nèi)核的一部分。相反,它是由定時器服務(wù)任務(wù)提供的。
FreeRTOS提供了一組與定時器相關(guān)的API函數(shù)。其中許多函數(shù)使用標準的FreeRTOS隊列向計時器服務(wù)任務(wù)發(fā)送命令。用于此目的的隊列稱為timer command queue。timer command queue是FreeRTOS定時器實現(xiàn)的私有命令,不能直接訪問。
下圖演示了這種情況。左邊的代碼表示一個函數(shù),它是用戶應(yīng)用程序的一部分,并從作為同一用戶應(yīng)用程序的一部分創(chuàng)建的任務(wù)中調(diào)用。右邊的代碼表示定時器服務(wù)任務(wù)的實現(xiàn)。定時器命令隊列是連接應(yīng)用任務(wù)和定時器服務(wù)任務(wù)的紐帶。在本例中,從應(yīng)用程序代碼調(diào)用xTimerReset() API函數(shù)。這導(dǎo)致將重置命令發(fā)送到定時器命令隊列,由定時器服務(wù)任務(wù)處理。應(yīng)用程序代碼只調(diào)用xTimerReset() API函數(shù)——它沒有(也不能)直接訪問定時器命令隊列。
3-軟件定時器程序配置
要使FreeRTOS 軟件計時器 API在應(yīng)用程序中可用,只需:
將 FreeRTOS/Source/timers.c 源文件添加到您的項目中,以及在應(yīng)用程序 FreeRTOSConfig.h 頭文件中定義。下面這個表是一些常量:
4- 自動沖加載
定時器有兩種類型:單觸發(fā)定時器和自動重新加載定時器。一旦啟動,單觸發(fā)定時器只會執(zhí)行它的回調(diào)函數(shù)一次。它可以手動重新啟動,但不能自動重新啟動。相反,自動重新加載定時器一旦啟動,在每次執(zhí)行回調(diào)函數(shù)后都會自動重新啟動,導(dǎo)致周期性的回調(diào)執(zhí)行。
下圖演示了,單觸發(fā)定時器和自動重載之間的區(qū)別,在此圖中,定時器1為周期等于100的單次定時器,計時器2是自動重加載周期等于200次的定時器。
5-定時器的重置
重新設(shè)置已經(jīng)開始運行的定時器。重置定時器會導(dǎo)致定時器重新計算其達到的時間,這種行為在下面的圖中得到了展示,其中定時器1是一個周期為5秒的單觸發(fā)定時器。
-
軟件定時器
+關(guān)注
關(guān)注
0文章
18瀏覽量
6719 -
定時器
+關(guān)注
關(guān)注
23文章
3218瀏覽量
113665 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61721 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11508
發(fā)布評論請先 登錄
相關(guān)推薦
評論