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