FreeRTOS常用函數


一、任務

任務創建和刪除
xTaskCreate                                 任務創建
xTaskDelete                                  任務刪除,通過傳入NULL值來刪除自己

任務掛起和恢復
vTaskSuspend()                          暫停一個任務
vTaskSuspendAll()                     暫停調度程序
vTaskResume()                          恢復一個任務的運行
xTaskResumeFromISR()            恢復暫停的任務,從中斷每部調用vTaskResume()函數
xTaskResumeAll()                     僅恢復調度程序,不會恢復暫停的任務

任務切換
taskYIELD()                                  普通任務強制切換
portYIELD_FROM_ISR()              中斷服務程序中任務切換

任務統計
vTaskGetRunTimeStats()              統計每個任務使用CPU的時間,以及所使用的時間占總時間的比例

任務調度器
vTaskStartScheduler()                  開啟任務調度器
prvStartFirstTask()                        啟動第一個任務

任務延時

vTaskDelay()                             任務相對延時,延遲給定的滴答數
vTaskDelayUntil()                      任務絕對延時,從給定的時間,開始延遲給定的滴答數

 

二、隊列

隊列創建
xQueueCreate()                         創建隊列(動態方法)
xQueueCreateStatic()                創建隊列(靜態方法)
xQueueGenericCreate()            通用隊列創建函數(動態方法,系統使用)
xQueueGenericCreateStatic()   通用隊列創建函數(靜態方法,系統使用)

隊列入隊
xQueueSend()                             發送消息到隊列尾部(后向入隊)
XqueueSendToBack()                  同上,一樣使用
xQueueSendToFront()                 發送消息到隊列頭(向前入隊)
xQueueOverwrite()                      發送消息到隊列,帶覆寫功能,當隊列滿了以后自動覆蓋掉舊的消息
xQueueSendFromISR()               發送消息到隊列尾部(向后入隊),用於中斷服務函數
xQueueSendToBackFromISR()   同上,一樣使用
xQueueSendToFrontFromISR()   發送消息到隊列頭(向前入隊),用於中斷服務函數
xQueueOVerwriteFromISR()        發送消息到隊列,帶覆寫功能,隊列滿了以后自動覆蓋,用於中斷

隊列出隊函數
xQueueReceive()                         從隊列中讀取隊列項(消息),並且讀取完后刪除隊列項
xQueuePeek()                              從隊列中讀取隊列項(消息),並且讀取完后不刪除隊列項
xQueueReceiveFromISR()          從隊列中讀取隊列項(消息),並且讀取完后刪除隊列項,用於中斷服務函數
xQueuePeekFromISR()               從隊列中讀取隊列項(消息),並且讀取完后不刪除隊列項,用於中斷服務函數

 

三、信號量

1.二值信號量其實就是一個只有一個隊列項的隊列,二值信號量的使命就是同步,完成任務與任務或中斷與任務之間的同步。信號量的目的是任務同步和資源共享。

2.互斥信號量:互斥信號量其實就是一個擁有優先級繼承的二值信號量, 在同步的應用中(任務與任務或中斷與任務之間的同步)二值信號量最適合。遞歸互斥信號量,其實就是互斥信號量里面嵌套互斥信號量,實現層層保護。

創建二值信號量
vSemaphoreCreateBinary()               動態創建二值信號量(老版本)
xSemaphoreCreateBinary()               動態創建二值信號量(新版本)
xSemaphoreCreateBinaryStatic()      靜態創建二值信號量

創建計數信號量
xSemaphoreCreateCounting()          動態方法創建計數信號量
xSemaphoreCreateCountingStatic() 靜態方法創建計數信號量

創建互斥信號量
xSemaphoreCreateMutex()               動態方法創建互斥信號量
xSemaphoreCreateMutexStatic()      靜態方法創建互斥信號量

創建遞歸互斥信號量

xSemaphoreCreateRecursiveMute() 創建遞歸互斥信號量

釋放信號量
xSemaphoreGive()                            任務級信號量釋放函數
xSemaphoreGiveFromISR()             中斷級信號量釋放函數

xSemaphoreGiveRecursive()           釋放遞歸互斥信號量

獲取信號量
xSemaphoreTake()                          任務級獲取信號量函數
xSemaphoreTakeFromISR()            中斷級獲取信號量函數

xSemaphoreTakeRecursive()          獲取遞歸互斥信號量

uxSemaphoreGetCount()                獲取計數信號量的計數值

刪除信號量

vSemaphoreDelete()                       信號量刪除

 

四、軟件定時器

軟件定時器:分為單次定時器和周期定時器。
創建軟件定時器
xTimerCreate()                              動態方法創建軟件定時器
xTimerCreateStatic()                     靜態方法創建軟件定時器

復位軟件定時器
xTimerReset()                               復位軟件定時器,用於任務中
xTimerResetFromISR()                 復位軟件定時器,用於中斷服務函數

開啟軟件定時器
xTimerStart()                                開啟軟件定時器,用於任務中
xTimerStartFromISR()                  開啟軟件定時器,用於中斷服務函數

停止軟件定時器
xTimerStop()                                停止軟件定時器,用於任務中
xTimerStopFromISR()                 停止軟件定時器,用於中斷服務函數

 

