(六)FreeRTOS軟件定時器、事件組、內存管理

軟件定時器

      爲了週期性處理某些事務,每個MCU都自帶幾個硬件定時器,FreeRTOS也是實現了定時器,不過是軟件層面上的,所以精度自然沒有硬件定時器高,但是處理某些精度要求不高的事務還是夠的。

      像MCU上的硬件定時器一樣,我們希望定時器經過一個週期之後就能反饋一定的動作。所以軟件定時器中也需要中我們也要自己實現回調函數,但是在定時回調函數中不能調用任何回阻塞任務的API函數(vTaskDelay、vTaskDelayUnti),因爲一旦阻塞會導致定時器的運行。

      定時器並不屬於FreeRTOS內核的功能,它是一個應用層上面實現的一個功能,通過應用層調用相關的API,然後發送到到定時器隊列中,定時器服務函數就會執行相應的動作

   定時器使用相關API

總結: FreeRTOS提供軟件定時器幫助用戶快速實現定時功能,完成週期性任務。

事件標誌組

      信號量用於任務、中斷之間的同步,只能實現一對一,但有些情境中要求一個任務可以同時與多個任務保持通信,進行同步,因此FreeRTOS中提供了事件標誌組來解決這個問題。

      每一個事件的觸發情況存儲在一個變量中的每一個bit,通過判斷bit上的值爲1或0來判斷某個事件是否觸發。FreeRTOS中提供兩種存儲類型,一種是8位,一種是24個位,但是實際的變量類型是16位與32位,其中高8位用來處理其它的事情。

#if( configUSE_16_BIT_TICKS == 1 )
 typedef uint16_t TickType_t;
 #define portMAX_DELAY ( TickType_t ) 0xffff
#else
 typedef uint32_t TickType_t;
 #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
 #define portTICK_TYPE_IS_ATOMIC 1
#endif

       通過定義可以看出當configUSE_16_BIT_TICKS定義爲1時,TickType_t是一個16位的數據類型,當configUSE_16_BIT_TICKS定義爲0時,TickType_t是一個32爲的數據類型。

總結:當項目需要用到多任務通信,事件標誌組絕對是最佳的選擇。

內存管理

FreeRTOS中提供了五種內存管理方法,分別在heap_1、heap_2、heap_3、heap_4、heap_5.五種管理方法,各有利弊。

總結:

      第一種方法使用最方便,第二種方法在第二種方法上進行了優化,增加內存釋放函數,第三種方法對標準C語言函數進行封裝,增加線程保護,第四種方法對前面幾種算法進行優化,增加了內存碎片管理方法,第五種方法增加了跨越內存段功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章