ESP32 FreeRtos 任务优先级

简介

每个任务都有自己的优先级。ESP32与STM32不同的是,任务级数字越大,代表优先级越高。

说明:高优先级的任务就像是救护车,低优先级的任务就是普通车辆。如同公路上所有普通车辆需要让救护车一样,高优先级任务永远会比低优先级任务优先执行。

问题:高优先级任务不进入Block或者Suspend状态低优先级任务就永远不会被执行,这就是著名的任务 《吃撑和饿死》 的问题。

API:

    设置优先级

    void vTaskPrioritySet( TaskHandle_t xTask,UBaseType_t uxNewPriority );

   

    获取TashHandle任务优先级

    UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );

    获取当前任务优先级

    UBaseType_t uxTaskPriorityGet(NULL);

    退让资源,任务调度器会重新评估任务,将资源分配给同等级或者更高等级任务

    注意不会把资源给低等级任务

    tastYIELD() yield()

程序实现

首先,在setup()函数中建立三个任务。

void setup() {

  Serial.begin(115200);

  /*
  三个任务都放在Core1
  任务优先等级:普通舱1级, 头等舱2级, 控制台3级
  */

  xTaskCreatePinnedToCore(ecoClass, "ecoClass", 1024 * 2, NULL, 1, NULL, 1);
  xTaskCreatePinnedToCore(firstClass, "firstClass", 1024 * 2, NULL, 2, &xFirstClassHandle, 1);
  xTaskCreatePinnedToCore(controlPanel, "controlPanel", 1024 * 2, NULL, 3, NULL, 1);

}

void loop() {
}

 创建头等舱显示任务。

TaskHandle_t xFirstClassHandle = NULL;

void firstClass(void *ptParam) {
  while (1) {
    Serial.print("头等舱客户 - 等级");
    UBaseType_t uTaskPriority =  //显示本任务当前等级
      uxTaskPriorityGet(NULL);
    Serial.println(uTaskPriority);
    taskYIELD(); //资源退让给同等级或者更高级的任务
  }
}

创建经济舱显示任务。

void ecoClass(void *ptParam) {
  while (1) {
    Serial.print("经济舱客户 - 等级");
    UBaseType_t uTaskPriority = //显示本任务当前等级
      uxTaskPriorityGet(NULL);
    Serial.println(uTaskPriority);
    taskYIELD(); //资源退让给同等级或者更高级的任务
  }
}

创建控制面板显示任务。

void controlPanel(void *ptParam) {
  pinMode(23, INPUT_PULLUP);
  while (1) {
    if (digitalRead(23) == LOW) {
      
      //获取头等舱任务的当前等级
      if (xFirstClassHandle != NULL) {
        UBaseType_t uFirstClassPriority =
          uxTaskPriorityGet(xFirstClassHandle);

        switch (uFirstClassPriority) {
          case 2: //降级
            vTaskPrioritySet(xFirstClassHandle, 1);
            break;
          case 1: //升级
            vTaskPrioritySet(xFirstClassHandle, 2);
            break;
          default:
            break;
        }
      }
      vTaskDelay(120); //粗暴的防止按钮抖动
    }

  }
}

运行环境

任务优先级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ESP32上使用FreeRTOS进行任务调度非常简单。首先,你需要创建任务并设置其参数,例如任务函数、任务优先级等。然后,你可以使用调试工具来监视和分析任务的执行情况。 在创建任务之前,你需要准备好硬件和软件。硬件方面,你需要一个NodeMCU ESP32-S V3.0开发板和一条数据线。软件方面,你需要安装vscode和ESP-IDF的vscode扩展。 在代码中,你可以使用FreeRTOS的API函数来创建和管理任务任务的创建需要指定任务函数,该函数将在任务被调度时执行。你还可以设置任务优先级以及其他参数。 在任务调度期间,FreeRTOS会根据任务优先级来决定执行哪个任务。较高优先级任务将优先执行,而较低优先级任务将在较高优先级任务执行完毕后才执行。这样可以确保任务按照一定的顺序和优先级进行调度,以满足系统的需求。 总结来说,使用ESP32上的FreeRTOS进行任务调度需要先创建任务并设置参数,然后使用调试工具进行监视和分析。硬件和软件准备也是必要的。最后,在任务调度期间,任务的执行顺序将根据其优先级确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ESP32 FreeRTOS-任务的创建与删除 (1)](https://blog.csdn.net/believe666/article/details/127175049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [ESP32-IDF开发实例-FreeRTOS任务优先级](https://blog.csdn.net/wujuxKkoolerter/article/details/117655266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值