查看: 263|回复: 0

ESP32 Arduino:获取FreeRTOS任务优先级

[复制链接]
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2019-5-24 22:07 | 显示全部楼层 |阅读模式
    本帖最后由 dfrobot 于 2019-5-24 22:15 编辑

    本文主要介绍如何使用ESP32和Arduino环境获取FreeRTOS任务的优先级。

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

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

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

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

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

    kittenblock中小学创客名师推荐的图形化编程软件

    Serial.begin(112500);
    delay(1000);
    
    Serial.print("Setup: priority = ");
    Serial.println(uxTaskPriorityGet(NULL));
    
    

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



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



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

    kittenblock中小学创客名师推荐的图形化编程软件

    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函数的参数,将新建任务的优先级打印出来。

    kittenblock中小学创客名师推荐的图形化编程软件

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


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

    kittenblock中小学创客名师推荐的图形化编程软件

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

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

    kittenblock中小学创客名师推荐的图形化编程软件

    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


    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    对于ADC读取按键值的疑问
    对于ADC读取按键值的疑问
    大佬们好 我在一篇帖子上看见了用ADC读取模拟值并判断哪颗按键 我也画了一下板子 这
    ADC模拟输入读取独立按键值
    ADC模拟输入读取独立按键
    在论坛H2O了这么久,给大家分享一个实用的小技巧!在使用按键与单片机进行人机交互时
    【Arduino】108种传感器模块系列实验(97)---0.96寸OLED液晶屏
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】108种传感器模块系列实验(107)---400KV高压发生器
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表