目录
介绍
这篇文章的目的是解释如何使用ESP32和Arduino环境获得FreeRTOS任务的优先级。 任务优先级 对于FreeRTOS来说是一个非常重要的概念,因为它们被用来决定给出CPU的任务。
在这篇文章中,我们将使用一个函数来获取初始化和主循环函数以及创建任务的优先级。
代码
本教程的代码非常简单。像之前一样,我们需要在初始化函数里设置好波特率,以便用于串口监视器观察数据。
之后,我们将获得设置功能的优先级。为此,我们只使用uxTaskPriorityGet函数。此函数接收我们想要知道优先级的任务的句柄作为输入参数,并返回该任务的优先级值。如果我们传递NULL作为输入,我们得到调用任务的优先级:
在setup函数的里,这正是我们想要的,所以我们用NULL参数调用该函数,如下所示:
Serial.begin(112500);
delay(1000);
Serial.print("Setup: priority = ");
Serial.println(uxTaskPriorityGet(NULL));
之后,我们将声明一个TaskHandle_t类型的变量,因此我们可以存储我们将要创建的任务的句柄:
TaskHandle_t myTask;
然后,我们创建一个新任务。我们将处理后者的实施功能。现在,要考虑的重要参数是我们将赋值12的优先级,以及我们将传递先前声明的变量的地址的句柄。这样,我们将存储任务的句柄以获得后者的优先级。
检查下面的代码以创建任务。如果您需要创建任务的详细信息,请查看此之前的文章:
xTaskCreate(
genericTask, /* Task function. */"genericTask", /* String with name of task. */10000, /* Stack size in words. */NULL, /* Parameter passed as input of the task */12, /* Priority of the task. */
&myTask); /* Task handle. */
为了完成设置功能,我们现在将通过传递uxTaskPriorityGet函数的参数作为任务句柄来打印此启动任务的优先级 :
Serial.print("Setup: created Task priority = ");
Serial.println(uxTaskPriorityGet(myTask));
现在,在主循环函数上,我们将获得其优先级:
void loop() {
Serial.print("Main Loop: priority = ");
Serial.println(uxTaskPriorityGet(NULL));
delay(1000);
}
最后的代码可以在下面看到。它已经包含任务功能,只执行延迟然后删除:
测试结果
要测试程序结果,请用Arduino IDE上传代码并打开串行监视器。你可以看到类似于图1的东西,它显示了设置功能,创建的任务和主循环功能的优先级:
图1 – 获取任务优先级的程序输出。