Ⅰ
HOOK介紹
很多初學者(包括我在內)初學的時候對HOOK函數完全就是懵的,不知道是什么東西。如果需要理解本文說的HOOK函數相關配置,就需要理解什么是HOOK函數。
HOOK函數:HOOK翻譯出來的意思是鉤子、鉤住,所以也叫“鉤子函數”,可以理解為鉤住你想要的東西。
HOOK函數實際上是操作系統消息處理機制的程序段,通過系統調用,把它掛入系統。
HOOK函數可以說是操作系統必有的一類函數,像Windows、Linux以及我前面講述過的UCOS嵌入式實時操作系統都有這類鉤子函數。
HOOK函數是提供給開發者的函數,實現自己想要實現的東西。比如:RTOS中IDLE空閑任務就提供了一個HOOK函數,我想要對其計數,計數到1W,我就打印出來(就是實現了自己想要實現的東西)。
總之,初學者初學的時候不一定要完全掌握和精通操作系統里面的每一項東西,但一定要了解。
好比我在微信公眾號里分享的文章,你不必認真去分析或深入理解。但有必要了解,不要等遇到了問題,再反過來問我之前分享過的問題!
Ⅱ
HOOK配置
上面對HOOK描述了那么多,相信大家對HOOK有一定的了解,下面來講述在“FreeRTOSConfig.h”中與HOOK相關的配置。
1.configUSE_IDLE_HOOK
是否定義IDLE空閑任務HOOK函數
配置為0:不定義
配置為1:定義
configUSE_IDLE_HOOK是系統設計之初就有的,必須在“FreeRTOSConfig.h”中宏定義。不像有些宏定義可以不在“FreeRTOSConfig.h”中定義,因為它們在“FreeRTOS.h”有判斷是否定義了,如果沒有定義,會有一個默認的定義。
比如:上一篇文章說的“configUSE_MUTEXES”,可以不在“FreeRTOSConfig.h”中定義,而在“FreeRTOS.h”中可以看到如下一段代碼:
#ifndef configUSE_MUTEXES
#define configUSE_MUTEXES 0
#endif
也就是說,如果沒有定義,它會默認給你定義。
回來說configUSE_IDLE_HOOK,在task.c文件中,有如下一段代碼:
#if (configUSE_IDLE_HOOK == 1)
{
extern void vApplicationIdleHook(void);
vApplicationIdleHook();
}
#endif
意思是說:如果你配置configUSE_IDLE_HOOK為1,那么你就必須要實現“vApplicationIdleHook()”這個函數,否則編譯會出錯。初學者默認不定義該函數。
2.configUSE_TICK_HOOK
是否定義TICK滴答HOOK函數
配置為0:不定義
配置為1:定義
在task.c文件中的xTaskIncrementTick函數下可以看見如下代碼:
#if (configUSE_TICK_HOOK == 1)
{
if(uxPendedTicks == (UBaseType_t) 0U)
{
vApplicationTickHook();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
#endif
提示:xTaskIncrementTick函數是在PendSV_Handler中斷函數中被調用的。因此,vApplicationTickHook()函數執行的時間必須很短才行。
3.configCHECK_FOR_STACK_OVERFLOW
是否定義棧溢出HOOK函數
配置為0:不定義
配置為1:定義
這個配置比較關鍵和重要,特別對于復雜的系統設計,代碼量比較大那種工程,使用該功能,可以幫你分析是否有內存越界的情況。
4.configUSE_MALLOC_FAILED_HOOK
是否定義內存分配失敗HOOK函數
配置為0:不定義
配置為1:定義
我們創建任務、信號量、隊列等都需要耗費系統堆棧,如果我們對系統總共分配堆棧不夠多,在創建多個任務或隊列時容易分配失敗,這個時候就起到一個提示作用。
5.configUSE_DAEMON_TASK_STARTUP_HOOK
是否定義守護進程HOOK函數
配置為0:不定義
配置為1:定義
通過分析軟件源代碼可以發現,這個HOOK函數是在TIMER任務下面實現的,所以需要配置configUSE_TIMERS為1。
-
代碼
+關注
關注
30文章
4779瀏覽量
68524 -
FreeRTOS
+關注
關注
12文章
484瀏覽量
62140 -
HOOK
+關注
關注
0文章
15瀏覽量
8382
發布評論請先 登錄
相關推薦
評論