一个任务可以是以下几种状态中的一种:
正在执行的任务就是处于运行状态,它占用了处理器。
就绪的任务是那些可以执行(没有被阻塞或暂停),但是因为其他相同或更高优先级任务正在运行造成还没有运行的任务。
当一个任务等待临时事件或外部事件时它就是处于阻塞状态。例如,任务调用 vTaskDelay() ,它将被阻塞(置为阻塞状态)直到超过延时时间 - 一个临时事件。任务也可以阻塞等待队列和信号事件。阻塞状态的任务一般有一个超时时间,超时后任务将解锁。阻塞的任务不会参与调度。
暂停状态的任务也不参与调度。任务只有在调用 API 函数 vTaskSuspend() 和 xTaskResume() 时才会进入或者退出暂停状态。它不能指定超时时间。
有效的任务状态转换
低优先级任务使用较小的数字,缺省的空闲优先级 tskIDLE_PRIORITY 定义为 0。
调度器保证处于就绪或运行状态的任务分配到处理器时间,高优先级任务先分配。换句话说,处理器时间总是分配给能够运行的最高优先级任务。
void vATaskFunction( void *pvParameters ) { for( ;; ) { -- Task application code here. -- } }类型 pdTASK_CODE 定义为返回值是 void 的函数,并使用 void 指针作为唯一的参数。所有的任务函数都是这个类型,可以传递任意类型的参数到任务 - 在 任务系统标准演示 中进行了演示。
任务函数应当从不返回,因此它通常执行一个连续的循环,参考 RTOS 的例子。
任务由函数 xTaskCreate() 创建,使用 vTaskDelete() 删除。
上面函数声明可以写为下面形式:
void vATaskFunction( void *pvParameters );或者,
portTASK_FUNCTION_PROTO( vATaskFunction, pvParameters );同样上面的函数可以写为:
portTASK_FUNCTION( vATaskFunction, pvParameters ) { for( ;; ) { -- Task application code here. -- } }
空闲任务负责清理已删除的任务使用的内存,因此调用 vTaskDelete() 函数来保证空闲任务分配到处理时间。The 现在能够使用可视化工具检查微控制器分配给空闲任务的时间。
当空闲任务没有使用其他函数,这样在其他任何条件下可以不分配到处理器时间。
系统其他任务可以共享空闲任务的优先级 (tskIDLE_PRIORITY).
必须始终有一个任务准备好运行,在钩子函数中不能调用任何可能引起任务阻塞的 API 函数 (例如vTaskDelay(),它允许联合程序阻塞钩子函数)。
这是更灵活的方法但是需要更多的 RAM。
创建空闲钩子:
void vApplicationIdleHook( void );
翻译: 邵子扬
EMail: shaoziyang@126.com
Blog:
http://blog.ednchina.com/shaoziyang
2008年10月