ESP32之FreeRTOS--任务的创建和运行

2023-05-16

文章目录

  • 前言
  • 一、创建任务和删除函数
    • 1.xTaskCreate()
    • 2.xTaskCreateStatic()
    • 3.xTaskCreateRestricted()
    • 4.vTaskDelete()
  • 二、任务函数和任务控制块TCB
    • 1.任务函数模板
    • 2.TCB
  • 三、延时函数
    • 1.vTaskDelay()
    • 2.vTaskDelayUntil()
    • 3.系统时钟节拍
  • 四、任务挂起和恢复函数
    • 1.vTaskSuspend()
    • 2.vTaskResume()
    • 3.xTaskResumeFromISR()
  • 总结


前言

参考文献:官方资料

FreeRTOS类似于UCOS,关于前面的基础就不所了,直接看如何将系统运用到ESP32中去。


提示:以下是本篇文章正文内容

一、创建任务和删除函数

FreeRTOS最基本的功能就是任务管理:创建和删除任务

1.xTaskCreate()

函数原型

static inline IRAM_ATTR BaseType_t xTaskCreate(
			TaskFunction_t pvTaskCode, // 任务函数
			const char * const pcName,//任务名称,没什么用
			const uint32_t usStackDepth,//任务堆栈大小
			void * const pvParameters,//传递给 任务函数的参数
			UBaseType_t uxPriority,//任务优先级
			TaskHandle_t * const pvCreatedTask//任务句柄
			)
	{
		return xTaskCreatePinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY );
	}

此函数用来创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。所需的RAM会自动从FreeRTOS的堆中分配。

2.xTaskCreateStatic()

此函数和xTaskCreate()功能一样,但是需要的RAM需要用户来提供

3.xTaskCreateRestricted()

此函数和xTaskCreate()功能一样,但是此函数要求所使用的MCU有MPU(内存保护单元)

4.vTaskDelete()

函数原型

void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;
使用任务句柄删除指定的任务,若删除任务本身传入NULL即可

用于删除创建的任务

注:
1.从RTOS 实时内核管理中移除任务,要删除的任务将从就绪,封锁,挂起,事件列表中移除

2.任务被删除后就不复存在,也不会再进入运行态, 空闲任务负责释放内核分配给已删除任务的内存

3.只有内核为任务分配的内存空间才会在任务被删除后由空闲任务自动回收,任务自己占用的内存或资源需要由应用程序自己显式地释放

eg:创建三个任务,并在串口打印出来

#include <Arduino.h>

// 任务1
#define TASK1_TASK_PRIO  1          // 任务优先级
#define TASK1_STK_SIZE   1024        // 任务堆栈大小
TaskHandle_t Tasks1_TaskHandle; // 任务句柄
void task1(void *pvParameters); //任务函数

// 任务2
#define TASK2_TASK_PRIO  1        // 任务优先级
#define TASK2_STK_SIZE   1024        // 任务堆栈大小
TaskHandle_t Tasks2_TaskHandle; // 任务句柄
void task2(void *pvParameters); //任务函数

// 任务3
#define TASK3_TASK_PRIO  1          // 任务优先级
#define TASK3_STK_SIZE   1024        // 任务堆栈大小
TaskHandle_t Tasks3_TaskHandle; // 任务句柄
void task3(void *pvParameters); //任务函数

void setup()
{
    Serial.begin(115200);
    // 创建任务
	
    xTaskCreate(task1, "task1_task",TASK1_STK_SIZE,NULL,TASK1_TASK_PRIO,NULL); 

    xTaskCreate(task2, "task2_task",TASK2_STK_SIZE,NULL,TASK2_TASK_PRIO,NULL);

    xTaskCreate(task3, "task3_task",TASK3_STK_SIZE,NULL,TASK3_TASK_PRIO,NULL);
    vTaskStartScheduler(); //启动调度
}
void loop() 
{

}


void task1(void *pvParameters)
{
    while(true)
    {
        Serial.println("task1 runing........");
        vTaskDelay(100/portTICK_PERIOD_MS); //等待1s
    }
}

