FreeRTOS 任务创建与管理

一:“任务”的特点

        1、在任何时间点,应用程序中只能执行一个任务

        2、每个任务都分配有自己的堆栈。当任务调出时,执行上下文被保存到该任务的堆栈中

        

二:任务创建API

        任务创建需要引用task. h头文件

        1、TaskHandle_t

        任务引用的类型。例如,调用 xTaskCreate(通过指针参数)返回 TaskHandle_t 变量,然后可以将该变量用作 vTaskDelete 的参数来删除任务。

        2、创建函数

创建一个新任务并将其添加到准备运行的任务列表中。 configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中被设置为 1,或保留未定义状态(此时,它默认 默认为 1) ,才能使用此 RTOS API 函数。

BaseType_t xTaskCreate(

                                                TaskFunction_t pvTaskCode,

                                                const char * const pcName,

                                                configSTACK_DEPTH_TYPE usStackDepth,

                                                void *pvParameters,

                                                UBaseType_t uxPriority,

                                                TaskHandle_t *pxCreatedTask

                                        );

参数:

pvTaskCode  :指向任务入口函数的指针(实现任务的函数名称)任务通常 以 无限循环的形式实现;实现任务的函数决不能试图返回 或退出。 但是,任务可以 自我删除

pcName  :任务的描述性名称。主要是为了方便 调试,但也可用于 获取任务句柄。任务名称的最大长度由 FreeRTOSConfig.h 中的 configMAX_TASK_NAME_LEN 定义。

usStackDepth  :要分配用于 任务堆栈的 字数(不是字节),单位是 word。如果堆栈的宽度为 16 位,usStackDepth 为 100,则将分配 200 字节用作该任务的堆栈。 再举一例,如果堆栈的宽度为 32 位,usStackDepth 为 400,则将分配 1600 字节用作该任务的堆栈。

pvParameters:作为参数传递给创建的任务的一个值,可设置为 NULL。

uxPriority  :创建任务执行的优先级 。优先级范围:0~(configMAX_PRIORITIES – 1),数值越小优先级越低, 如果传入过大的值,xTaskCreate 会把它调整为 (configMAX_PRIORITIES – 1)。

pxCreatedTask  :保存任务的句柄,可设置为 NULL。

返回:如果任务创建成功,则返回 pdPASS。 否则 回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY

         xTaskCreateStatic(......)为静态创建任务,需要自己分配RAM.

       3、任务删除

void vTaskDelete( TaskHandle_t xTask );INCLUDE_vTaskDelete 必须定义为 1 才能使用此函数。

        参数:待删除的任务的句柄。传递 NULL 将导致调用任务被删除。

此函数的作用为从 RTOS 内核管理中移除任务。被删除的任务将从所有的就绪、阻塞、挂起和事件的列表中移除。

三、任务控制

        1、任务延时阻塞

        void vTaskDelay( const TickType_t xTicksToDelay );必须将 INCLUDE_vTaskDelay 定义为 1,此函数才可用。

        参数:xTicksToDelay 任务阻塞的tick周期数

        2、任务周期性执行

void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );

INCLUDE_vTaskDelayUntil 必须被定义为 1 才能使用此函数。此函数可以由周期性任务使用, 来确保恒定的执行频率。

        参数:

pxPreviousWakeTime: 指向一个变量的指针,该变量 用于保存任务最后一次解除阻塞的时间。 该变量在第一次使用前 必须用当前时间进行初始化。在这之后,该变量 会在 vTaskDelayUntil() 中自动更新。

xTimeIncrement :周期时间段。 该任务将在 (*pxPreviousWakeTime + xTimeIncrement)时间解除阻塞。 配合相同的 xTimeIncrement 参数值 调用 vTaskDelayUntil 将导致任务 以固定的间隔期执行。

示例用法:

 // 10个周期执行一次
 void vTaskFunction( void * pvParameters )
 {
         TickType_t xLastWakeTime;
         const TickType_t xFrequency = 10;
     // 获取当前时间
     xLastWakeTime = xTaskGetTickCount();

     for( ;; )
     {
         // Wait for the next cycle.
         vTaskDelayUntil( &xLastWakeTime, xFrequency );

         // Perform action here.
     }
 }

        3、获得任务的优先级

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );

必须将 INCLUDE_uxTaskPriorityGet 定义为 1,此函数才可用。

参数:xTask  待查询的任务句柄,传递 NULL 句柄会导致返回调用任务的优先级。

返回:XTask 的优先级。

 

在中断服务程序 (ISR) :UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );

必须将 INCLUDE_uxTaskPriorityGet 定义为 1,此函数才可用。

参数:xTask  待查询的任务句柄,传递 NULL 句柄会导致返回调用任务的优先级。

返回:XTask 的优先级。

        4、设置任务的优先级

void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );

INCLUDE_vTaskPrioritySet 必须定义为 1 才能使用此函数。如果正在设置的优先级高于当前执行任务的优先级,则函数返回之前将发生上下文切换。

参数:

xTask:优先级的任务的句柄,空句柄会设置调用任务的优先级。

uxNewPriority :将要设置任务的优先级。

        5、暂停的任务

void vTaskSuspend( TaskHandle_t xTaskToSuspend );

必须将 INCLUDE_vTaskSuspend 定义为 1 才能使用此函数。

无论任务优先级如何,任务被暂停后将永远无法获取任何微控制器处理时间。

对 vTaskSuspend 的调用不会累积次数,例如:若在同一任务上调用 vTaskSuspend () 两次,将仍然仅需调用一次 vTaskResume (),即可准备完毕暂停的任务。

参数:xTaskToSuspend  被挂起的任务句柄。传递空句柄将导致调用任务被暂停。

        6、恢复已挂起的任务。

void vTaskResume( TaskHandle_t xTaskToResume );

必须将 INCLUDE_vTaskSuspend 定义为 1 才能使用此函数。由一次或多次调用 vTaskSuspend () 而挂起的任务可通过单次调用 vTaskResume () 重新运行。

参数:xTaskToResume 要恢复的任务句柄。

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );

必须将 include_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 定义为 1 才能使用此函数

        7、强制任务离开阻塞状态,并 进入“准备就绪”状态

BaseType_t xTaskAbortDelay( TaskHandle_t xTask );

强制任务离开阻塞状态,并 进入“准备就绪”状态,即使任务在阻塞状态下等待的事件没有发生, 并且任何指定的超时没有过期。

必须将 INCLUDE_xTaskAbortDelay 定义为 1,此函数才可用。

参数:xTask  将被强制退出阻塞状态的任务的句柄 。

        8、查找任务的句柄

TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );

从任务的名称中查找任务的句柄。

注意: 此函数需要较长的时间才能完成,并且只能 为每个任务调用一次。 一旦获得了一个任务的句柄, 它就可以被储存在本地以便重新使用。

必须在 FreeRTOSConfig.h 中将 INCLUDE_xTaskGetHandle 设置为 1,xTaskGetHandle() 才可用。

参数:pCNAMEToQuery  将返回句柄的任务的文本名称 (作为标准的以 NULL 结尾的 C 字符串)

返回:如果可以找到在 pcNameToQuery 中传递名称的任务,则 将返回任务句柄,否则返回 NULL。

 

 

 

 

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值