FreeRTOS入门教程(任务状态)

news2024/11/25 12:00:58

文章目录

  • 前言
  • 一、简单实验
  • 二、任务状态概念讲解
  • 三、vTaskDelay和vTaskDelayUntil
    • 1.vTaskDelay
    • 2.vTaskDelayUntil
    • 3.vTaskDelay和vTaskDelayUntil的区别
  • 总结


前言

本篇文章将为大家讲解FreeRTOS中的任务状态,在FreeRTOS任务是有非常多种状态的,了解了任务的这些状态有助于我们理解任务是如何运行和停止的。

一、简单实验

在将这个之前我们先来做一个实验来观察任务是怎么样运行的:
代码:

下面的代码先定义了三个标志位,这三个标志位标志着哪一个任务在运行。

static int Task1Flag = 0;
static int Task2Flag = 0;
static int Task3Flag = 0;

//任务执行函数
void Task1(void * param)
{
	static int i = 0;
	while (1)
	{
		Task1Flag = 1;
		Task2Flag = 0;
		Task3Flag = 0;
	}
}

//任务执行函数
void Task2(void * param)
{
	while (1)
	{
		Task1Flag = 0;
		Task2Flag = 1;
		Task3Flag = 0;		
	}
}

//任务执行函数
void Task3(void * param)
{
	while (1)
	{
		Task1Flag = 0;
		Task2Flag = 0;
		Task3Flag = 1;		
	}
}

打开keil中的模拟串口:
在这里插入图片描述

打开keil中的逻辑分析仪:
在这里插入图片描述
将定义的三个变量加入逻辑分析仪中:
在这里插入图片描述
将状态都设置为bit:
在这里插入图片描述
设置好后全速运行代码:
我们可以观察到其实这三个任务并不是在同一时刻执行的,而是分开执行,只是执行时间较短我们无法分辨出到底是谁在执行。
在这里插入图片描述
通过观察每个任务的执行时间可以得知每个任务运行的时间大概是1ms左右,这是什么原因呢?

在FreeRTOS中存在一个Tick中断每当发生一次中断时就会判断是否需要进行任务的切换,那么这个Tick中断又是多少ms发生一次呢?

在FreeRTOSConfig这个文件中我们可以找到答案:
在这里插入图片描述
configTICK_RATE_HZ指定了内核时钟节拍的频率,以赫兹(Hz)为单位。

在FreeRTOS中,内核时钟节拍是一种时间标准,它用于测量任务运行时间、等待时间、计时器等功能的时间。内核时钟节拍的频率可以通过configTICK_RATE_HZ来设置,其默认值是1000,表示每秒进行1000次时钟节拍,即时钟节拍的周期为1毫秒。

还有一个问题就是为什么是任务3先执行呢?
在创建任务函数内部可以看到这样一个函数,这个函数会将创建好的任务添加进入就绪链表,后创建的任务在链表的最前面,所以后创建的任务将会被先取出来执行。
在这里插入图片描述

二、任务状态概念讲解

这里使用百问网的一张任务转换图片来讲解:
在这里插入图片描述
在FreeRTOS中,每个任务都有一个状态,表示当前任务的情况。FreeRTOS使用一些特定的宏定义来表示不同的任务状态,这些宏定义包括:

eRunning:表示任务正在运行。

eReady:表示任务处于就绪状态,等待调度器将其调度执行。

eBlocked:表示任务处于阻塞状态,即等待某些事件的发生,例如等待信号量、消息队列、定时器超时等。

eSuspended:表示任务处于暂停状态,即该任务已经被暂停,不参与调度,但它的状态和资源保留,能够在需要时恢复运行。

eDeleted:表示任务已被删除,对应的控制块和栈空间已被释放。

任务状态之间的转换是由FreeRTOS内核自动管理的。任务常常在下列几种情况下会发生状态变化:

创建任务时,任务状态由“未开始”变为“就绪”。

调度器根据任务优先级选取该任务并将其状态变为“运行中”。

任务等待某个事件(如信号量)时,任务状态变为“阻塞”。

任务等待其他任务释放资源时,任务状态可能会转变为“挂起”。

任务自己调用删除函数删除自己时,任务状态变为“已删除”。

三、vTaskDelay和vTaskDelayUntil

1.vTaskDelay

vTaskDelay函数用于使当前任务暂停一段时间之后再继续执行。它的参数是一个整数,表示需要延迟的系统节拍数。例如,在默认的配置下,内核节拍周期为1毫秒,因此vTaskDelay(100)即为使当前任务暂停100毫秒。

需要注意的是,vTaskDelay会引起任务阻塞,同时该延迟时间不是绝对准确的。在等待期间FreeRTOS会尝试进行其他任务的调度,因此实际的延迟时间可能会比指定的时间长。

代码示例:

void Task1(void * param)
{
	static int i = 0;
	while (1)
	{
		printf("Task1\r\n");
		vTaskDelay(1000);
	}
}

//任务执行函数
void Task2(void * param)
{
	while (1)
	{
		printf("Task2\r\n");
		vTaskDelay(2000);
	}
}

//任务执行函数
void Task3(void * param)
{
	while (1)
	{
		printf("Task3\r\n");
		vTaskDelay(3000);
	}
}

观察串口的打印结果:
在这里插入图片描述

2.vTaskDelayUntil

vTaskDelayUntil 是一个精确的定时函数,它使任务等待到特定的时间点才重新变为就绪状态。

调用 vTaskDelayUntil 时,需要提供一个时间戳(以 TickType_t 类型表示),任务将休眠,直到系统时钟达到或超过该时间戳。

这使得任务可以以精确的时间间隔执行,非常适合实时性要求高的应用。

// 定义一个任务,该任务会每隔1秒输出一次消息
void Task1(void* pvParameters)
{
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 1秒的时间间隔

    // 获取当前时间作为初始时间
    xLastWakeTime = xTaskGetTickCount();

    while (1)
    {
        // 执行任务1的操作,例如输出消息
        printf("Task1 is running...\n");

        // 等待到达下一个时间间隔
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
    }
}

