当前位置: 首页 > news >正文

【ESP32】嵌入式FreeRtos--Task

FreeRTOS中文数据手册:https://www.freertos.org/zh-cn-cmn-s/RTOS.html

任务函数

任务函数描述
xTaskCreate()使用动态的方法创建一个任务
xTaskCreateStatic()使用静态的方法创建一个任务
xTaskCreatePinnedToCore指定任务运行的核心(最后一个参数)
vTaskDelete()删除一个任务
vTaskDelete(NULL)不创建任务句柄,表示删除当前任务

xTaskCreate()

BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,                 // 函数指针, 任务函数const char *const pcName,                  // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小void *const pvParameters,                  // 调用任务函数时传入的参数UBaseType_t uxPriority,                    // 优先级TaskHandle_t *const pxCreatedTask);        // 任务句柄, 以后使用它来操作这个任务

任务的句柄,相当于任务的地址,可用通过获取任务的句柄,对任务进行设置。

#include <Arduino.h>TaskHandle_t myHandle = NULL; // 创建一个任务句柄,空指针,避免产生野指针
void mytask(void *pt)         // 不指定传入指针的类型
{while (1){Serial.println("hello world");vTaskDelay(1000);}
}void setup()
{xTaskCreate(mytask, "", 1024, NULL, 1, &myHandle);vTaskDelay(1000);if (myHandle != NULL){vTaskDelete(myHandle); // 任务被删除后就不会在执行了,可以用于删除setup这个任务}
}void loop()
{
}

Task四种输入参数

传递整数
#include <Arduino.h>int testnum = 1;void mytask(void *pt)
{int *pint = (int *)pt;  // 数据解耦Serial.println(*pint);  // 输出结果为1vTaskDelete(NULL);
}void setup()
{Serial.begin(9600);xTaskCreate(mytask, "", 1024, (void *)&testnum, 1, NULL);
}void loop()
{
}
传递数组
#include <Arduino.h>int array[] = {1, 2, 3};void mytask(void *pt)
{int *parray = (int *)pt;  // 强制转换为数组指针for (int i = 0; i < sizeof(array) / sizeof(int); i++) {Serial.println(*(parray + i));  // 输出结果:1 2 3}vTaskDelete(NULL);
}void setup()
{Serial.begin(9600);// 数组名为数组元素的首地址,所以不需要&xTaskCreate(mytask, "", 1024 * 2, (void *)array, 1, NULL);
}void loop()
{
}
传递结构体
#include <Arduino.h>typedef struct STRUCT
{int a;char b;
} myStruct;myStruct test = {2, 'a'};void mytask(void *pt)
{myStruct *mytest = (myStruct *)pt; // 强制转换为结构体指针Serial.println(mytest->a); // 输出2Serial.println(mytest->b); // 输出avTaskDelete(NULL);
}void setup()
{Serial.begin(9600);xTaskCreate(mytask, "", 1024, (void *)&test, 1, NULL);
}void loop()
{
}
传递字符串
#include <Arduino.h>static const char *str = "hello world"; // static修饰代表只能在本文件中使用void mytask(void *pt)
{char *pstr = (char *)pt; // 强制转换为字符指针Serial.println(pstr);vTaskDelete(NULL);
}void setup()
{Serial.begin(115200);xTaskCreate(mytask, "", 1024, (void *)&str, 1, NULL);
}void loop()
{
}

任务优先级

一共有25个优先级别,最低为0,最高为24。(可用修改优先级别的数目超过25,但是不建议,级别越高,越占内存)

  • 同一优先级别:创建以后,顺序运行,切换相同的时间线,给与相同的运行时间
  • 不同优先级别:任务创建以后,先运行优先级别的任务,再运行低级别的任务
/*获取任务优先级、修改任务优先级*/UBaseType_t priority = 0;   // 任务优先级变量TaskHandle_t pxtask = NULL; // 创建任务的句柄xTaskCreatePinnedToCore(task1, "", 1024 * 2, NULL, 1, &pxtask, 1);priority = uxTaskPriorityGet(pxtask); // 查看任务的优先级vTaskPrioritySet(pxtask, 3);          // 设置任务的优先级
// 这种方法,设置优先级不起作用xTaskCreate(task1, "", 1024 * 2, NULL, 1, NULL);xTaskCreate(task2, "", 1024 * 2, NULL, 2, NULL);
  xTaskCreatePinnedToCore(task1, "", 1024 * 2, NULL, 1, NULL, 1);xTaskCreatePinnedToCore(task2, "", 1024 * 2, NULL, 2, NULL, 1);

使用ESP32测试注意事项:

  • 由于ESP32具有双核运行的功能,因此设置优先级和任务挂起无效,需要指定任务工作的核心,在同一个核心上,设置优先级才起作用。

任务的挂起和恢复

任务的状态:running、ready、blocked、suspended(挂起,暂停)

  • running:任务处于运行状态,如果运行 RTOS 的处理器只有一个内核,那么在任何给定时间内都只能有一个任务处于运行状态。
  • ready:不处于阻塞或挂起状态,但目前没有执行的任务,因为同等或更高优先级的不同任务已经处于运行状态。
  • blocked:如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态),直到延迟结束一个时间事件。
  • 挂起状态:与“阻塞”状态下的任务一样,“挂起”状态下的任务不能被选择进入运行状态,但处于挂起状态的任务 没有超时。
