FreeRTOS 中任务的创建和删除使用 xTaskCreate 和 vTaskDelete 函数。

一、创建任务

xTaskCreate 函数用于创建一个新任务。它的原型如下:

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

参数说明:

  • pvTaskCode:指向任务函数的指针。
  • pcName:任务的名称(字符串)。
  • usStackDepth:任务堆栈的大小(以字节为单位)。
  • pvParameters:传递给任务函数的参数,可以是任何类型的指针。
  • uxPriority:任务的优先级。数字越大,优先级越高。
  • pxCreatedTask:指向任务句柄的指针。如果该参数不为NULL,则在任务创建时将填充该值。

例如,以下代码将创建一个名为 task1 的任务,其优先级为1,堆栈大小为128字节:

void task1(void *pvParameters) {
  // 任务的代码
}

void setup() {
  // ...

  TaskHandle_t task1handle = NULL; // 任务句柄
  xTaskCreate(task1, "task1", 128, NULL, 1, &task1handle);

  // ...
}

二、删除任务

vTaskDelete 函数用于删除一个任务。它的原型如下:

void vTaskDelete(TaskHandle_t xTaskToDelete);

参数说明:

  • xTaskToDelete:要删除的任务句柄。

例如,以下代码将删除名为 task1 的任务:

TaskHandle_t task1handle = NULL; // 任务句柄
xTaskCreate(task1, "task1", 128, NULL, 1, &task1handle);

// 等待一段时间...

vTaskDelete(task1handle);

三、以下是一个使用FreeRTOS创建和删除任务的例子:

#include <Arduino_FreeRTOS.h>

void task1(void *pvParameters) {
  while(true) {
    Serial.println("Task 1 is running...");
    vTaskDelay(1000 / portTICK_PERIOD_MS); // 暂停1秒
  }
}

void setup() {
  // 初始化串口
  Serial.begin(9600);
  
  // 创建任务1
  TaskHandle_t task1handle = NULL; // 任务句柄
  xTaskCreate(task1, "Task 1", 128, NULL, 1, &task1handle);

  // 等待5秒钟
  vTaskDelay(5000 / portTICK_PERIOD_MS);

  // 删除任务1
  vTaskDelete(task1handle);

  // 启动调度器
  vTaskStartScheduler();
}

void loop() {
  // 主循环中不需要任何代码
}

在这个例子中,我们首先定义了一个任务函数 task1。接着在 setup 函数中,我们初始化串口、创建任务1,并获取到任务1的句柄。

接下来,我们暂停5秒钟,然后使用 vTaskDelete 函数删除任务1。

最后,在 setup 函数中启动 FreeRTOS 调度器。当程序运行时,FreeRTOS 将会轮流执行任务1。在5秒钟之后,任务1将被删除。

值得注意的是,一旦任务被删除,它就不能再次运行。因此,在删除任务前一定要确保该任务已经完成了所有的操作。