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.hqwc.cn/news/519110.html

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

相关文章

深入解析Mybatis-Plus框架:简化Java持久层开发(八)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 本章节介绍如何通过Mybatis-Plus更新数据库中的数据。 本章节不需要前置准备,继续使用之前的测试类,数据库表进行操作。 &#x1f4…

2024 最新Google play应用上架详细流程

众所周知,Google Play 是应用出海开发者发布和推广 Android 应用的首选平台。今天跟大家分享一下在Google Paly上架应用的详细且实用的指南。 一、前提准备 可以正常访问Google play开发者平台的网络 已经注册好了的开发者账号 应用的Android App Bundle文件 隐私…

Python 中实现 CDF 累积分布图的两种方法

什么是累积分布 累积分布函数,又叫分布函数,是概率密度函数的积分,能完整描述一个实随机变量X的概率分布。一般以大写“CDF”(Cumulative Distribution Function)标记。 《百度百科》 累积分布函数,又叫分…

电子签名签章:重塑企业办公方式,开启智能合约新时代!

在现代社会,随着科技的发展,纸质文件逐渐被电子文件所取代,传统的签名方式也面临着数字化的转型。电子签名签章云服务就是在这样的背景下应运而生的一种新型技术服务,它结合了云计算、大数据、人工智能等前沿技术,为用…

input输入框的23中类型

HTML 的 <input> 元素支持多种类型&#xff0c;这些类型决定了用户如何与表单控件进行交互。以下是 HTML5 中 <input> 元素的 23 种类型&#xff0c;以及每种类型的代码示例和效果图的描述&#xff08;请注意&#xff0c;由于文本的限制&#xff0c;我无法直接在这…

LVGL如何创建页面并实现页面的切换

如何绘制一个页面 先搞清楚一个问题&#xff0c;那就是绘制一个页面&#xff0c;是直接创建一个新的屏幕&#xff0c;还是基于默认的屏幕创建一个一个的父类呢&#xff1f; 参考这篇文章 LVGL_多界面切换_lvgl 多页面建立-CSDN博客 可知通常是创建一个新的屏幕&#xff0c;每个…

谈谈this对象的理解以及this的指向问题

文章目录 this的定义绑定规则默认绑定隐式绑定new绑定显示修改箭头函数this的指向问题丢失的this有需要的请私信博主&#xff0c;还请麻烦给个关注&#xff0c;博主不定期更新&#xff0c;或许能够有所帮助&#xff01;&#xff01;请关注公众号 this的定义 函数的 this 关键字…

第 5 章 ROS常用组件静态坐标变换(自学二刷笔记)

5.1.2 静态坐标变换 所谓静态坐标变换&#xff0c;是指两个坐标系之间的相对位置是固定的。 需求描述: 现有一机器人模型&#xff0c;核心构成包含主体与雷达&#xff0c;各对应一坐标系&#xff0c;坐标系的原点分别位于主体与雷达的物理中心&#xff0c;已知雷达原点相对于…

R语言安装IDE工具,RStudio 安装

R语言安装IDE工具&#xff0c;RStudio 安装 介绍下载安装包安装使用运行结果快捷键和使用技巧常用快捷键使用技巧 介绍 RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于R编程语言的开发和数据分析。它提供了许多工具和功能&#xff0c;使R编程更加…

《汇编语言》第3版 (王爽)第10章检测点解析

第10章 检测点 检测点10.1&#xff1a;补全程序&#xff0c;实现从内存1000:0000处开始执行指令。 解析: 我们知道retf指令是用栈中的数据&#xff0c;同时修改CS和IP寄存器中的内容&#xff0c;实现远转移&#xff0c;而且是先出栈的数据放入IP中&#xff0c;后出栈的数据放入…

java-springboot 源码 01

01.springboot 是一个启动器 先安装maven&#xff0c;按照网上的流程来。主要是安装完成后&#xff0c;要修改conf目录下的setting.xml文件。 添加&#xff1a;阿里云镜像 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>ali…

unity-urp:视野雾

问题背景 恐怖游戏在黑夜或者某些场景下&#xff0c;需要用雾或者黑暗遮盖视野&#xff0c;搭建游戏氛围 效果 场景中&#xff0c;雾会遮挡场景和怪物&#xff0c;但是在玩家视野内雾会消散&#xff0c;距离玩家越近雾越薄。 当前是第三人称视角&#xff0c;但是可以轻松的…