/*任务挂起*/TaskHandle_t pxtask = NULL; // 创建任务的句柄xTaskCreatePinnedToCore(task1, "", 1024 * 2, NULL, 1, &pxtask, 1);vTaskSuspend(pxtask);  // 挂起任务,任务不再执行vTaskResume(pxtask);  // 恢复被挂起的任务,继续执行vTaskSuspendAll();    // 挂起所有函数,挂起后不可以执行vTaskResumeAll();     // 恢复所有挂起函数

Task系统信息显示

vTaskList()

Task堆栈设置和调试

uxTaskGetStackHighWaterMark(句柄)查看当前函数剩余的内存大小,如果分配的内存不够,程序虽然不会报错,但是开发板会不断地重启。
分配的数量每+1,内存+4byte
以word为单位,1word = 4bytes

TaskHandle_t taskHandle; // 计算task的空间大小
xTaskCreatePinnedToCore(task1, "", 1024 * 2, NULL, 1, &taskHandle;, 1);int waterMark = uxTaskGetStackHighWaterMark(taskHandle);
Serial.print(F("Task Free Memory: ")); // 任务剩余空间
Serial.print(waterMark);  // 返回值即是当前任务所剩栈空间的最小值

Task看门狗

  1. watch dog有两种:一种是中断的watch dog,一种是task的watch dog
  2. 中断看门狗里面不能执行太多的代码,避免其他任务没有时间执行
  3. esp_task_wdt_add(句柄)开启看门狗
  4. esp_task_wdt_reset(句柄)喂狗

相关文章:

【ESP32】嵌入式FreeRtos--Task

FreeRTOS中文数据手册&#xff1a;https://www.freertos.org/zh-cn-cmn-s/RTOS.html 任务函数 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreateStatic()使用静态的方法创建一个任务xTaskCreatePinnedToCore指定任务运行的核心(最后一个参数)vTaskDelete()删…...

【操作系统】面试官都爱问的进程调度算法

【操作系统】面试官都爱问的进程调度算法 文章目录【操作系统】面试官都爱问的进程调度算法先来先服务调度算法最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法最高优先级调度算法多级反馈队列调度算法进程调度算法也称 CPU 调度算法&#xff0c;毕竟进程是由 CPU…...

Spring-Web spi机制解析

org.springframework.web.SpringServletContainerInitializer#onStartup 在这里打个断点&#xff0c;查看程序是否会进来 可以发现程序进来了&#xff1a;主要spi机制&#xff0c;看看这里做了什么操作&#xff1f; 去寻找所有实现了WebApplicationInitializer的类 将符合条件…...

数据结构|将链表中小于0的数全部放在大于0的数的前面

题1&#xff1a; 某带头结点的非空单链表L中所有元素为整数&#xff0c;结点类型定义如下&#xff1a; typedef struct node { int data; struct node *next; } LinkNode; 设计一个尽可能高效的算法&#xff0c;将所有小于零的结点移到所有大于等于零的结点的前面。 分…...

分享106个ASP影音娱乐源码,总有一款适合您

分享106个ASP影音娱乐源码&#xff0c;总有一款适合您 106个ASP影音娱乐源码下载链接&#xff1a;https://pan.baidu.com/s/13k8UaJrCci_z4Q0gQbtDtg?pwdjq44 提取码&#xff1a;jq44 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 我的博客地址&#xff1a;亚…...

win10 PyCharm Anaconda过程记录

1、Anaconda用来配置不同的虚拟环境 进入 Anaconda Prompt 输入conda activate Hui&#xff08;此为自己创建的放置虚拟环境的文件夹&#xff09; 编译运行过程中出现No module named seaborn后 pip install seaborn...

Chrome扩展程序导出备份与本地导入浏览器

现在即使在国内下载个chrome&#xff0c;转个插件也千难万难。现在科学上网也越来越难&#xff0c;由于众所周知的原因&#xff0c;连qiang这个话题都是敏感词。哀默于心死&#xff0c;还是回避这个话题 只要把之前装的chrome打包&#xff0c;然后再重新安装一遍。操作步骤如下…...

mysql常用运算符

mysql常用运算符一、去重和空值1.distinct2.null参与运算3.用ifnull函数解决问题二、比较运算符三、dual伪表和数值运算1.常规运算2.比较运算符3.<>安全相等四、常用正则相关的比较运算符1.基本运算符2.模糊查询3.正则表达式五、逻辑运算符六、位运算总结一、去重和空值 …...

PyTorch 深度学习框架:优雅而简洁的代码实现

PyTorch 是由 Facebook 发布的深度学习框架&#xff0c;旨在为研究人员和工程师提供快速、灵活和简单的实验平台。与其他框架相比&#xff0c;PyTorch 具有简洁的 API 和灵活的动态计算图&#xff0c;使得构建和训练深度神经网络变得更加优雅和简洁。本文将介绍 PyTorch 的基本…...

【SpringMVC】请求重定向和转发

forward&#xff1a;表示转发 处理器方法返回ModelAndView,实现转发forward 语法&#xff1a; setViewName("forward:视图文件完整路径") forward特点&#xff1a; 不和视图解析器一同使用&#xff0c;就当项目中没有视图解析器redirect&#xff1a;表示重定向 处理…...

Vue中@click的常见修饰符

在 Vue 的click事件中&#xff0c;可以使用以下修饰符&#xff1a; .stop&#xff1a;阻止事件继续传播。.prevent&#xff1a;阻止默认事件。.capture&#xff1a;使用事件捕获模式。.self&#xff1a;只当事件是从侦听器绑定的元素本身触发时才触发回调。.once&#xff1a;只…...

软件测试面试复盘:技术面没有难倒我,hr面被虐的体无完肤

一般提到面试&#xff0c;肯定都会想问一下面试结果&#xff0c;我就大概的说一下面试结果&#xff0c;哈哈&#xff0c;其实不太想说&#xff0c;因为挺惨的&#xff0c;并没有像很多大佬一样 ”已拿字节阿里腾讯各大厂offer”&#xff0c;但是毕竟是自己的经历&#xff0c;无…...

vue实现鼠标移入移出事件+解决鼠标事件没有反应

鼠标移入移出事件代码 <div mouseenter"onMouseOver(item)" mouseleave"onMouseOut"></div> methods methods:{// 鼠标移入onMouseOver(item){console.log(item, 鼠标进来了);},// 鼠标移出onMouseOut(){console.log(鼠标出去了);}, }, 这…...

右键移动文件.cmd

REM xcopy /yis %1% % % %D:\test\% REM https://zhuanlan.zhihu.com/p/38330443 不能移动文件夹 不知道为什么 xcopy&#xff08;拷贝目录文件、目录结构的指令&#xff09;_尚可名片 写了个JAVA程序&#xff0c;怎样实现在win选中文件后&#xff0c;右键发送到我的程序&am…...

web基础

web基础 与http 域名&#xff1a;由于IP地址不易记忆&#xff0c;域名用来代替IP地址&#xff0c; &#xff08;DNS&#xff09;服务与配置&#xff1a;先在本地hosts里去找&#xff0c;然后在本地域名服务器递归查找&#xff0c;本地域名服务器在一级二级按域名长度迭代查找后…...

牛客网算法八股刷题系列(七)正则化(软间隔SVM再回首)

牛客网算法八股刷题系列——正则化[软间隔SVM再回首]题目描述正确答案&#xff1a;C\mathcal CC题目解析开端&#xff1a;关于函数间隔问题解释的补充软间隔SVM\text{SVM}SVMHinge\text{Hinge}Hinge损失函数支持向量机的正则化题目描述 关于支持向量机(Support Vector Machine…...

开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门

一、理论知识准备 您需要对微信小程序开发有所了解&#xff1a; 1&#xff09;真正零基础入门学习笔记系列2&#xff09;从零开始的微信小程序入门教程3&#xff09;最全教程&#xff1a;微信小程序开发入门详解 您需要对WebSocket技术有所了解&#xff1a; 1&#xff09;新…...

【C++从0到1】11、C++中赋值运算

C从0到1全系列教程 1、赋值运算 运算符示例描述c a b;将把a b的值赋给c。 把右边操作数的值赋给左边操作数。c a;相当于 c c a; 加且赋值运算符&#xff0c;把右边操作数加上左边操作数的结果赋值给左边操作数。-c - a;相当于 c c - a; 减且赋值运算符&#xff0c;把左…...

GaussDB数据库事务介绍

目录 一、前言 二、GaussDB事务的定义及应用场景 三、GaussDB事务的管理 四、GaussDB事务语句 五、GaussDB事务隔离 六、GaussDB事务监控 七、总结 一、前言 随着大数据和互联网技术的不断发展&#xff0c;数据库管理系统的作用越来越重要&#xff0c;实现数据的快速读…...

MYSQL——美团面试题

MYSQL——美团面试题 2023/3/27 美团二面 题目描述 Create table If Not Exists courses (student varchar(255), class varchar(255));insert into courses (student, class) values (A, Math); insert into courses (student, class) values (B, English); insert into co…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...