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