空闲任务钩子函数详解
1、钩子函数
FreeRTOS中有多个钩子函数,钩子函数类似回调函数,当某个功能(函数)执行的时候就会调用钩子函数,至于钩子函数的具体内容那就由用户来编写。如果不需要使用钩子函数的话就什么也不用管,钩子函数是一个可选功能,可以通过宏定义来选择使用哪个钩子函数,可选的钩子函数如表所示:
钩子函数的使用方法基本相同,用户使能相应的钩子函数,然后自行根据实际需求编写钩子函数的内容,下一节我们会以空闲任务钩子函数为例讲解如何使用钩子函数。
2、空闲任务钩子函数
在每个空闲任务运行周期都会调用空闲任务钩子函数,如果想在空闲任务优先级下处理某个任务有两种选择:
● 在空闲任务钩子函数中处理任务。
不管什么时候都要保证系统中至少有一个任务可以运行,因此绝对不能在空闲任务钩子函数中调用任何可以阻塞空闲任务的 API 函数,比如vTaskDelay(),或者其他带有阻塞时间的信号量或队列操作函数。
● 创建一个与空闲任务优先级相同的任务。
创建一个任务是最好的解决方法,但是这种方法会消耗更多的 RAM。
要使用空闲任务钩子函数首先要在 FreeRTOSConfig.h 中将宏 configUSE_IDLE_HOOK 改为1,然后编写空闲任务钩子函数vApplicationIdleHook()。通常在空闲任务钩子函数中将处理器设置为低功耗模式来节省电能,为了与 FreeRTOS 自带的 Tickless模式做区分,这里我暂且将这种低功耗的实现方法称之为通用低功耗模式(因为几乎所有的 RTOS 系统都可以使用这种方法实现低功耗)。这种通用低功耗模式和
FreeRTOS 自带的 Tickless 模式的区别我们通过下图来对比分析一下。
图中有三个任务,它们分别为一个空闲任务(Idle),两个用户任务(Task1 和Task2),其中空闲任务一共有运行了三次,分别为(1)、(2)、(3),其中 T1 到 T12 是 12 个时刻
全部0条评论
快来发表一下你的评论吧 !