void task2(void *pvParameters)
{
    while(true)
    {
        Serial.println("task2 runing........");
        vTaskDelay(100/portTICK_PERIOD_MS); //等待1s
    }
    
}
void task3(void *pvParameters)
{
     while(true)
    {
        Serial.println("task3 runing........");
        vTaskDelay(100/portTICK_PERIOD_MS); //等待1s
    }
}

结果
在这里插入图片描述

二、任务函数和任务控制块TCB

1.任务函数模板

使用xTaskCreate()创建任务之后,该函数的第一个参数就是pxTaskCode,也就是我们定义任务函数的函数名,任务函数就是实现任务工作的函数,模板如下

void vATaskFunction(void *pvParameters)
{
    for(;;)
    {
        --任务应用程序--
        vTaskDelay();    
    }
    vTaskDelete(NULL);
}

1.任务函数的本质也是函数,函数名根据情况而定,但是函数的返回类型必须是void类型,函数的参数也必须是viod指针类型

2.任务具体的执行过程是一个大循环,for(;;)或者while(true)都可以

3.在循环里面实现我们真正要做的事情的程序

4.调用vTaskDelay(),任务从运行态进入阻塞态,转而去执行其他任务,这里一定不用使用delay, 一般只要能让任务发送调度就可以,比如信号量,队列,任务调度器都可

5.任务函数一般不允许跳出循环

2.TCB

每个任务都有一些属性要求存储,任务控制块就是实现的该功能的,在使用xTaskCreak()创建任务的时候,会自动的给每个任务分配一个TCB,

主要有一些属性
在这里插入图片描述
在这里插入图片描述

三、延时函数

1.vTaskDelay()

函数原型

void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION;

在UCOSIII延时函数有三种模式:相对模式,周期模式和绝对模式,
在FreeRTOS中,vTaskDelay()就是相对延时函数,而vTaskDelayUnitl()就是绝对延时函数。

参数xTicksToDelay 是以心跳周期为单位,每个‘1’代表15ms,延时的时间一般大于0,否则直接使用**任务调度函数portYIELD()**进行任务调度(注:延时函数里面调用了任务调度的函数)

如果看过UCOS源码的都知道,调用了该延时函数,任务就相当于挂起,会被从就绪列表中删除,然后会被添加到时基列表,当延时时间到就会重新添加到就绪列表

实时操作系统的两大列表就是时基列表和就绪列表
有兴趣的大佬可以看这篇UCOS的介绍:UCOSiii源码阅读

2.vTaskDelayUntil()

函数原型

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION;

延时的绝对时间,应用于按照一定频率运行的任务

该处使用的url网络请求的数据。


3.系统时钟节拍

简单说一下,xTickCount就是该系统的系统时钟节拍计数器,每个定时器中断中xTickCount就会加一,实现函数如下:

BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION;

判断任务延时时间结束与否,也是在这里完成的

四、任务挂起和恢复函数

在这里插入图片描述
有时我们需要暂停某个任务,这时就需要用到任务挂起和任务恢复

1.vTaskSuspend()

函数原型

void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;

用于将某个任务设置为挂起状态,进入挂起状态后,只有使用vTaskResume和xTaskResumeFromISR才会进入运行态

如果传入参数为NULL,表示挂起任务本身,可以传入其他任务句柄挂起其他任务,xTaskGetHandle()可根据任务名称获取某个任务的任务句柄

2.vTaskResume()

函数原型

void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;

将一个任务从挂起状态恢复到就绪态,只有挂起的任务次才可以使用该函数

3.xTaskResumeFromISR()

函数原型

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;

用于在中断服务函数中恢复一个任务

其他一些于任务有关的相关函数
在这里插入图片描述

总结

