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

ESP32 之 ESP-IDF 教學(三)——通用硬件定時器(Timer)

評論