0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FreeRTOS_005_FreeRTOSConfig.h配置文件(二) HOOK鉤子函數(shù)

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-14 14:04 ? 次閱讀

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。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68612
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62178
  • HOOK
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    8384
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stdio.h實(shí)現(xiàn)了printf函數(shù)?

    我們平時(shí)包含的 stdio.h文件,里面是不是實(shí)現(xiàn)了 printf 函數(shù)? 為什么會(huì)有這個(gè)疑問?因?yàn)槊看问褂?printf,就得包含 stdio.h ,這就導(dǎo)致很多同學(xué)誤以為,st
    的頭像 發(fā)表于 12-18 10:28 ?122次閱讀

    linux網(wǎng)卡配置文件

    網(wǎng)卡配置文件 ? ? 網(wǎng)卡目錄[root@localhost opt]# ls /etc/sysconfig/network-scripts/網(wǎng)卡文件名字,和我們ifconfig看到的一樣
    的頭像 發(fā)表于 12-10 10:09 ?220次閱讀

    RTOS中鉤子函數(shù)的用途及用法

    在很多操作系統(tǒng)中,都存在這樣一類API函數(shù)接口:HOOK函數(shù)(也叫鉤子函數(shù))。
    的頭像 發(fā)表于 10-23 16:25 ?273次閱讀
    RTOS中<b class='flag-5'>鉤子函數(shù)</b>的用途及用法

    springboot的項(xiàng)目如何既要用jar包啟動(dòng),同時(shí)還可以為不同的機(jī)房設(shè)置不同的配置文件

    作者:京東科技 李意文 1、首先先把配置文件從jar中抽離 示例代碼: ? org.apache.maven.plugins maven-jar-plugin 3.2.0
    的頭像 發(fā)表于 10-19 16:48 ?515次閱讀
    springboot的項(xiàng)目如何既要用jar包啟動(dòng),同時(shí)還可以為不同的機(jī)房設(shè)置不同的<b class='flag-5'>配置文件</b>

    HID over GATT配置文件(HOGP)低功耗藍(lán)牙

    電子發(fā)燒友網(wǎng)站提供《HID over GATT配置文件(HOGP)低功耗藍(lán)牙.pdf》資料免費(fèi)下載
    發(fā)表于 09-26 11:01 ?1次下載
    HID over GATT<b class='flag-5'>配置文件</b>(HOGP)低功耗藍(lán)牙

    確定LDO的任務(wù)配置文件兼容性

    電子發(fā)燒友網(wǎng)站提供《確定LDO的任務(wù)配置文件兼容性.pdf》資料免費(fèi)下載
    發(fā)表于 09-24 10:44 ?0次下載
    確定LDO的任務(wù)<b class='flag-5'>配置文件</b>兼容性

    freertos最多支持多少個(gè)任務(wù)

    以下幾個(gè)因素: 系統(tǒng)資源 :FreeRTOS能夠支持的任務(wù)數(shù)量受到系統(tǒng)硬件資源的限制,特別是處理器的RAM大小和性能。RAM用于存儲(chǔ)任務(wù)的控制塊(TCB)和任務(wù)堆棧,因此RAM越大,理論上可以支持的任務(wù)數(shù)量就越多。 配置選項(xiàng) :Free
    的頭像 發(fā)表于 09-02 14:21 ?900次閱讀

    InModbus2配置文件的注意事項(xiàng)

    大家好,由于最近經(jīng)常有人問我InModbus2的配置文件如何編輯來達(dá)到想要的結(jié)果,所以發(fā)布一些關(guān)于InModbus2的配置文件注意事項(xiàng),后期我還會(huì)發(fā)布一些示例來供大家參考讓大家都掌握一些簡(jiǎn)單
    發(fā)表于 07-26 07:21

    在Nucleo-H743ZI2板上運(yùn)行wifi_scan示例,啟用FreeRTOS時(shí)堆部分被禁用,為什么?

    設(shè)備或上下文兼容性問題" 。 此外,當(dāng)我嘗試生成代碼時(shí),一些重要文件丟失了,包括 lwipopts.hFreeRTOSConfig.h. 您能否告訴我解決這些問題的必要步驟?
    發(fā)表于 07-03 08:17

    鴻蒙開發(fā)Ability Kit程序框架服務(wù):FA模型應(yīng)用配置文件

    應(yīng)用配置文件中包含應(yīng)用配置信息、應(yīng)用組件信息、權(quán)限信息、開發(fā)者自定義信息等,這些信息在編譯構(gòu)建、分發(fā)和運(yùn)行解決分別提供給編譯工具、應(yīng)用市場(chǎng)和操作系統(tǒng)使用。
    的頭像 發(fā)表于 06-24 14:49 ?360次閱讀
    鴻蒙開發(fā)Ability Kit程序框架服務(wù):FA模型應(yīng)用<b class='flag-5'>配置文件</b>

    鴻蒙開發(fā):【Stage模型應(yīng)用配置文件

    應(yīng)用配置文件中包含應(yīng)用配置信息、應(yīng)用組件信息、權(quán)限信息、開發(fā)者自定義信息等,這些信息在編譯構(gòu)建、分發(fā)和運(yùn)行解決分別提供給編譯工具、應(yīng)用市場(chǎng)和操作系統(tǒng)使用。
    的頭像 發(fā)表于 06-15 09:15 ?1679次閱讀
    鴻蒙開發(fā):【Stage模型應(yīng)用<b class='flag-5'>配置文件</b>】

    AG32 下使用 freeRTOS 的參考

    freeRTOS 的靜態(tài)方法。 如果使用靜態(tài)方法,即打開了宏:configSUPPORT_STATIC_ALLOCATION,需要新增兩個(gè) hook 函數(shù),可參考:https://blog.csdn.net
    發(fā)表于 05-28 13:34

    子函數(shù)多層調(diào)用的主要注意事項(xiàng)分析

    應(yīng)用方案設(shè)計(jì)中,開發(fā)者經(jīng)常會(huì)碰到某個(gè)子函數(shù)需要多次多級(jí)調(diào)用的情況。
    的頭像 發(fā)表于 03-27 15:36 ?887次閱讀
    <b class='flag-5'>子函數(shù)</b>多層調(diào)用的主要注意事項(xiàng)分析

    Linux系統(tǒng)中的配置文件

    系統(tǒng)文件,用于配置主機(jī)名與 IP 地址的映射關(guān)系。當(dāng)系統(tǒng)需要解析主機(jī)名時(shí),會(huì)首先查找 /etc/hosts 文件,如果在該文件中找到了相應(yīng)的映射關(guān)系,則直接使用對(duì)應(yīng)的 IP 地址進(jìn)行通
    發(fā)表于 02-19 17:36 ?1254次閱讀

    前端大倉(cāng)monorepo權(quán)限設(shè)計(jì)思路和實(shí)現(xiàn)方案

    在 GitLab 未支持文件目錄權(quán)限設(shè)置之前,對(duì)于文件目錄權(quán)限的控制主要依賴 Git 的鉤子函數(shù),在代碼提交的時(shí)候,對(duì)暫存區(qū)的變更文件進(jìn)行識(shí)別并做
    的頭像 發(fā)表于 01-12 09:52 ?723次閱讀
    前端大倉(cāng)monorepo權(quán)限設(shè)計(jì)思路和實(shí)現(xiàn)方案