查看: 435|回复: 1

[Arduino] ESP32 Arduino:获取FreeRTOS任务优先级

[复制链接]
本文主要介绍如何使用ESP32Arduino环境获取FreeRTOS任务的优先级。

简 介
本文主要介绍如何使用ESP32和Arduino环境获取FreeRTOS任务的优先级。对于FreeRTOS来说,任务优先级是一个非常重要的概念,因为调度器需要基于优先级决定将CPU分配给哪个任务。

在本教程中,我们将使用一个函数来获取setup函数、主循环以及一个新建任务的优先级。

代 码
本教程代码非常简单。和以前一样,在setup函数中首先要打开一个串行连接。

然后,我们将获取setup函数的优先级。为此,只需调用uxTaskPriorityGet 函数即可。该函数的输入参数是我们想要获取优先级的任务的句柄,而函数返回值就是这个任务的优先级数值[1]。如果我们将输入参数设为NULL,那么就会得到主调任务的优先级[1]。

我们就想得到setup函数的优先级,所以我们将使用NULL参数来进行函数调用,如下所示。

[AppleScript] 纯文本查看 复制代码
Serial.begin(112500);
delay(1000);

Serial.print("Setup: priority = ");
Serial.println(uxTaskPriorityGet(NULL));


接下来,声明一个TaskHandle_t类型的变量,用于存储将要新建的任务的句柄。


[AppleScript] 纯文本查看 复制代码
TaskHandle_t myTask;

然后,新建一个任务。任务的具体实现稍后再说。我们目前关注的重要参数是这个任务的优先级(赋值为12)和句柄(赋值为先前所声明变量的地址)。这样就可以将这个任务的句柄保存起来,以备稍后获取其优先级。



创建任务的相关代码如下所示。如果需要创建任务有关的更多详情,请参阅此前的这篇帖子:ESP32 Arduino:创建FreeRTOS任务

[AppleScript] 纯文本查看 复制代码
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. */


在setup函数最后,我们使用任务句柄作为uxTaskPriorityGet函数的参数,将新建任务的优先级打印出来。

[AppleScript] 纯文本查看 复制代码
Serial.print("Setup: created Task priority = ");
Serial.println(uxTaskPriorityGet(myTask));


然后,在主循环中,重复与setup函数相同的操作,以获取主循环函数的优先级。

[AppleScript] 纯文本查看 复制代码
void loop() {
Serial.print("Main Loop: priority = ");
Serial.println(uxTaskPriorityGet(NULL));
delay(1000);
}

最终代码如下所示,其中包括任务函数(只有一个延时,然后就被删除)。

[AppleScript] 纯文本查看 复制代码
void setup() {

  Serial.begin(112500);
  delay(1000);

  Serial.print("Setup: priority = ");
  Serial.println(uxTaskPriorityGet(NULL));

  TaskHandle_t myTask;

  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. */

  Serial.print("Setup: created Task priority = ");
  Serial.println(uxTaskPriorityGet(myTask));

}

void loop() {
  Serial.print("Main Loop: priority = ");
  Serial.println(uxTaskPriorityGet(NULL));
  delay(1000);
}

void genericTask( void * parameter ){
    delay(20000);
    vTaskDelete(NULL);
}


测试代码
使用Arduino IDE将代码上传并打开serial monitor,对代码进行测试。运行结果如图1所示,其中显示了setup函数、新建任务和主循环函数的优先级。

esp32-freertos-getting-tasks-priorities.png
图1 - 获取任务优先级的代码运行结果。


注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
他写了很多有关ESP32、ESP8266的有用的教程和项目。

查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
英文版教程 : ESP32 tutorial

gada888  版主

发表于 2019-4-1 08:35:20

补习下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail