須知
源碼版本:10.1.1
文章來源:http://www.itdecent.cn/p/6c5cfc0a3e9a
鉤子函數(shù)簡介
鉤子函數(shù)是操作系統(tǒng)(FreeRTOS)滿足某些功能的機制,F(xiàn)reeRTOS調(diào)用鉤子函數(shù),但鉤子函數(shù)的實現(xiàn)由開發(fā)者(用戶)完成。
可以將之理解成回調(diào)函數(shù)。
大部分的鉤子函數(shù)都能在“FreeRTOSConfig.h”中通過宏進行剪裁。
FreeRTOS的鉤子函數(shù)
函數(shù)名稱:vApplicationIdleHook()
使用條件:
1 在“FreeRTOSConfig.h”中配置“configUSE_IDLE_HOOK” 為 1(可裁剪)
2 實現(xiàn)函數(shù)“void vApplicationIdleHook()”
函數(shù)名稱:vApplicationTickHook()
使用條件:
1 在“FreeRTOSConfig.h”中配置“configUSE_TICK_HOOK” 為 1 (可裁剪)
2 實現(xiàn)函數(shù)“void vApplicationTickHook()”
函數(shù)名稱: vApplicationStackOverflowHook()
使用條件:
1 在“FreeRTOSConfig.h”中配置“configCHECK_FOR_STACK_OVERFLOW” 為 1 或者 2(可裁剪)
2 實現(xiàn)函數(shù)“void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )”
函數(shù)名稱:vApplicationDaemonTaskStartupHook()
使用條件:
1 在“FreeRTOSConfig.h”中配置“configUSE_DAEMON_TASK_STARTUP_HOOK” 為 1 ( 可裁剪 )
2 在“FreeRTOSConfig.h”中配置“configUSE_TIMER” 為 1 ( 可裁剪 )[該鉤子函數(shù)在Timer任務(wù)下實現(xiàn),故需使能TIMER功能]
2 實現(xiàn)函數(shù)“void vApplicationDaemonTaskStartupHook()”
FreeRTOS 鉤子函數(shù)對應(yīng)的特點
運行周期:沒有其它任務(wù)時,一直被調(diào)用,調(diào)用周期非常短(可以類比main函數(shù)中的大循環(huán)while(1)一樣)
使用細節(jié):
1 如果沒有其它的任務(wù)優(yōu)先級和空閑任務(wù)相同,那空閑任務(wù)鉤子函數(shù)中不能阻塞或者掛起自身(空閑任務(wù))。
FreeRTOS任何時候都需要有一個任務(wù)在運行,否則可能會造成沒有任務(wù)能夠進入運行態(tài)。
2 如果其它任務(wù)占用的實際比較少,空閑鉤子函數(shù)將占用大量的系統(tǒng)時間片資源,那么用戶可以將一些功能(對時序無要求)在該函數(shù)內(nèi)實現(xiàn)。
運行周期:由“configTICK_RATE_HZ”決定, 一般都設(shè)置為 1MS
使用細節(jié):
1 該函數(shù)在Tick中斷函數(shù)中調(diào)用,所以該函數(shù)的運行時間越短越好,不能加任何delay。
2 該函數(shù)調(diào)用的周期性很強(1MS),一些定時器計數(shù)器(自定義的計數(shù)器)可以在該函數(shù)里面實現(xiàn)
運行周期:任務(wù)的棧溢出時候
使用細節(jié):
1 并非所有的棧溢出都會觸發(fā)該鉤子函數(shù)。棧溢出可能會把系統(tǒng)棧溢出檢測代碼的數(shù)據(jù)也給破壞掉了,導致棧溢出檢測失效,那鉤子函數(shù)自然無法被調(diào)用咯。
2 參數(shù)可以知道那個任務(wù)的棧溢出
本人還沒使用過該功能,后續(xù)使用過再補充說明吧