FreeRTOS操作系统学习——任务管理

任务概念

在FreeRTOS中,一个任务相当于一个线程,可以有很多的任务,每个人任务可以设置不同的优先级。相同优先级的任务轮流使用CPU,高优先级的任务可以一直使用CPU,直到主动放弃,低级的任务才有被执行的机会。
任务函数原型如下

void ATaskFunction( void *pvParameters ); 

要注意的是:

  • 这个函数不能返回 ,并且必须处于死循环中或主动终止的情况,否则整个操作系统将无法使用
  • 同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个
  • 函数内部,尽量使用局部变量:每个任务都有自己的栈 ,每个任务运行这个函数时
  • 函数使用全局变量、静态变量的话,只有一个副本:多个任务使用的是同一个副本
void ATaskFunction( void *pvParameters ) 
{ 
/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */ 
int32_t lVariableExample = 0; 
/* 任务函数通常实现为一个无限循环 */ 
for( ;; ) 
{ 
/* 任务的代码 */ 
} 
/* 如果程序从循环中退出,一定要使用vTaskDelete删除自己 
* NULL表示删除的是自己 
*/ 
vTaskDelete( NULL ); 
/* 程序不会执行到这里, 如果执行到这里就出错了 */ ```
} 

任务创建

创建任务时可以使用2个函数:动态分配内存、静态分配内存。
使用动态分配内存的函数如下:

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

参数说明:
在这里插入图片描述

  1. 任务句柄:任务句柄(Task Handle)是在 FreeRTOS中用于标识和引用任务的数据类型。每个创建的任务都会分配一个唯一的任务句柄,通过该句柄可以对任务进行操作和管理。
  2. 任务句柄是一个指向任务控制块(Task Control Block,TCB)的指针。任务控制块是 FreeRTOS
    中用于描述和管理任务的数据结构,包含了任务的状态、优先级、堆栈等信息。
  3. 使用任务句柄,可以通过 FreeRTOS 提供的 API 函数对任务进行操作,例如挂起(suspend)、恢复(resume)、删除(delete)任务,或者查询任务的状态等。另外,任务句柄还可以用于任务通信和同步的机制,例如向任务发送信号量或消息。

使用静态分配内存的函数如下:

TaskHandle_t xTaskCreateStatic (  TaskFunction_t pxTaskCode,   // 函数指针, 任务函数 const char * const pcName,   // 任务的名字 const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节 void * const pvParameters,   // 调用任务函数时传入的参数 UBaseType_t uxPriority,      // 优先级 StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个buffer StaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务 
); 

相比于使用动态分配内存创建任务的函数,最后2个参数不一样:
在这里插入图片描述
动态分配内存与静态分配内存创建任务的区别:

xTaskCreate与 xTaskCreateStatic的功能上的区别是,xTaskCreate是操作系统自动分配内存,xTaskCreateStatic是需要程序员手动定义内存;
xTaskCreate适用于项目开发中内存余量比较充足的项目,只是简单的分配大小就可以了;
xTaskCreateStatic适用于项目开发中内存比较紧张的项目,事先定义好内存大小并占用内存空间,这样在系统编译的时候就可以确定总内存大小,也不会出现系统运行到当前任务时内存不足而出现崩溃的情况

任务删除

删除任务时使用的函数如下:

void vTaskDelete( TaskHandle_t xTaskToDelete ); 

在这里插入图片描述
怎么删除任务?举个不好的例子:
⚫ 自杀:vTaskDelete(NULL)
⚫ 被杀:别的任务执行vTaskDelete(pvTaskCode),pvTaskCode是自己的句柄
⚫ 杀人:执行vTaskDelete(pvTaskCode),pvTaskCode是别的任务的句柄

任务执行流程Tick

对于同优先级的任务,它们“轮流”执行。怎么轮流?你执行一会,我执行一会。
"一会"怎么定义?
人有心跳,心跳间隔基本恒定。
FreeRTOS中也有心跳,它使用定时器产生固定间隔的中断。这叫Tick、滴答,比如每10ms发生一次时钟中断。
在这里插入图片描述
有了Tick的概念后,我们就可以使用Tick来衡量时间了,比如:

vTaskDelay(2);  // 等待2个Tick,假设configTICK_RATE_HZ=100, Tick周期时10ms, 等待20ms // 还可以使用pdMS_TO_TICKS宏把ms转换为tick 
vTaskDelay(pdMS_TO_TICKS(100));  // 等待100ms

注意,基于Tick实现的延时并不精确,比如vTaskDelay(2)的本意是延迟2个Tick周期,有可能经过1个Tick多一点就返回了。
在这里插入图片描述
使用vTaskDelay 函数时,建议以ms为单位,使用pdMS_TO_TICKS把时间转换为Tick。 这样的代码就与configTICK_RATE_HZ无关,即使配置项configTICK_RATE_HZ改变了,我们也不用去修改代码。

任务状态

在FreeRTOS中任务状态有:运行状态,暂停状态,阻塞状态,就绪状态

  • 运行态(runnnig):当任务正在运行,此时的状态被称为运行态,即CPU的使用权被这个任务占用;
  • 挂起态(suspended):任务被暂时停止,通过调用挂起函数(vTaskSuspend())可以把指定任务挂起,任务挂起后暂时不会运行,只有调用恢复函数(xTaskResume())才可以退出挂起状态;
  • 阻塞态(blocked):任务在等待信号量、消息队列、事件标准组、系统延时时,被称为阻塞态,如果等待的事件到了,就会自动退出阻塞态,准备运行;
  • 就绪态(ready):任务已经具备了运行条件(没有被挂起或阻塞),但是又更高优先级或同优先级的任务正在运行,所以需要等待的状态。

在这里插入图片描述

一个函数要进入阻塞状态,只有在运行的时候才能进入,可以阻塞别人也可以阻塞自己,暂停状态也一样。
当任务进入暂停状态,只能有别人来操作,才能恢复成就绪态

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

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

相关文章

国产蓝鹏测控测径仪如何?

随着国力增强,中国制造品质提升,不仅仅是国外更多人认可,国内对国产制品也接受良好,测径仪这种智能测量设备,很多国内外厂家也在用国产设备。 测径仪厂家 蓝鹏测控作为智能几何尺寸测量仪生产厂家,已有10多…

MMdetection3D-v1.1.0rc5安装教程

文章目录 前言安装步骤1.创建环境并运行2.安装torch3.安装mmcv-full3.安装mmcls、mmsegmentation、mmdet4.源码安装mmdet3d5.补充测试效果 pip list汇总 前言 相信大家在开始学习mmdet3d时都会碰到环境安装失败的问题,特别是安装低版本mmdet3d时,由于官…

Spring框架Bean对象的五个作用域

一、前言:Bean对象简介 在Spring项目中,那些由Spring IoC容器所管理的对象,称为bean。简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而…

C++初阶:初识C++

目录 1. 前言:C 与 C语言2. C对于C语言语法的完善与补充2.1 命名冲突与命名空间2.1.1 命名空间的定义2.1.2 调用方式 2.3 补充:流的概念2.4 缺省参数2.4.1 缺省参数的使用 2.5 函数重载2.5.1 什么是函数重载2.5.2 函数重载的使用2.5.3 特殊情况&#xff…

SpringBoot集成JSP和war包部署到Tomcat

SpringBoot集成JSP 加依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot…

MedSAM 项目排坑记录

MedSAM 项目排坑记录 任务排坑过程配置python环境测试构建docker模型训练数据预处理 单GPU训练最后推理 任务 做一个课程大作业&#xff0c;需要进行CVPR2024年医疗影像分割赛题的打榜&#xff08;CVPR 2024: SEGMENT ANYTHING IN MEDICAL IMAGES ON LAPTOP&#xff09;。看到…

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…

vulhub中ThinkPHP 多语言本地文件包含漏洞复现

ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前&#xff0c;存在一处本地文件包含漏洞。当多语言特性被开启时&#xff0c;攻击者可以使用lang参数来包含任意PHP文件。 虽然只能包含本地PHP文件&#xff0c;但在开启了register_argc_argv且安装了pcel/pear的环…

如何在Win系统本地部署Jupyter Notbook交互笔记并结合内网穿透实现公网远程使用

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

2024第二届语言,教育与艺术鉴赏国际会议(ICLEAA 2024)

2024第二届语言&#xff0c;教育与艺术鉴赏国际会议&#xff08;ICLEAA 2024&#xff09; 一、【会议简介】 我们非常荣幸地邀请您参加2024第二届语言&#xff0c;教育与艺术鉴赏国际会议&#xff08;ICLEAA 2024&#xff09;&#xff0c;该会议将在美丽的苏州举行。 ICLEAA …

美团面试拷打:Redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

目录&#xff1a; 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨…

如何在Win系统部署Tomcat服务并实现远程访问内网站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学…

AIOps常见问题

AIOps的自动化通常指什么&#xff1f; AIOps 平台的自动化一般包括以下几个方面&#xff1a; 数据收集和整合&#xff1a;AIOps 平台可以从多个 IT 基础架构组件、应用需求与性能监视工具以及服务工单系统等数据源中收集并整合运维数据&#xff0c;形成一个全面的数据平台。数…

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来&#xff0c;已经在目标检测领域取得了显著的进展&#xff0c;以其快速和准确的特点而广受欢迎。 论文地址&#xf…

CentOS网络故障排查秘笈:实战指南

前言 作为一名热爱折腾 Linux 的技术达人&#xff0c;我深知网络故障会让人抓狂&#xff01;在这篇文章里&#xff0c;我和你分享了我的心得体会&#xff0c;从如何分析问题、识别瓶颈&#xff0c;到利用各种神器解决网络难题。不管你是新手小白还是老鸟大神&#xff0c;这里都…

凌鲨微应用开发流程

微应用开发流程 使用vite,nextjs等框架创建前端项目引入需要的api包通过调试界面进行调试 创建前端项目 vite yarn create vitenextjs yarn create next-app引入需要的api包 名称权限说明http跨域访问跨域http访问tauri提供的apilinksaas-minapp/api打开浏览器读本地文件…

【经验分享】 3D新手玩转VisionPro的工作流

第一步:文字生产图片 这样的工具有很多,stable diffusion,Midjourney等来生成图像 第二步:使用图片生3d模型工具 在线的工具有:https://huggingface.co/spaces/stabilityai/TripoSRhttps://huggingface.co/spaces/stabilityai/TripoSR 效果图 代码框架:Gi

CentOS7.9基于Apache2.4+Php7.4+Mysql8.0架构部署Zabbix6.0LTS 亲测验证完美通过方案

前言: Zabbix 由 Alexei Vladishev 创建,目前由 Zabbix SIA 主导开发和支持。 Zabbix 是一个企业级的开源分布式监控解决方案。 Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完整性的软件。 Zabbix 使用灵活的通知机制,…

蓝桥杯-排序

数组排序 Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序&#xff0c;并且时按从小到大的顺序。 package Work;import java.util.*;public class Imcomplete {public static void main(String args[]) {int arr[]new int [] {1,324,4,5,7,2};Arrays.sort(arr)…

安装系统后,如何单个盘空间扩展多个盘空间?

1、计算机-管理-存储-磁盘空间 2、压缩C盘符&#xff0c;分出多余空间 3、将多余空间扩展&#xff0c;然后修改盘符名称