Homepage  

任务

[FreeRTOS Fundamentals]

任务状态

 

一个任务可以是以下几种状态中的一种:

有效的任务状态转换

 


任务优先级

每个任务将分配一个从 0 到 ( configMAX_PRIORITIES - 1 ) 的优先级。configMAX_PRIORITIES 在文件 FreeRTOSConfig.h 中定义,configMAX_PRIORITIES参数值越大,FreeRTOS 占用的 RAM 就越多。

低优先级任务使用较小的数字,缺省的空闲优先级 tskIDLE_PRIORITY 定义为 0。

调度器保证处于就绪或运行状态的任务分配到处理器时间,高优先级任务先分配。换句话说,处理器时间总是分配给能够运行的最高优先级任务。

 


执行任务

一个任务有下面的结构形式:
    void vATaskFunction( void *pvParameters )
    {
        for( ;; )
        {
            -- Task application code here. --
        }
    }
 
类型 pdTASK_CODE 定义为返回值是 void 的函数,并使用 void 指针作为唯一的参数。所有的任务函数都是这个类型,可以传递任意类型的参数到任务 - 在 任务系统标准演示 中进行了演示

任务函数应当从不返回,因此它通常执行一个连续的循环,参考 RTOS 的例子。

任务由函数 xTaskCreate() 创建,使用 vTaskDelete() 删除。

 


创建任务Task Creation Macros

可以使用 portTASK_FUNCTION 和 portTASK_FUNCTION_PROTO 宏定义任务函数。这些宏允许编译器分别添加特定语法到函数定义和声明。这些只有在移植时使用特点声明时使用 (目前只在 PIC18 fedC)。

上面函数声明可以写为下面形式:

void vATaskFunction( void *pvParameters );
或者,
portTASK_FUNCTION_PROTO( vATaskFunction, pvParameters );
同样上面的函数可以写为:
    portTASK_FUNCTION( vATaskFunction, pvParameters )
    {
        for( ;; )
        {
            -- Task application code here. --
        }
    }
 

 


空闲任务

空闲任务在调度器启动时自动创建。

空闲任务负责清理已删除的任务使用的内存,因此调用 vTaskDelete() 函数来保证空闲任务分配到处理时间。The 现在能够使用可视化工具检查微控制器分配给空闲任务的时间。

当空闲任务没有使用其他函数,这样在其他任何条件下可以不分配到处理器时间。

系统其他任务可以共享空闲任务的优先级 (tskIDLE_PRIORITY).

 


空闲任务钩子

一个空闲任务钩子就是在每次空闲任务运行时调用的函数。如果你希望一个函数以空闲任务优先级运行,有两个方式:
  1. 在空闲任务钩子实现。

    必须始终有一个任务准备好运行,在钩子函数中不能调用任何可能引起任务阻塞的 API 函数 (例如vTaskDelay(),它允许联合程序阻塞钩子函数)。

  2. 创建空闲优先级任务执行的功能。

    这是更灵活的方法但是需要更多的 RAM。

更多内容参考 嵌入式软件应用设计 小节中使用空闲钩子部分。

创建空闲钩子:

  1. 在 FreeRTOSConfig.h 中设置 configUSE_IDLE_HOOK 为 1。

  2. 定义下面类型的函数:

    void vApplicationIdleHook( void );

通常使用空闲钩子的用法就是简单的将处理器进入节能模式。

 


翻译:   邵子扬
EMail:   shaoziyang@126.com
Blog:    http://blog.ednchina.com/shaoziyang
2008年10月

 

Site Meter