1- 簡介
1.1 軟件定時器簡述
軟件定時器就是允許函數(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)。
定時器服務任務主要利用了FreeRTOS的一些特性,允許像應用程序添加定時器功能,而對于應用程序可執(zhí)行的程序影響最小。
1.3 有關定時器的回調(diào)函數(shù)
定時器回調(diào)函數(shù)在定時器服務任務中進行執(zhí)行,所以定時器回調(diào)函數(shù)不要試圖阻塞。比如,定時器回調(diào)函數(shù)在訪問隊列或信號量時不能調(diào)用vTaskDelay()、vTaskDelayUntil()或指定非零阻塞時間。
2- 定時器服務和定時器命令隊列
計時器功能是可選的,不是FreeRTOS核心內(nèi)核的一部分。相反,它是由定時器服務任務提供的。
FreeRTOS提供了一組與定時器相關的API函數(shù)。其中許多函數(shù)使用標準的FreeRTOS隊列向計時器服務任務發(fā)送命令。用于此目的的隊列稱為timer command queue。timer command queue是FreeRTOS定時器實現(xiàn)的私有命令,不能直接訪問。
下圖演示了這種情況。左邊的代碼表示一個函數(shù),它是用戶應用程序的一部分,并從作為同一用戶應用程序的一部分創(chuàng)建的任務中調(diào)用。右邊的代碼表示定時器服務任務的實現(xiàn)。定時器命令隊列是連接應用任務和定時器服務任務的紐帶。在本例中,從應用程序代碼調(diào)用xTimerReset() API函數(shù)。這導致將重置命令發(fā)送到定時器命令隊列,由定時器服務任務處理。應用程序代碼只調(diào)用xTimerReset() API函數(shù)——它沒有(也不能)直接訪問定時器命令隊列。

3-軟件定時器程序配置
要使FreeRTOS 軟件計時器 API在應用程序中可用,只需:
將 FreeRTOS/Source/timers.c 源文件添加到您的項目中,以及在應用程序 FreeRTOSConfig.h 頭文件中定義。下面這個表是一些常量:

4- 自動沖加載
定時器有兩種類型:單觸發(fā)定時器和自動重新加載定時器。一旦啟動,單觸發(fā)定時器只會執(zhí)行它的回調(diào)函數(shù)一次。它可以手動重新啟動,但不能自動重新啟動。相反,自動重新加載定時器一旦啟動,在每次執(zhí)行回調(diào)函數(shù)后都會自動重新啟動,導致周期性的回調(diào)執(zhí)行。
下圖演示了,單觸發(fā)定時器和自動重載之間的區(qū)別,在此圖中,定時器1為周期等于100的單次定時器,計時器2是自動重加載周期等于200次的定時器。

5-定時器的重置
重新設置已經(jīng)開始運行的定時器。重置定時器會導致定時器重新計算其達到的時間,這種行為在下面的圖中得到了展示,其中定時器1是一個周期為5秒的單觸發(fā)定時器。

-
軟件定時器
+關注
關注
0文章
18瀏覽量
7022 -
定時器
+關注
關注
23文章
3350瀏覽量
121306 -
FreeRTOS
+關注
關注
14文章
496瀏覽量
66039 -
回調(diào)函數(shù)
+關注
關注
0文章
93瀏覽量
12094
發(fā)布評論請先 登錄
最簡單的滴答定時器程序簡介
stm32定時器中斷程序
μC/OS-II的軟件定時器的改進的方法
555定時器應用設計軟件免費下載
設計軟件定時器
ESP32 之 ESP-IDF 教學(三)——通用硬件定時器(Timer)
單片機軟件定時器的實現(xiàn)方法

軟件定時器簡介及程序配置
評論