0


ESP32从零开始(7)—— 任务的建立和删除


这是本人的学习历程,属于学习总结。分享给大家,仅作参考。

(如果哪里有问题请留言指出。谢谢~)


概述

现在开始接触 freeRtos 操作系统的API使用。先从任务的建立和删除开始!

  • 注意:本文的esp-idf 的版本为V4.3。

一、API介绍

  • 详细API介绍请看:

  • ESP32编程指南 —— Task API (任务)

  • xTaskCreatePinnedToCore (创建任务)

BaseType_t xTaskCreatePinnedToCore(TaskFunction_t pvTaskCode,//任务函数名constchar*const pcName,//字符串名称const uint32_t usStackDepth,//任务堆栈大小void*const pvParameters,//传递给任务的指针
                                    UBaseType_t uxPriority,//任务优先级 0~31
                                    TaskHandle_t *constpvCreatedTask,//句柄const BaseType_t xCoreID)//运行在哪个内核上
  • vTaskDelete (删除任务)
voidvTaskDelete(TaskHandle_t xTaskToDelete)//通过句柄,删除对应的任务
  • vTaskDelay (延时)
voidvTaskDelay(const TickType_t xTicksToDelay)//任务阻塞的时间- 例子:- 延时100ms,里面的参数填:
                100/ portTICK_PERIOD_MS
    - 延时1000ms,里面的参数填:
                1000/ portTICK_PERIOD_MS
    - 调用该函数,任务会进入阻塞状态,这时其他优先级相等或更低的任务可以运行。

二、项目介绍

  • 建立一个项目,创建 任务1
  • 任务1:创建 任务2任务3 ,然后删除自身任务
  • 任务2:每隔0.3秒,串口输出 “Task2 Running…”
  • 任务3:每隔1秒,串口输出 “Task3 Running…”;输出5次后,删除 任务2

三、详细代码

  • 样例从 ESP32从零开始(4)—— 手把手带你构建自己第一个项目(hello world!) 开始。
//Linux 终端操作:
cd ~/esp/myPrj///进入我的工程目录
cp -r my_tamplate 1.first_demo        //复制例程,新名字为1.first_demo
rm -rf 1.first_demo/build///删除build文件,因为需要重新编译。
code 1.first_demo                    //VScode 打开1.first_demo

  • 1、main.c 文件
#include<stdio.h>//添加头文件 用于调用串口输出函数printf#include"sdkconfig.h"#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"esp_system.h"#include"comp1.h"//创建句柄
TaskHandle_t xHandle_task1 =NULL;
TaskHandle_t xHandle_task2 =NULL;
TaskHandle_t xHandle_task3 =NULL;//任务3voidvTask3(void* pvParameters){
    uint8_t i =0;//死循环for(;;){if(i >4){//判断句柄是否存在if(xHandle_task2 !=NULL){//通过句柄,删除任务2vTaskDelete(xHandle_task2);//将句柄清除
                xHandle_task2 =NULL;}}else{
            i++;}//串口输出printf("Task3 Running...\n");//延时1000msvTaskDelay(1000/ portTICK_PERIOD_MS);}}//任务2voidvTask2(void* pvParameters){//死循环for(;;){//串口输出printf("Task2 Running...\n");//延时300msvTaskDelay(300/ portTICK_PERIOD_MS);}}//任务1voidvTask1(void* pvParameters){//创建任务2xTaskCreatePinnedToCore(vTask2,//任务函数"task2",//任务名称2048,//堆栈大小NULL,//传递参数1,//任务优先级&xHandle_task2,//任务句柄
                            tskNO_AFFINITY);//无关联,不绑定在任何一个核上//创建任务3xTaskCreatePinnedToCore(vTask3,//任务函数"task3",//任务名称2048,//堆栈大小NULL,//传递参数1,//任务优先级&xHandle_task3,//任务句柄
                            tskNO_AFFINITY);//无关联,不绑定在任何一个核上       //删除自身任务vTaskDelete(NULL);}/*创建任务1函数*/voidvCreate_task1(void){//创建任务1xTaskCreatePinnedToCore(vTask1,//任务函数"task1",//任务名称2048,//堆栈大小NULL,//传递参数2,//任务优先级&xHandle_task1,//任务句柄
                            tskNO_AFFINITY);//无关联,不绑定在任何一个核上}/*主函数*/voidapp_main(void){//调用函数创建任务1vCreate_task1();}

四、串口输出

在这里插入图片描述

  • 删除任务2后,只有任务3在输出。
标签:

本文转载自: https://blog.csdn.net/weixin_45652444/article/details/118963924
版权归原作者 奶能 所有, 如有侵权,请联系我们删除。

“ESP32从零开始(7)—— 任务的建立和删除”的评论:

还没有评论