本文原创作者:strongerHuang 版权所有,未经允许,禁止用于其它商业用途!!! Ⅰ、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。 Ⅲ、最后微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,在我的底部菜单查看更多精彩内容!
|