提示:这里对文章进行总结:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32之FreeRTOS--任务的创建和运行 的相关文章

  • 重要:智能指针的使用(C++ 11 以上)

    智能指针的声明与初始化 xff1a 第一种 xff1a std shared ptr 指针 初始化方式1 xff08 推荐 xff09 std shared ptr lt int gt sp3 sp3 61 std make shared
  • 自顶向下和自底向上的实现方法

    1将一个大问题分解为小的易处理的子问题 xff0c 每个子问题可以使用一个方法来实现 xff0c 这种方法使得问题更加易于编写重用调试 xff0c 修改和维护 2当一个大问题分解为许多子问题 xff0c 各个子问题可以分配给不同的编程人员
  • c# --- 接口

    接口从某种程度上来说也是一个类 xff0c 但是接口中只包含方法的声明而没有方法的实现z 创建接口的关键字 xff1a interface 接口 xff0c 人机交互界面 创建接口的语法 xff1a 接口的访问权限 interface 接口
  • MAML++:HOW TO TRAIN YOUR MAML论文精读

    论文地址 https arxiv org abs 1810 09502 Abstract MAML是目前通过元学习进行少样本学习的最佳方法之一 MAML简单 xff0c 优雅和非常强大 xff0c 然而 xff0c 它有各种各样的问题 xf
  • webpack中的loader

    什么是loader loader是webpack中一个非常核心的概念 webpack用来做什么呢 xff1f 在我们之前的实例中 xff0c 我们主要是用webpack来处理我们写的js代码 xff0c 并且webpack会自动处理js之间
  • strtok()函数

    strtok 将字符串拆分成tokens xff0c tokens是被分隔符中的任何字符分隔的连续字符序列 char strtok char str const char sep sep参数是个字符串 xff0c 定义了用作分隔符的字符集合
  • MySQL夺命连环15问,你能坚持到第几问?

    文章目录 前言一 关系型和非关系型的区别 xff0c 以及使用场景二 Mysql索引优缺点三 给字段加索引最好怎么加 xff1f 四 什么情况下会导致索引失效 xff1f 五 为什么使用模糊匹配会使索引失效六 回表查询和索引覆盖是什么七 联
  • educoder数字逻辑实训:比较器设计(Logisim)

    第1关 xff1a 1位比较器设计 任务描述 本关任务 xff1a 在Logisim中完成1位比较器电路的绘制并完成测试 第2关 xff1a 2位比较器设计 任务描述 本关任务 xff1a 在Logisim中完成2位比较器电路的绘制并完成测
  • 1、树莓派的VNC文件传输

    目录 第一步 xff1a 在树莓派端打开VNC服务器 第二步 xff1a 输入指令运行vncserver 第三步 xff1a 在电脑端安装VNC查看器 第一步 xff1a 在树莓派端打开VNC服务器 第二步 xff1a 输入指令运行vncs
  • Hadoop 3.x(HDFS)----【HDFS 的读写流程】

    Hadoop 3 x xff08 HDFS xff09 HDFS 的读写流程 1 HDFS写数据流程1 剖析文件写入2 网络拓扑 结点距离计算3 机架感知 xff08 副本存储节点选择 xff09 1 机架感知说明2 Hadoop3 1 3
  • 【C++】程序运行时间计算的方式

    1 利用C 43 43 标准库 std chrono xff0c 如下计算一个主体程序的运行时间 xff0c 算出来的时间差值单位为毫秒 lt float std milli gt 表示用毫秒表示 auto t start 61 std c
  • FPGA之蜂鸣器播放音乐《花海》

    文章目录 前言一 蜂鸣器1 蜂鸣器简介 xff1a 2 有源蜂鸣器 xff1a 3 无源蜂鸣器 xff1a 二 简谱常识1 音符时值 xff1a 2 简谱名 xff1a 3 简谱名频率 xff1a 三 程序设计1 调用ROM IP核储存每个
  • Verilog语法基础HDL Bits训练 01

    文章目录 前言一 Basics simple wire1 RTL代码2 仿真波形图 二 Basics four wires1 RTL代码2 仿真波形图 三 Basics Not gate1 RTL代码2 仿真波形图 四 Basics And
  • c++文件写入数据

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 基于HC-08蓝牙模块的蓝牙通讯

    RXD接TXD xff0c TXD接RXD 通过手机的蓝牙助手可以完成亮灭LED1和LED2的操作 当发送A时 xff0c LED1亮 发送B时 xff0c LED1灭 当发送C时 xff0c LED2亮 xff0c 当发送D时 xff0c
  • 计算机网络笔记

    文章目录 计算机网络课程笔记第一章 概述1 计算机网络的定义2 网络分类3 网络分层及协议3 1 网络分层的原因3 2 协议 xff1a 对等通信双方的通信规则3 3 网络服务类型 xff1a 面向连接和面向非连接3 4 服务原语 xff1
  • 关于OSPF区域划分

    区域划分的好处 背景 随着网络规模不断扩大 xff0c 结构也日趋复杂 xff0c 路由器完成路由计算所消耗的内存 CPU资源也越来越多网络发生故障的可能性也随之增加 xff0c 如果区域内某处发生故障 xff0c 整个区域内的路由器都要重
  • 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........)

    多目标多角度的快速模板匹配算法 xff08 基于NCC xff0c 效果无限接近Halcon中 工程应用一 多目标多角度的快速模板匹配算法 xff08 基于NCC xff0c 效果无限接近Halcon中 Imageshop 博客园 主要是我
  • 蓝桥杯嵌入式第十三届模拟题做题笔记

    这届的蓝桥杯电子类延期了 xff0c 最近就很无聊 xff0c 想做点东西但是又什么啥也不会 xff0c five一个 在小破站寻求各路大佬的帮助 不求大家的赞了 xff0c 只希望大家能够分享知识 xff0c 帮助一下迷茫的人 首先第一眼
  • Code::Blocks

    Code Blocks出现A debugging check in this application has failed xff1f 虽然不懂 xff0c 但好像有一个灰常easy的解决方法 xff1a Settings gt Edito

