【Arduino】Free RTOS系统

目录

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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT实现Home框架的两种方式

在触摸屏开发QT界面一般都是一个Home页面&#xff0c;然后button触发进入子页面显示&#xff0c;下面介绍这个home框架实现的两种方式&#xff1a; 1.方式一&#xff1a;用stackedWidget实现 &#xff08;1&#xff09;StackedWidget控件在Qt框架中是一个用于管理多个子窗口或…

【多模态】30、GPT4V_OCR | GPT4V 在 OCR 数据集上效果测评

文章目录 一、背景二、测评2.1 场景文本识别2.2 手写文本识别2.3 手写数学公式识别2.4 图表结构识别&#xff08;不考虑单元格中的文本内容&#xff09;2.5 从内容丰富的文档中抽取信息 三、讨论 论文&#xff1a;EXPLORING OCR CAPABILITIES OF GPT-4V(ISION) : A QUANTITATIV…

为什么Python中会有集合set类型?

知乎上有人提问&#xff0c;为什么Python有了列表list、元组tuple、字典dict这样的容器后&#xff0c;还要弄个集合set&#xff1f; 确实set和list、tuple、dict一样&#xff0c;都是python的主要数据类型&#xff0c;它们的作用是不同的。 因为set是数学意义上的集合&#xf…

Kubernetes进阶对象Deployment、DaemonSet、Service

Deployment Pod 在 YAML 里使用“containers”就可以任意编排容器&#xff0c;而且还有一个“restartPolicy”字段&#xff0c;默认值就是 Always&#xff0c;可以监控 Pod 里容器的状态&#xff0c;一旦发生异常&#xff0c;就会自动重启容器。 不过&#xff0c;“restartPo…

C语言简要(一)

总得让她开心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }输出 printf("hello world!\n"); "里面的内容叫做“字符串”&#xff0c;prin…

战网国际服注册教程 暴雪战网国际服账号注册一站式教程分享

战网国际版&#xff0c;也即Battle.net环球版&#xff0c;是由暴雪娱乐操刀的全球化游戏交流枢纽&#xff0c;它突破地理限制&#xff0c;拥抱全世界的游戏玩家。与仅限特定地区的版本不同&#xff0c;国际版为玩家开辟了无障碍通道&#xff0c;让他们得以自由探索暴雪庞大游戏…

冥想训练具体方法有哪些|流静冥想

冥想是一种身体的放松和敏锐的警觉性相结合的状态。 每日练习的好处远不止你花在集中注意力的那几分钟。桑托雷利是建在乌斯特的马萨诸塞大学医学院的减压诊所的所长&#xff0c;她也是《自愈》的作者&#xff0c;她说&#xff1a;"冥想是一种工具&#xff0c;通过练习&a…

【计算机毕业设计】springboot分类信息服务平台移动端的设计与实现

分类信息 服务平台设计的目的是为用户提供活动信息、活动记录等方面的平台。 与PC端应用程序相比&#xff0c;分类信息服务平台的设计主要面向于移动端&#xff0c;旨在为管理员和用户、商铺提供一个分类信息服务平台。用户可以通过Android及时查看活动信息等。 分类信息服务平…

Python使用asyncio包实现异步编程

1. 异步编程 异步编程是一种编程范式&#xff0c;用于处理程序中需要等待异步操作完成后才能继续执行的情况。异步编程允许程序在执行耗时的操作时不被阻塞&#xff0c;而是在等待操作完成时继续执行其他任务。这对于处理诸如文件 I/O、网络请求、定时器等需要等待的操作非常有…

源代码防泄漏之沙盒技术分析

随着企业信息化的快速发展&#xff0c;对于单位来说&#xff0c;网络中包含了很多重要的信息资料&#xff0c;比如网络中积累和掌握了大量的研发数据、生产数据和运营信息等&#xff0c;组织不希望这些资料离开企业内部的网络环境&#xff0c;甚至不允许在网络外部传递与交流&a…

uniapp小程序控制页面元素滚动指定距离

要实现页面元素滚动&#xff0c;最好还是使用 scroll-view 来实现&#xff0c;官方文档地址&#xff1a;scroll-view | uni-app官网 通过设置scroll事件来实现滚动监听&#xff0c;当滚动的元素的时候&#xff0c;就会触发这个事件&#xff0c;并且事件里面包含有滚动距离&…

Star CCM+创建报告与监测

前言 结合前文介绍&#xff0c;创建衍生零部件的目的是为了监测创建的点或者面的数据变化。如Star CCM衍生零部件的创建介绍&#xff0c;创建完所需的点或者面后&#xff0c;下一步就是对创建的点、面进行监测。 一 报告类型介绍 在Star中&#xff0c;通过创建报告来对监测的…

你还在手动加好友?试试这款神器,释放双手自动添加!

你还在手动添加微信好友吗&#xff1f;尤其是在忙碌的时候&#xff0c;手动加好友不仅费时又很容易出错。试试这个自动添加好友神器——个微管理系统&#xff0c;释放你的双手&#xff0c;轻松拓展好友列表&#xff01; 1、多号同时登录在线 系统支持多个微信号同时登录在线&…

Transformer - Self-Attention层的复杂度的计算

Transformer - Self-Attention层的复杂度的计算 flyfish 矩阵的维度 下面矩阵的维度是32即 3行&#xff0c;2列 6,10等都是矩阵里的元素 如果矩阵A的列数与矩阵B的行数相同&#xff0c;那么这两个矩阵可以相乘。即&#xff0c;若A是一个mn矩阵&#xff0c;B是一个np矩阵&am…

SpringBoot打包运行,没有主清单属性

java -jar zhoao1.jar运行程序报&#xff1a;没有主清单属性 在pom.xml加配置&#xff0c;在打包即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>&…

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(1)工程建立

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

【电路笔记】-有源低通滤波器

有源低通滤波器 文章目录 有源低通滤波器1、概述2、有源低通滤波器2.1 一阶低通滤波器2.2 带放大功能的有源低通滤波器3、有源低通滤波器示例4、二阶低通有源滤波器通过将基本的 RC 低通滤波器电路与运算放大器相结合,我们可以创建一个具有放大功能的有源低通滤波器电路。 1、…

84.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-筛选与技能有关的数据包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

大规模LiDAR数据处理

点云存在许多描述环境或建筑物等物体的 x、y、z 坐标。通过激光技术 (LiDAR) 获取的点云通常带有每个坐标的额外测量值和特征。例如&#xff0c;反射强度、回波次数、回波、扫描角度和 RGB 值。换句话说&#xff0c;点云本质上是大量的数据集。 在本文中&#xff0c;我们使用开…