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.mfbz.cn/a/438046.html

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

相关文章

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型,可以绘制动漫、3D、科幻、真实等类型的图片。 …

响应式编程五股票订阅系统实现

响应式编程五 使用StepVerifier测试响应式流StepVerifier要点 使用StepVerifier进行高级测试股票订阅系统数据库表 使用StepVerifier测试响应式流 出于测试目的,Reactor 提供了额外的 reactor-test 模块,该模块提供了 StepVerifier。StepVerifier 提供了…

Go的安装

一. 下载地址 Go官方下载地址:https://golang.org/dl/ Go中文网:https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量,用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…

【JavaEE初阶】 JVM 运行时数据区简介

文章目录 🍃前言🌲堆(线程共享)🎄Java虚拟机栈(线程私有)🎋本地方法栈(线程私有)🌳程序计数器(线程私有)🌴方法…

CentOS上安装MySQL 5.7和MySQL 8.0教程

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

Hive的性能优化

1.调优概述 Hive 作为大数据领域常用的数据仓库组件,在设计和查询时要特别注意效率。影响 Hive 效率的几乎从不是数据量过大,而是数据倾斜、数据冗余、Job或I/O过多、MapReduce分配不合理等等。对 Hive 的调优既包含 Hive 的建表设计方面,对H…

如何学习I2C协议

文章目录 学习I2C协议0 懒人直达1 了解协议开发者2 从恩智浦半导体公司下载官方技术文档3 翻译成中文4 资源下载 学习I2C协议 0 懒人直达 点击直达 1 了解协议开发者 I2C(Inter-Integrated Circuit)协议是由荷兰皇家飞利浦电子公司(现恩智…

python 基础知识点(蓝桥杯python科目个人复习计划59)

今日复习内容:做题 例题1:建造房屋 问题描述: 小蓝和小桥是两位年轻的建筑师,他们正在设计一座新的城市。 在这个城市中,有N条街道,每条街道上有M个位置可以建造房屋(一个位置只能建造一个房…

#14vue3生成表单并跳转到外部地址的方式

1、背景 后端返回的json数据中包含一个json数组,此数组中是目标跳转地址所需要的form表单的数据。 2、跳转前的页面 const goto () > {finish.value true;request.post(/xxx/yyy,{zzz: zzz.value}).then(res > {const url res.data.submitUrlconst params…

洞察未来5-10年数字化转型的革命性趋势

“十四五”规划和2035年远景目标纲要提出了加快数字化发展,建设数字中国的目标, 这意味着数字化转型将成为推动生产方式、生活方式和治理方式变革的关键力量。 加快数字化发展 建设数字中国 ⭐ 打造数字经济新优势 ⭐ 加快数字社会建设步伐 ⭐ 提高数字…

【力扣白嫖日记】1070.产品销售分析III

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1070.产品销售分析III 表:Sales 列名类型sale_idintproduct_idintyearintquantityintpriceint …

Selenium自动化测试-3.元素定位(1)

这次我们要分享的是对元素的定位,在一个页面中有很多不同的策略来定位一个元素,我们选择最合适的方法即可。 一个页面最基本组成单元是元素,想要定位一个元素,我们需要特定的信息来说明这个元素的唯一特征。 selenium 主要提供了…

Javaweb之Web后端开发总结的详细解析

4. Web后端开发总结 到此基于SpringBoot进行web后端开发的相关知识我们已经学习完毕了。下面我们一起针对这段web课程做一个总结。 我们来回顾一下关于web后端开发,我们都学习了哪些内容,以及每一块知识,具体是属于哪个框架的。 web后端开…

BUUCTF-Misc2

wireshark1 1.打开附件 发现是流量包,放到Wireshark中分析 2.过滤 根据题目的提示寻找管理员登录的网站,从中获取密码 用http.request.methodPOST,过滤当前的 HTTP 请求为 POST 方法 3.查找 双击过滤后的流量包,查找管理员密码…

HarmonyOS(二)Ability应用模型概述

目录 1 Ability概念 2 Ability形态 3 Stage优势 4 Stage模型结构 5 总结 注:本章内容提前声明。 基于HarmonyOS开发者3.1/4.0版本配套的开发者文档,对应API能力级别为API 9 Release。 详情可参考官网API入门第一章应用模型文档中心 1 Ability概念…

Sleuth(Micrometer)+ZipKin分布式链路追踪

Sleuth(Micrometer)ZipKin分布式链路追踪 Micrometer springboot3之前还可以用sleuth,springboot3之后就被Micrometer所替代 官网https://github.com/spring-cloud/spring-cloud-sleuth 为什么会出现这个技术? 在微服务框架中,一个由客户…

SAP MM学习笔记44 - 特殊调达流程 - Blanket购买发注(汇总采购)

上一章学习了 支付计划,本章继续学习 Blanket购买发注(汇总采购)。 SAP MM学习笔记43 - 特殊调达流程 - 支付计划-CSDN博客 1,Blanket购买发注 概要 其实就是订好一个大致数额,然后让随便买,只要不超这个…

O2O:Offline Meta-Reinforcement Learning with Online Self-Supervision

ICML 2022 paper Introduction 元强化学习(Meta RL)结合O2O。元RL需要学习一个探索策略收集数据,同时还需学习一个策略快速适应新任务。由于策略是在固定的离线数据集上进行元训练的,因此在适应探索策略收集的数据时,它可能表现得不可预测&…

汽车小车车灯无痕修复用的胶是什么胶?

汽车小车车灯无痕修复用的胶是什么胶? 可以使用在小车车灯无痕修复中的胶水,通常使用的车灯无痕修复专用UV胶。 车灯无痕修复专用胶主要成份是改性丙烯酸UV树脂,主要应用在车灯的专业无痕修复领域。它可以用于修复车灯壳的裂缝或破损&#xf…

浅析扩散模型与图像生成【应用篇】(八)——BBDM

8. BBDM: Image-to-Image Translation with Brownian Bridge Diffusion Models 本文提出一种基于布朗桥(Brownian Bridge)的扩散模型用于图像到图像的转换。图像到图像转换的目标是将源域 A A A中的图像 I A I_A IA​,映射到目标域 B B B中得…