随机推荐

  • Logidim中异或的符号表示

    logisim中的表达式以 代表异或
  • 本人开发环境基本配置一览 ~/.bashrc

    系统 xff1a ubuntu18 04 xff0c bashrc环境文件 1 配置CUDA路径 xff1b cudnn用deb包安装的 xff0c 会直接被装到系统相应路径 xff0c 不需要手动添加路径引用 2 ROS CUDA exp
  • QT笔记(一)

    学习目标 xff1a 总结学习的QT 学习内容 xff1a 1 QT的一些固定格式 2 控件和事件 3 信号和槽 记录内容 xff1a 1 QT的固定格式 1 引用头文件 自己创建的头文件用 34 34 括起 xff0c eg 96 inc
  • 17 C++11常用语法

    文章目录 一 C 43 43 11简介二 列表初始化2 1 容器如何支持花括号初始化 三 变量类型的推导3 1 编译时类型推导 xff1a auto3 2 decltype类型推导3 3 运行时类型推导 typeid 四 final ove
  • Git小乌龟(TortoiseGit)使用详情

    项目可能大概也许maybe要用到Git小乌龟 xff0c 正好水篇文章 下载及安装 首先没有下载Git的先下载 xff0c 官网下载地址 xff0c 安装时直接一直next就行 然后是小乌龟的下载 xff0c 官网下载地址 xff0c 不知
  • 一张图阐述UML状态图的画法【软件工程】

    文章目录 I 介绍状态图II 一图搞定状态图画法 I 介绍状态图 状态图展示了一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态间的转移 它有两大特征 xff1a 1 所有的变化都是针对某一个特定的对象 xff0c 这个对象会触发
  • 虚拟机中Ubuntu与主机共享文件夹

    虚拟机中Ubuntu与主机共享文件夹 xff0c 以及 mnt目录为空 xff0c 没有共享文件夹时的解决方案 1 启用共享文件夹 首先将虚拟机关机 xff0c 在虚拟机设置中 xff0c 选择选项面板 xff0c 选择共享文件夹 xff0
  • 【ROS】中级操作学习整理-TF坐标变换

    系列文章目录 ROS 中级操作学习整理 gazebo机器人仿真 ROS 中级操作学习整理 TF坐标变换 ROS 中级操作学习整理 传感器建模 ROS 中级操作学习整理 激光SLAM 文章目录 目录 目录 系列文章目录 文章目录 前言 一 R
  • STM32 芯片锁死无法烧录问题解决

    芯片锁死原因 xff1a 1 烧进去的工程对应器件与目标器件不一致 xff1b 2 烧进去的工程HSE VALUE与目标板上晶振频率不一致 xff1b 3 将烧录引脚烧录 本人在使用F411时犯下了 比较愚蠢的错误 xff0c 因为PB3引
  • 【TPMS】 - 发射端2

    TPMS项目 发射端SP370 目录章节介绍 一 SP370数据手册浏览二 源码学习三 SP370的RF的部分详解四 RF数据包的发送和数据包格式解析1 目录 章节介绍 1 SP370数据手册浏览 浏览SP370的数据手册 xff0c 看一
  • 【TPMS】 -接收端1

    TPMS项目 接受端TDA5235 目录章节介绍 一 TPMS接收板概况介绍二 TDA5235的专业知识1三 寄存器配置工具 目录 章节介绍 1 TPMS接收板概况介绍 本节开始接收板部分的课程 xff0c 先对接收板的整体情况 xff0c
  • ST_link突然不能使用了

    一 发现问题 今天 xff0c 我使用st link烧写程序时突然不能用了 xff0c 我昨天都还可以正常使用 我用手摸仿真器时很热 我意识到可能坏了 二 解决过程 xff08 1 xff09 用keil5查看debug设置时就能找到ST
  • OpenCV 读取视频并保存为另一个视频

    测试代码如下 xff1a 功能 xff1a 读取视频 xff0c 缩小处理后再存为另一个视频 方法1 include lt opencv2 opencv hpp gt include lt opencv2 highgui highgui c
  • XML和JSON

    XML 简介 xml是什么 XML是一种可扩展标记语言 Extensible Markup Language xff0c 它是一种用于在计算机网络上进行数据传输的标准格式 XML使用标记来标识数据 xff0c 并且可以自定义标记 xff0c
  • STM32单片机蜂鸣器实验

    蜂鸣器可以分为两种 xff1a 有源蜂鸣器与无源蜂鸣器 xff0c 这里的 源 指的是有没有自带震荡电路 xff0c 有源的蜂鸣器自带有震荡电路 xff0c 通电的瞬间就会发出声音 xff1b 而无源的蜂鸣器 xff0c 需要提供一个2 5
  • JVM虚拟机

    JVM 1 JVM 概述 x1f6b4 x1f6b4 x1f6b2 x1f6b4 虚拟机 xff08 Virtual Machine xff09 是一台虚拟的计算机 VMware属于系统虚拟机 xff0c 是对物理计算机的仿真 Java虚拟
  • 树莓派桌面WIFI图标消失,树莓派黑屏can‘t currently show the desktop

    方法一 xff1a 重装镜像 方法二 xff1a 找个树莓派显示器终端输入这行代码 sudo apt install wpasupplicant wpagui libengine pkcs11 openssl 转载B站视频 xff1a 完美
  • cuda10.1+cudnn10.1+tensorflow2.2.0+pytorch1.7.1下载安装及配置

    一 cuda及cudnn下载 1 查看自己电脑是否支持GPU 方法 xff1a 鼠标移动到此电脑 xff0c 点击鼠标右键 xff0c 依次选择属性 设备管理器 显示适配器有以下图标 xff08 NVIDIA xff09 即可安装GPU x
  • C语言:strtok()函数简单用法

    strtok函数 切割字符串 第一个参数指定一个字符串 xff0c 它包含了0个或者多个由第二个参数 xff08 字符串 xff09 中的一个或多个分隔符分割的标记 strtok函数找到第一个参数中的下一个标记 xff0c 并将其用 39
  • ESP32之FreeRTOS--任务的创建和运行

    文章目录 前言一 创建任务和删除函数1 xTaskCreate 2 xTaskCreateStatic 3 xTaskCreateRestricted 4 vTaskDelete 二 任务函数和任务控制块TCB1 任务函数模板2 TCB 三