FreeRTOS 是一款常用的实时操作系统,提供了丰富的任务管理功能,包括任务的创建、删除、挂起、恢复等。下面分别说明这些功能的用法和注意事项:

任务的创建

在 FreeRTOS 中,可以通过 xTaskCreate()​​ 函数来创建任务。该函数的原型如下:

BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,
                        const char * const pcName,
                        configSTACK_DEPTH_TYPE usStackDepth,
                        void *pvParameters,
                        UBaseType_t uxPriority,
                        TaskHandle_t *pxCreatedTask);

其中,各个参数的含义如下:

  • ​pxTaskCode​​:任务函数指针,即任务要执行的函数。

  • ​pcName​​:任务名称,用于调试和诊断。

  • ​usStackDepth​​:任务栈深度,即任务使用的栈空间大小。

  • ​pvParameters​​:任务参数,即传递给任务函数的参数。

  • ​uxPriority​​:任务优先级,用于调度和抢占。

  • ​pxCreatedTask​​:用于返回创建的任务的句柄。

在创建任务时,需要注意以下几点:

  • 任务函数必须是无限循环的,即任务函数不会自行返回。

  • 任务函数不能使用 return​​ 语句返回,需要使用 vTaskDelete(NULL)​​ 函数删除自身。

  • 任务名称必须是唯一的,用于诊断和调试。

任务的删除

在 FreeRTOS 中,可以通过 vTaskDelete()​​ 函数来删除任务。该函数的原型如下:

void vTaskDelete(TaskHandle_t xTask);

其中,xTask​​ 参数是要删除的任务的句柄。

在删除任务时,需要注意以下几点:

  • 不能在任务函数中删除当前任务,需要使用 vTaskDelete(NULL)​​ 函数删除自身。

  • 删除任务前需要确保任务已经退出循环或阻塞状态。

  • 删除任务后,任务句柄会被置为 NULL。

任务的挂起和恢复

在 FreeRTOS 中,可以通过 vTaskSuspend()​​ 和 vTaskResume()​​ 函数来挂起和恢复任务。这些函数的原型如下:

void vTaskSuspend(TaskHandle_t xTaskToSuspend);
void vTaskResume(TaskHandle_t xTaskToResume);

其中,xTaskToSuspend​​ 和 xTaskToResume​​ 分别是要挂起和恢复的任务的句柄。

需要注意以下几点:

  • 在挂起任务时,需要确保任务不会访问共享资源或执行关键路径。

  • 在恢复任务时,需要确保任务的优先级高于或等于当前任务的优先级。

  • 在挂起和恢复任务时,需要考虑任务的阻塞状态和等待时间。

任务的优先级

在 FreeRTOS 中,任务的优先级用于调度和抢占。任务的优先级从 0 到 configMAX_PRIORITIES-1,数字越大表示优先级越高。任务的优先级可以通过 xTaskPrioritySet()​​ 函数来设置,该函数的原型如下:

BaseType_t xTaskPrioritySet(TaskHandle_t xTask,
                            UBaseType_t uxNewPriority);

其中,xTask​​ 是要设置优先级的任务的句柄,uxNewPriority​​ 是新的优先级。

需要注意以下几点:

  • 任务的优先级不能超过 configMAX_PRIORITIES-1。

  • 如果有多个任务具有相同的优先级,将按照先到先服务(FIFO)的顺序进行调度。

  • 任务的优先级可以动态地改变。

以上是 FreeRTOS 中任务管理的一些基本功能和注意事项,需要结合具体的应用场景进行使用和调整。