前言
开发环境:ESP-IDF 4.3
操作系统:Windows10 专业版
开发板:自制的ESP32-WROOM-32E
上节内容我们学习了创建任务、删除任务、传递参数,现在我们接着往下深入
四、任务优先级
下面这份代码使用了 vTaskPrioritySet(p,N); 函数设置任务优先级,其中p是任务句柄,N是任务优先级,N可以取0-31,N为0时是空闲状态,N为31时为最高优先级
#include <stdio.h>
#include <stdint.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "../build/config/sdkconfig.h"
#include "esp_log.h"
static const char *TAG = "Priority";
void Task1(void* param)
{
while(1)
{
ESP_LOGI(TAG,"Task1");
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
void Task2(void* param)
{
while(1)
{
ESP_LOGI(TAG,"Task2");
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
//void app_main(void)
//{
// xTaskCreate(Task1,"Task1",2048,NULL,1,NULL);
// xTaskCreate(Task2,"Task2",2048,NULL,1,NULL);
//}
void app_main(void)
{
TaskHandle_t pxtask=NULL;//定义一个任务句柄
xTaskCreate(Task1,"Task1",2048,NULL,1,NULL);
xTaskCreate(Task2,"Task2",2048,NULL,1,&pxtask);
vTaskPrioritySet(pxtask,3);//更改或设置 任务优先级
}
运行效果如图所示,我们可以看到1313ms时刻发生了CPU资源争夺的情况,这种情况下先执行的是Task2。
由于我们使用了**vTaskPrioritySet(pxtask,3);**函数将任务2的任务优先级调到了3级,所以在发生多个任务争夺CPU资源时,谁的优先级高那么就会先执行谁,如果任务优先级相同,则会按照创建的顺序依次执行。
如果想测试一下不更改优先级,会是怎样的输出结果,可以把我main函数的代码注释,将我注释的代码取消注释执行试试看。
五、任务挂起
如果我们希望某个任务在短时间内不在执行,但是又不至于将其删除的时候,我们可以选择将这个任务挂起,使用到的函数是vTaskSuspend() 。
下面来看示例代码:
#include <stdio.h>
#include <stdint.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "../build/config/sdkconfig.h"
#include "esp_log.h"
static const char *TAG = "Suspend";
void Task1(void* param)
{
while(1)
{
ESP_LOGI(TAG,"Task1");
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
void Task2(void* param)
{
while(1)
{
ESP_LOGI(TAG,"Task2");
vTaskDelay

本文介绍了在FreeRTOS操作系统中如何设置任务优先级、挂起和恢复任务,以及如何查看任务列表和获取任务堆栈大小。此外,还详细讲解了中断看门狗和任务看门狗的概念,提供了一个官方示例来演示看门狗超时和喂狗的过程,强调了这些功能在调试和优化系统中的重要性。
最低0.47元/天 解锁文章
1484

被折叠的 条评论
为什么被折叠?



