概念
钩子函数是FreeRTOS提供的一种机制,允许用户在FreeRTOS的某些关键点上插入自己的代码。通过钩子函数,用户可以在不影响FreeRTOS核心代码的前提下,扩展系统的功能。
钩子函数类型
FreeRTOS提供了以下几种钩子函数:
vApplicationIdleHook
:空闲任务钩子函数,当系统没有其他任务运行时,该函数会被调用。vApplicationTickHook
:滴答中断钩子函数,每次系统节拍中断发生时,该函数会被调用。vApplicationMallocFailedHook
:内存分配失败钩子函数,当FreeRTOS的内存管理器无法分配内存时,该函数会被调用。vApplicationStackOverflowHook
:栈溢出钩子函数,当任务栈溢出时,该函数会被调用。
使用钩子函数
要使用钩子函数,首先需要在FreeRTOSConfig.h文件中启用相应的宏定义。
1. 空闲任务钩子函数示例
// 在FreeRTOSConfig.h中启用空闲任务钩子函数
#define configUSE_IDLE_HOOK 1
// 实现空闲任务钩子函数
void vApplicationIdleHook(void)
{
// 用户自定义代码
// 例如:低功耗处理
}
2. 滴答中断钩子函数示例
// 在FreeRTOSConfig.h中启用滴答中断钩子函数
#define configUSE_TICK_HOOK 1
// 实现滴答中断钩子函数
void vApplicationTickHook(void)
{
// 用户自定义代码
// 例如:更新系统时间
}
3. 内存分配失败钩子函数示例
// 在FreeRTOSConfig.h中启用内存分配失败钩子函数
#define configUSE_MALLOC_FAILED_HOOK 1
// 实现内存分配失败钩子函数
void vApplicationMallocFailedHook(void)
{
// 用户自定义代码
// 例如:记录错误信息,重启系统
taskDISABLE_INTERRUPTS();
for (;;);
}
4. 栈溢出钩子函数示例
// 在FreeRTOSConfig.h中启用栈溢出钩子函数
#define configCHECK_FOR_STACK_OVERFLOW 1
// 实现栈溢出钩子函数
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
{
// 用户自定义代码
// 例如:记录任务名称和ID,重启系统
(void)xTask;
(void)pcTaskName;
taskDISABLE_INTERRUPTS();
for (;;);
}
注意事项
钩子函数的实现应该尽可能简洁,避免执行时间过长,影响系统性能。 在钩子函数中,应避免调用可能导致任务切换的API函数,如 vTaskDelay()
等。钩子函数中不要使用浮点运算,因为FreeRTOS的滴答中断钩子函数是在中断上下文中调用的,而浮点运算在中断上下文中可能不被支持。执行一些低优先级的、后台的、需要连续执行的函数 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。 让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。