五、事件標志組

事件標志組:事件位用來表明某個事件是否發生, 事件位通常用作事件標志。一個事件組就是一組的事件位, 事件組中的事件位通過位編號來訪問。
創建時間標志組:
xEventGroupCreate()                         動態方法創建事件標志組
xEventGroupCreateStatic()                靜態方法創建事件標志組

設置事件位
xEventGroupClearBits()                     將指定的事件位清零,用在任務中
xEventGroupClearBitsFromISR()      將指定的事件位清零,用在中斷服務函數中
xEventGroupSetBits()                        將指定的事件位置1,用在任務中
xEventGroupSetBitsFromISR()          將指定的事件位置1,用在中斷服務函數中

獲取事件標志組
xEventGroupGetBits()                        獲取當前時間標志組的值(各個事件位的值),用在任務中
xEventGroupGetBitsFromISR()         獲取當前事件標志組的值,用在中斷服務函數中

等待指定的事件位
xEventGroupWaitBits()                      等待指定的事件位,阻塞時間單位為節拍數

 

六、任務通知

任務通知:任務通知是一個事件,假如某個任務通知的接收任務因為等待任務通知而阻塞的話,向這個接收任務發送任務通知以后就會解除這個任務的阻塞狀態。也可以更新接收任務的任務通知值,任務通知可以通過如下方法更新接收任務的通知值:

  • 不覆蓋接收任務的通知值(如果上次發送給接收任務的通知還沒被處理)。
  • 覆蓋接收任務的通知值。
  • 更新接收任務通知值的一個或多個 bit。
  • 增加接收任務的通知值。

靈活、合理的使用這些更改任務通知值的方法在一些場合可以替代隊列、二值信號量,計數信號量和事件標志組。
發送任務通知
xTaskNotify()                                  發送通知,帶有通知值並且不保留接收任務原通知值,用於任務中
xTaskNotifyFromISR()                   同上,用於中斷服務中
xTaskNotifyGive()                          發送通知,不帶通知值並且不保留接收任務的通知值,用於任務中。作為二值信號量和計數信號量的一種輕量實現,等待任務通知使用ulTaskNotifyTake()函數。
xTaskNotifyGiveFromISR()            同上,用於中斷服務中
xTaskNotifyAndQuery()                 發送通知,帶有通知值並且保留接收任務的原通知值,用於任務中
xTaskNotifyAndQueryFromISR()   同上,用於中斷服務中

獲取任務通知
ulTaskNotifyTake()                         獲取任務通知,可設置退出此函數時,將任務通知值清零或減1
xTaskNotifyWait()                          等待任務通知,全功能版任務通知獲取函數

 

七、其他

1.FreeRTOS 創建任務、隊列、信號量等的時候有兩種方法,一種是動態的申請所需的 RAM。一種是由用戶自行定義所需的 RAM,這種方法也叫靜態方法,使用靜態方法的函數一般以“Static”結尾,比如任務創建函數 xTaskCreateStatic(),使用此函數創建任務的時候需要由用戶定義任務堆棧,使用動態內存管理的時候 FreeRTOS 內核在創建任務、隊列、信號量的時候會動態的申請RAM。

 

2.調度器是 FreeRTOS 操作系統的核心,主要負責任務切換,即找出最高優先級的就緒任務,並使之獲得 CPU 運行權。調度器並非自動運行的,需要人為啟動它。簡單的說,調度器就是使用相關的調度算法來決定當前需要執行的任務。FreeRTOS 操作系統支持三種調度方式:搶占式調度,時間片調度和合作式調度。 實際應用主要是搶占式調度和時間片調度,合作式調度用到的很少。時間片調度和搶占式調度我們一般都是開啟了的,這樣優先級相同時,使用時間片調度,優先級不同時,使用搶占式調度。

  • 搶占式調度:每個任務都有不同的優先級,任務會一直運行直到被高優先級任務搶占或者遇到阻塞式的 API 函數,比如 vTaskDelay。
  • 時間片調度:每個任務都有相同的優先級,任務會運行固定的時間片個數或者遇到阻塞式的 API 函數,比如vTaskDelay,才會執行同優先級任務之間的任務切換。

 

3.任務通知的優點:

  • RAM消耗少
  • 由於任務通知的數據結構包含在任務TCB中,只要任務存在,任務通知數據結構就已經創建完畢,可以直接使用

      缺點:

  • 只能有一個任務接收通知事件。
  • 接收通知的任務可以因為等待通知而進入阻塞狀態,但是發送通知的任務即便不能立即完成發送通知,也不能進入阻塞狀態。

 

4.空閑任務是FreeRTOS不可缺少的任務,因為FreeRTOS設計要求必須至少有一個任務處於運行狀態,當RTOS調度器開始工作后,為了保證至少有一個任務在運行,空閑任務被自動創建,占用最低優先級(0優先級)。 空閑任務有四個特點:
(1)釋放那些刪除自身的任務的內存
(2)保證系統至少有一個任務在運行
(3)在空閑任務中處理一些事件
(4)使用搶占式內核調度時,當有用戶任務處於空閑優先級時,空閑任務立即讓出CPU

 

 

文章來源:物美智能設備


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM