【Arduino】Free RTOS系统

news2024/12/27 12:21:36

目录

1、任务创建

2、任务删除

3、延迟函数

4、示例:


        ESP32的SDK包中内置了FreeRTOS,在FreeRTOS中,线程(Thread)和任务(Task)的概念是相同的。每个任务就是一个线程,有着自己的一个程序

        创建任务相当于创建分身,开启多任务后,你可以简单理解为你拥有了多个loop函数,这样每个函数就可以执行单独的功能

多任务的原理

        当操作系统使用某种任务调度策略允许多任务共享一个处理器时,虽然处理器在某一时刻只会给一件任务提供服务,因为调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。

注意事项

        FreeRTOS 任务不允许以任何方式从实现函数中返回——它们绝不能有一
条”return”语句,也不能执行到函数末尾

一个任务函数可以用来创建若干个任务——创建出的任务均是独立的执行实例,拥
有属于自己的栈空间,以及属于自己的自动变量(栈变量),即任务函数本身定义的变量。

1、任务创建

任务由FreeRTOS中xTaskCreate()这个函数创建

 

BaseType_t xTaskCreate(
    TaskFunction_t pxTaskCode,     // 任务函数指针
    const char * const pcName,      // 任务名称
    uint16_t usStackDepth,         // 任务堆栈深度
    void * const pvParameters,     // 传递给任务的参数
    UBaseType_t uxPriority,        // 任务优先级
    TaskHandle_t *pxCreatedTask    // 创建任务的句柄
);

2、任务删除

void vTaskDelete(TaskHandle_t xTaskToDelete);
void vTaskToDelete(void *params){
    // 任务操作...
    vTaskDelete(NULL); // 删除自身
}

void anotherFunction(){
    TaskHandle_t xTaskToDeleteHandle;
    xTaskCreate(vTaskToDelete, "TaskToDelete", 200, NULL, 2, &xTaskToDeleteHandle);
    // 在某个时刻决定删除这个任务
    vTaskDelete(xTaskToDeleteHandle);
}

3、延迟函数

在Free RTOS中一般不会使用delay()延迟函数,主要由于delay()函数会对程序造成阻塞,是通过CPU做循环的方式来延时,CPU在延时中是做不了其他东西的,大大浪费了CPU的效率!而且非常危险!在free RTOS系统中常用的是两个函数,相对延迟vTaskDelay和绝对延迟

vTaskDelay()

vTaskDelay()函数的参数单位是系统时钟节拍(Tick)。这意味着当你调用vTaskDelay(2000)时,任务将会被挂起并等待2000个系统时钟节拍后才恢复执行。

系统时钟节拍(Tick)的时长取决于FreeRTOS的配置,具体是多少毫秒或微秒取决于configTICK_RATE_HZ宏的定义,该宏设定了FreeRTOS系统时钟的频率。计算单个时钟节拍的时长可以用公式:

\text{单个Tick的时长} = \frac{1}{\text{configTICK_RATE_HZ}} \text{秒}

例如,如果configTICK_RATE_HZ被定义为1000,那么每个Tick代表1毫秒;如果定义为100,则每个Tick代表10毫秒。因此,在调用vTaskDelay(2000)时,任务将暂停的时间为2000个Tick乘以单个Tick的时长。

ESP32 Arduino环境下,FreeRTOS的心跳频率(即系统时钟节拍频率 configTICK_RATE_HZ)默认通常是100Hz。这意味着每秒钟产生100个时钟节拍,每个节拍之间的时间间隔是10毫秒。因此,当你在ESP32的Arduino代码中使用 vTaskDelay() 函数时,给定的数值应当理解为相对于这个默认节拍频率的延时周期数。例如,vTaskDelay(1) 会导致任务延迟10毫秒。

 vTaskDelay(Tick); 
ESP32  Tick:单位ms

4、示例:

        这里使用的是Platform io创建的,里面已经集成,无需添加该库文件。

#include <Arduino.h>
void task_LED(void *pxCreatedTask)
{

    while (1)
    {
        printf("指示灯任务\n");
        vTaskDelay(1000); 
    }
}
void task_button(void *pxCreatedTask)
{
    while (1)
    {
        printf("按键任务\n");
        vTaskDelay(2000); 
    }
}
// 调度任务
void init_task()
{
    xTaskCreate(
        task_LED,     // 任务函数
        "TaskReport", // 任务名
        1024 * 10,    // 任务栈,根据任务内使用的空间评估,例如任务中有一个10000个字节的数组,那空间最好选择10000+10000*50%
        NULL,         // 任务参数
        1,            // 任务优先级, with 3 (configMAX_PRIORITIES - 1) 是最高的,0是最低的.
        NULL          // 任务句柄
    );

    xTaskCreate(
        task_button,  // 任务函数
        "TaskButton", // 任务名
        1024 * 5,     // 任务栈
        NULL,         // 任务参数
        0,            // 任务优先级, with 3 (configMAX_PRIORITIES - 1) 是最高的,0是最低的.
        NULL          // 任务句柄
    );
}
void setup()
{
    Serial.begin(9600);
    init_task(); // 创建任务
    printf("初始化开始\n");
}
void loop()
{
    printf("main里面的循环\n");
    vTaskDelay(2000);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go框架三件套:Gorm的基本操作

1.概述 这里的Go框架三件套是指 Web、RPC、ORM框架&#xff0c;具体如下: Gorm框架 gorm框架是一个已经迭代了10年的功能强大的ORM框架&#xff0c;在字节内部被广泛使用并且拥有非常丰富的开源扩展。 Kitex框架 Kitex是字节内部的Golang微服务RPC框架&#xff0c;具有高性能…

IDEA不能创建新项目和新模块

问题&#xff1a; IDEA不管是创建新项目还是新模块都创建不成功&#xff0c;会报如下图错误 解决方案&#xff1a; 在电脑设置里搜索 “防火墙和网络保护” &#xff0c;打开如下图所示 找到你所安装的IDEA&#xff0c;更改设置&#xff0c;选中IDEA 最后&#xff0c;确定&am…

行为驱动开源免费接口测试框架:karate

什么是行为驱动测试&#xff1a; 行为驱动测试&#xff08;Behavior-Driven Testing&#xff0c;简称 BDT&#xff09;是一种测试方法&#xff0c;旨在通过描述系统行为和功能来编写测试用例。BDT的重点是从用户的角度出发&#xff0c;描述系统应该如何行为&#xff0c;而不是专…

机器学习笔记 KAN网络架构简述(Kolmogorov-Arnold Networks)

一、简述 在最近的研究中,出现了号称传统多层感知器 (MLP) 的突破性替代方案,重塑了人工神经网络 (ANN) 的格局。这种创新架构被称为柯尔莫哥洛夫-阿诺德网络 (KAN),它提出了一种受柯尔莫哥洛夫-阿诺德表示定理启发的函数逼近的方法。 与 MLP 不同,MLP 依赖于各个节…

嗨动PDF编辑器怎么对pdf修改?分享修改步骤

嗨动PDF编辑器怎么对pdf修改&#xff1f;PDF&#xff08;Portable Document Format&#xff09;格式因其跨平台、不易修改的特性&#xff0c;在日常工作和学习中得到了广泛的应用。然而&#xff0c;当需要对PDF文件进行修改时&#xff0c;许多人可能会感到困扰。此时&#xff0…

付费解锁隐藏动力和续航,订阅制又被特斯拉玩出花了

我们知道&#xff0c;「订阅制」早已成互联网领域各路大厂玩烂的操作。 上到程序订阅付费使用&#xff08;例如 Offics、Adobe&#xff09;&#xff0c;下到各类功能服务订阅&#xff08;如影视会员、网盘会员等&#xff09;。 甚至于某东、某宝等网购平台也整出了 VIP 订阅服…

2024五月母亲节嘉年华活动方案

2024以花之名 致谢母亲簪花趣味亲子五月母亲节嘉年华活动方案-43P 活动策划信息&#xff1a; 方案页码&#xff1a;43页 文件格式&#xff1a;PPT 方案简介&#xff1a; 岁月温柔治愈 母爱闪闪发光 一年一度的PY圈孝子孝女大赛即将到来 本次母亲节&#xff0c;“以花之名…

三分钟快速上手SpringSecurity框架

导入依赖框架 web 框架(spring-boot-starter-web) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> springSecurity 框架(spring-boot-starter-security) <de…

MySQL基础使用指南

难度就是价值所在。大家好&#xff0c;今天给大家分享一下关于MySQL的基础使用&#xff0c;MySQL 是一个流行的关系型数据库管理系统&#xff0c;被广泛应用于各种类型的应用程序开发中。本文中将介绍 MySQL 的基础使用方法&#xff0c;包括创建数据库、创建表格以及进行增删改…

景源畅信数字:做抖音切片的方法分享?

一提起抖音切片&#xff0c;很多人可能会想到那些让人眼前一亮的短视频。它们通常短小精悍&#xff0c;内容丰富多彩&#xff0c;能够迅速吸引观众的注意力。但是&#xff0c;如何制作出这样的切片视频呢?这就是我们今天要探讨的问题。 一、选材与剪辑 制作抖音切片&#xff0…

判断上三角矩阵 分数 15

题目展示&#xff1a; 代码展示&#xff1a; 点这里&#xff0c;输入题目名称即可检索更多题目答案 ​#include<stdio.h>int main() {//T-tint t 0;scanf("%d",&t);while(t--)//循环t次&#xff0c;处理t个矩阵{int n 0;scanf("%d",&n);…

自学VBA 设置单元格文字格式 笔记

一.设定对应单元格对应需要显示的格式 Cells(1, 1).Font.Size 18 字体大小 Cells(1, 2).Font.Color RGB(255, 0, 0) 字体颜色 Cells(1, 3).Font.Name "黑体" 字体类型 Cells(1, 4).Font.Italic True 字体斜体 Cells(1, 5).Font.FontStyle "BOLD"…

创新指南 | 企业AI战略 实施方案探讨(上):如何构建基于AI的新商业模型和业务场景

2023年以ChatGPT为代表的生成式AI推出以来&#xff0c;从投资界到企业界都掀起了一股热潮。那么从企业角度来看&#xff0c;生成式AI到底能为业务带来哪些增量呢&#xff1f;企业如何构建基于AI的商业模式并进行落地实施呢&#xff1f; 企业AI战略 实施方案探讨分为上下两篇&am…

开发常用的实体属性转化API,copyProperties方法的用途,需要注意的点。

目录 1. 摘要 2. 传统 set 方法转化属性 3. cn.hutool.core.bean.BeanUtil 包下 copyProperties 方法 3.1 转化对象属性多于原始对象属性 3.2 转化对象属性少于原始对象属性 3.3 转化对象属性与原始对象属性存在差 4. org.springframework.beans.BeanUtils 包下 copyPro…

几个排序器的verilog及其资源占用、延时分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 因为课题需要&#xff0c;调研了几个快速排序方法&#xff0c;并手写或者改进了若干待测试对象&#xff0c;包括记分板型冒泡排序&#xff08;这个是别人的&#xff09…

不相交集合的数据结构

一、不相交集合的操作 不相交集合的数据结构维护了一组不相交动态集的集合 &#xff0c;用集合中的某个成员作为代表标识集合。 集合在没有修改的情况下每次访问代表得到的答案是相同的&#xff0c;此外在其它一些应用中&#xff0c;可能按照规定选择集合的代表&#xff0c;例如…

Java:使用BigDecimal、NumberFormat和DecimalFormat保留小数

一、代码和调试结果 1.1 BigDecimal ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fa36749de8124266a730817710fdf737.png) 1.2 DecimalFormat 1.3 NumberFormat 二、原代码 BigDecimalUtil.java 代码 package utils;import java.math.BigDecimal; import jav…

NAT技术总结与双向NAT配置案例

NAT的转换方式&#xff1a; 1.静态转换&#xff1a;固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换&#xff1a;Basic NAT nat address-gr…

[ROS 系列学习教程] 建模与仿真 - URDF 建模实践

ROS 系列学习教程(总目录) 本文目录 一、机器人结构组成二、新建功能包三、编写launch文件四、创建底盘五、添加轮子六、添加其他部件七、解决部分实体位于地面以下的问题 前文介绍了URDF建模与URDF语法&#xff0c;接下来介绍怎么使用URDF从零构建一个机器人模型并在rviz中显示…

智能防疫电梯模拟控制系统设计-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的智能防疫电梯模拟控制系统&#xff0c;主要实现了多项功能。首先&#xff0c;系统进行无接触测温&#xff0c;如果温度正常则可以启动电梯运行&#xff0c;如果温度异常则电梯会报警提示有乘客体温异常&#xff0c;电梯不会运行。其…