0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS_005_FreeRTOSConfig.h配置文件(二) HOOK钩子函数

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-14 14:04 次阅读

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

    文章

    4741

    浏览量

    68324
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61991
  • HOOK
    +关注

    关注

    0

    文章

    15

    浏览量

    8367
收藏 人收藏

    评论

    相关推荐

    RTOS中钩子函数的用途及用法

    在很多操作系统中,都存在这样一类API函数接口:HOOK函数(也叫钩子函数)。
    的头像 发表于 10-23 16:25 164次阅读
    RTOS中<b class='flag-5'>钩子函数</b>的用途及用法

    springboot的项目如何既要用jar包启动,同时还可以为不同的机房设置不同的配置文件

    作者:京东科技 李意文 1、首先先把配置文件从jar中抽离 示例代码:   org.apache.maven.plugins maven-jar-plugin 3.2.0
    的头像 发表于 10-19 16:48 389次阅读
    springboot的项目如何既要用jar包启动,同时还可以为不同的机房设置不同的<b class='flag-5'>配置文件</b>

    HID over GATT配置文件(HOGP)低功耗蓝牙

    电子发烧友网站提供《HID over GATT配置文件(HOGP)低功耗蓝牙.pdf》资料免费下载
    发表于 09-26 11:01 0次下载
    HID over GATT<b class='flag-5'>配置文件</b>(HOGP)低功耗蓝牙

    确定LDO的任务配置文件兼容性

    电子发烧友网站提供《确定LDO的任务配置文件兼容性.pdf》资料免费下载
    发表于 09-24 10:44 0次下载
    确定LDO的任务<b class='flag-5'>配置文件</b>兼容性

    鸿蒙开发:【Stage模型应用配置文件

    应用配置文件中包含应用配置信息、应用组件信息、权限信息、开发者自定义信息等,这些信息在编译构建、分发和运行解决分别提供给编译工具、应用市场和操作系统使用。
    的头像 发表于 06-15 09:15 1541次阅读
    鸿蒙开发:【Stage模型应用<b class='flag-5'>配置文件</b>】

    AG32 下使用 freeRTOS 的参考

    freeRTOS 的静态方法。 如果使用静态方法,即打开了宏:configSUPPORT_STATIC_ALLOCATION,需要新增两个 hook 函数,可参考:https://blog.csdn.net
    发表于 05-28 13:34

    子函数多层调用的主要注意事项分析

    应用方案设计中,开发者经常会碰到某个子函数需要多次多级调用的情况。
    的头像 发表于 03-27 15:36 729次阅读
    <b class='flag-5'>子函数</b>多层调用的主要注意事项分析

    labview生成exe文件如何配置文件

    可执行文件之前,您需要确保正确配置文件,以便应用程序能够在不同计算机上正确运行。 下面是一个详尽、详实、细致的步骤指南,告诉您如何配置LabVIEW生成的可执行文件: 确保您的应用程序
    的头像 发表于 12-27 16:28 2047次阅读

    labview的opc生成配置文件

    的数据交互和通信。在 LabVIEW 中生成 OPC 配置文件有助于实现与其他设备的数据传输和共享,本文将详细介绍如何生成 OPC 配置文件。 首先,在 LabVIEW 中生成 OPC 配置文件,我们
    的头像 发表于 12-26 17:57 1700次阅读

    oracle配置文件类型关联

    Oracle是一种业界领先的关系型数据库管理系统,它在大型企业中被广泛使用。Oracle的配置文件对于数据库的稳定运行和性能优化至关重要。在这篇文章中,我们将详细讨论Oracle的一些重要配置文件
    的头像 发表于 12-06 10:17 457次阅读

    oracle配置文件tnsnames怎么配置

    Oracle配置文件tnsnames.ora是一个文本文件,用于定义数据库连接的别名和连接信息。通过配置文件,可以在应用程序中使用别名来连接数据库,而不必直接给出数据库的具体连接信息
    的头像 发表于 12-06 10:15 7777次阅读

    php的配置文件是什么

    PHP的配置文件是一种用于配置PHP解释器的文本文件。它包含了一系列的指令和选项,用于影响PHP的行为和性能。通过修改配置文件,可以改变PHP解释器的默认行为,从而满足不同的需求。 在
    的头像 发表于 12-04 15:55 1462次阅读

    zookeeper的核心配置文件是什么

    Zookeeper是一个常用的分布式协调服务,它被广泛应用于大型分布式系统中。Zookeeper的核心配置文件是zoo.cfg,它包含了Zookeeper服务器的各种配置参数,可以通过修改这些参数
    的头像 发表于 12-04 10:33 735次阅读

    springboot的核心配置文件有哪些

    的工作量。 Spring Boot的核心配置文件主要有以下几个: application.properties:Spring Boot应用程序的主要配置文件。它使用Java的键值对格式来定义各种配置属性
    的头像 发表于 12-03 15:30 1131次阅读

    springboot的全局配置文件有几种

    Spring Boot是一种快速开发框架,其通过提供配置文件来实现对应用程序的配置。全局配置文件在Spring Boot中起着非常重要的作用,可以用于配置各种不同的属性,包括数据库连接
    的头像 发表于 12-03 15:28 1503次阅读