int main(void)
{
    // 初始化FreeRTOS内核和硬件

    // 创建任务1
    xTaskCreate(Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // 启动调度器
    vTaskStartScheduler();

    // 此处不会执行,因为调度器会接管控制权
    return 0;
}

3.vTaskDelay和vTaskDelayUntil的区别

vTaskDelay函数和vTaskDelayUntil函数都用于在FreeRTOS中实现任务的时间延迟,但它们的方式不同。

vTaskDelay函数通过传递一个相对延迟的节拍数来工作。任务会阻塞指定的节拍数,然后继续执行。这意味着vTaskDelay的延迟时间是相对于当前任务的执行时间而言的,实际的延迟时间可能会受到任务切换和系统负载的影响。因此,无法保证精确的延迟时间,可能会有一定的误差。

vTaskDelayUntil函数通过传递一个绝对时间点(以节拍数表示)来工作。任务会等待直到当前时间达到或超过传递的绝对时间点,然后继续执行。这意味着vTaskDelayUntil提供了更精确的延迟控制,可以实现准确的定时任务。您可以根据需要计算下一个执行时间点,并将其传递给vTaskDelayUntil函数,任务将在该时间点进行阻塞,确保精确的延迟时间。

vTaskDelay用于相对延迟,而vTaskDelayUntil用于绝对时间点延迟,使得在实现定时任务时更加方便和精确。

总结

本篇文章就讲解到这里。

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

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

相关文章

YOLOv7改进:GAMAttention注意力机制

1.背景介绍 为了提高各种计算机视觉任务的性能,人们研究了各种注意机制。然而,以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此,我们提出了一种全局调度机制,通过减少信息缩减和放大全局交互表示来提高深…

风光储一体化能源中心 | 数字孪生智慧能源

自“双碳”目标提出以来,我国能源产业不断朝着清洁低碳化、绿色化的方向发展。其中,风能、太阳能等可再生能源在促进全球能源可持续发展、共建清洁美丽世界中被寄予厚望。风能、太阳能具有波动性、间歇性、随机性等特点,主要通过转化为电能再…

This dependency was not found: vxe-table/lib/vxe-table in ./src/main.js

描述 使用时 安装 npm install xe-utils vxe-table 引入 import Vue from vue import xe-utils import VXETable from vxe-table import vxe-table/lib/style.css vxe-table是一个基于 vue 的 PC 端表格组件, 支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验…

微信公众平台怎么添加秒杀活动

微信公众平台是一个非常有用的工具,它可以帮助企业或个人建立自己的品牌形象,增加用户粘性,提高销售业绩等等。在微信公众平台上添加秒杀活动为主题可以吸引更多的用户关注,促进销售,提高品牌知名度等。下面我们将介绍…

uni-app 实现凸起的 tabbar 底部导航栏

效果图 在 pages.json 中设置隐藏自带的 tabbar 导航栏 "custom": true, // 开启自定义tabBar(不填每次原来的tabbar在重新加载时都回闪现) 新建一个 custom-tabbar.vue 自定义组件页面 custom-tabbar.vue <!-- 自定义底部导航栏 --> <template><v…

图像直方图的基础知识

直方图的概念 图像直方图反映了图像中的灰度分布规律。它描述每个灰度级具有的像元个数&#xff0c;但不包含这些像元在图像中的位置信息。任何一幅特定的图像都有唯一的直方图与之对应&#xff0c;但不同的图像可以有相同的直方图。如果一幅图像有两个不相连的区域组成&#…

ARM Linux DIY(十四)摄像头捕获画面显示到屏幕

前言 前期已经调试好了摄像头和屏幕&#xff0c;今天我们将摄像头捕获的画面显示到屏幕上。 原理 摄像头对应 /dev/video0&#xff0c;屏幕对应 /dev/fb0&#xff0c;所以我们只要写一个应用程序&#xff0c;读取 video0 写入到 fb0 就可以了。 应用程序代码实例 camera_d…

[PyTorch][chapter 55][WGAN]

前言&#xff1a; 前面讲到GAN 在训练生成器的时候&#xff0c;如果当前的Pr 和 Pg 的分布不重叠场景下&#xff1a; JS散度为一个固定值&#xff0c;梯度为0&#xff0c;导致无法更新生成器G WGAN的全称是WassersteinGAN&#xff0c;它提出了用Wasserstein距离&#xff08;也…

第2章 算法

2.1 开场白 2.2 数据结构与算法之间的关系 在“数据结构”课程中&#xff0c;就算谈到算法&#xff0c;也是为了帮助理解好数据结构&#xff0c;并不会详细谈及算法的方方面面。 2.3 两种算法的比较 2.4 算法的定义 算法是解决特定问题求解步骤的描述&#xff0c;在计算机…

【AI视野·今日Robot 机器人论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 26 Sep 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Extreme Parkour with Legged Robots Authors Xuxin Cheng, Kexin Shi, Ananye Agarwal, Deepak Pathak人类可以通过以高度动态…

华为智能企业远程办公安全解决方案(1)

华为智能企业远程办公安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业远程办公业务概述企业远程办公安全风险分析企业远程办公环境搭建需求分析 方案设计组网架构设备选型方案亮点 课程地址 本方案相关课程资源已在华为O3社区发布&#xff0c;可按照以下…

shell脚本学习笔记

shell脚本重点记录 判断文件或者文件夹是否存在 if [ ! -d "log" ];thenchmod 707 $file1一个文件的权限包括读取、写入、执行&#xff0c;权限范围包含所有者、所属组、其他人&#xff0c;可以通过数字或者字母描述一个文件的权限&#xff1a;读取权限对应r或4&a…

高速,低延,任意频丨庚顿新一代实时数据库鼎力支撑电力装备服务数字化

产品同质化日趋严重以及市场需求不断迭代等内外形势下&#xff0c;电力装备制造业自身赢利需求不断增涨&#xff0c;电力等下游产业数字化发展形成倒逼之态&#xff0c;作为国家未来发展的高端装备创新工程主战场&#xff0c;电力装备智能化以及服务型转型升级已经成为装备制造…

在nodejs中如何防止ssrf攻击

在nodejs中如何防止ssrf攻击 什么是ssrf攻击 ssrf&#xff08;server-side request forgery&#xff09;是服务器端请求伪造&#xff0c;指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)…

mac docker部署hadoop集群

1. 安装docker 确保电脑已经安装docker docker安装过程可自行查找资料&#xff0c;mac下docker可以使用brew命令安装 安装之后&#xff0c;查看docker版本&#xff0c;确认安装成功 docker -v2. 下载jdk 最好下载jdk-8&#xff0c;jdk的版本过高可能hadoop2.x不支持jdk-8的下…

掌握 JavaScript 数组方法:了解如何操作和优化数组

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Android Logcat 命令行工具

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、日常用法3.1 面板介绍3.2 日志过滤…

零代码编程:用ChatGPT批量将多个文件夹中的视频转为音频

有多个文件夹中的 视频&#xff0c;都要批量转换成音频格式。 转换完成后要删除视频。虽然现在已经有很多格式转换软件可以实现这个功能&#xff0c;但是需要一个个文件夹的操作&#xff0c;还要手动去删除视频。用ChatGPT来写一个批量自动操作程序吧&#xff1a; 输入提示词如…

获取el-select选中的下标

accountZbList:[ ]:下拉列表已通过接口获取数据 <el-row><el-col :span"12"><el-form-item label"账簙" prop"accountTook" class"itemzb"><el-select v-model"tableForm.accountTook" placeholder&…

软件测试基础学习

注意&#xff1a; 各位同学们&#xff0c;今年本人求职目前遇到的情况大体是这样了&#xff0c;开发太卷&#xff0c;学历高的话优势非常的大&#xff0c;公司会根据实际情况考虑是否值得培养&#xff08;哪怕技术差一点&#xff09;&#xff1b;学历稍微低一些但是技术熟练的…