FreeRtos——空闲任务与空闲任务钩子函数

以下基础知识转载自正点原子PDF资料。

前面例子 中创建的任务大部份时间都处于阻塞态。这种状态下所有的任务都不可运行,
所以也不能被调度器选中。
但处理器总是需要代码来执行——所以至少要有一个任务处于运行态。为了保证这
一点,当调用 vTaskStartScheduler()时,调度器会自动创建一个空闲任务。空闲任务是
一个非常短小的循环——和最早的示例任务十分相似,总是可以运行。
空闲任务拥有最低优先级(优先级 0)以保证其不会妨碍具有更高优先级的应用任务
进入运行态——当然,没有任何限制说是不能把应用任务创建在与空闲任务相同的优先
级上;如果需要的话,你一样可以和空闲任务一起共享优先级。
运行在最低优先级可以保证一旦有更高优先级的任务进入就绪态,空闲任务就会立即切出运行态。 
空闲任务钩子函数
通过空闲任务钩子函数(或称回调, hook, or call-back),可以直接在空闲任务中添
加应用程序相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。
通常空闲任务钩子函数被用于:
执行低优先级,后台或需要不停处理的功能代码。
测试出系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所
以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时
间)。
将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能
需要处理的时候,系统自动进入省电模式。
空闲任务钩子函数的实现限制
空闲任务钩子函数必须遵从以下规则
1. 绝不能阻塞或挂起。空闲任务只会在其它任务都不运行时才会被执行(除非有应用任
务共享空闲任务优先级)。以任何方式阻塞空闲任务都可能导致没有任务能够进入
运行态!
2. 如果应用程序用到了 vTaskDelete() API 函数,则空闲钩子函数必须能够尽快返回。
因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直运行在钩
子函数中,则无法进行回收工作。

调用了带阻塞性质的 vTaskDelay() API 函数,会产生大量的空闲时间——在
这期间空闲任务会得到执行,因为两个应用任务均处于阻塞态。本例通过空闲钩子函数
来使用这些空间时间。具体源代码参见程序清单 18

创建任务可以有静态和动态之分,但是静态创建需要开启一个宏,并且需要自己提供堆栈,一般用数组实现,这种方式一般不使用,我们通常使用动态创建的方式:

原文地址:https://www.cnblogs.com/yangguang-it/p/7093003.html