【Freertos基础入门】freertos任务的优先级

news2025/1/16 13:57:31

文章目录

  • 前言
  • 一、任务优先级
    • 1.Tick
    • 2.修改任务优先级
  • 总结


前言

本系列基于stm32系列单片机来使用freerots

任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。


一、任务优先级

想象一下你在等候一个重要电话,同时又有其他事情要处理,比如看电视、吃饭或打扫房间。这时候,你可能会根据电话的重要性来决定优先处理的事情。

在计算机中,“优先级”是用来决定任务执行顺序的一个指标。就像你有很多事情要做,计算机也有很多任务要处理,比如读取数据、计算、响应用户操作等等。但是,由于计算机资源有限,它不可能同时处理所有任务。于是,我们可以将任务设置优先级,告诉计算机哪些任务更重要或更紧急。

比如说,你有两个任务,一个是检测火灾的传感器,另一个是播放音乐的任务。显然,当火灾传感器检测到火情时,它的任务优先级应该更高,因为这是一个紧急的情况,需要立即处理。而播放音乐的任务优先级相对较低,它不是那么紧急,可以稍后再处理。

通过设置任务的优先级,计算机可以根据任务的重要性来分配处理时间。高优先级的任务会被优先执行,确保重要任务能够及时完成。而低优先级的任务则会在高优先级任务得到处理之后再执行,以避免重要任务被延迟。

总之,优先级就是一种设置任务相对重要性的方式,让计算机可以根据任务的优先级来合理地分配处理时间,确保重要任务得到优先处理。

优先级的取值范围是:0~(configMAX_PRIORITIES – 1),数值越大优先级越高。
FreeRTOS的调度器可以使用2种方法来快速找出优先级最高的、可以运行的任务。使用不同的方法时,
configMAX_PRIORITIES 的取值有所不同。
通用方法
使用C函数实现,对所有的架构都是同样的代码。对configMAX_PRIORITIES的取值没有限制。但
是configMAX_PRIORITIES的取值还是尽量小,因为取值越大越浪费内存,也浪费时间。
configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为0、或者未定义时,使用此方法。
架构相关的优化的方法
架构相关的汇编指令,可以从一个32位的数里快速地找出为1的最高位。使用这些指令,可以快速
找出优先级最高的、可以运行的任务。
使用这种方法时,configMAX_PRIORITIES的取值不能超过32。
configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为1时,使用此方法。

在学习调度方法之前,你只要初略地知道:
FreeRTOS会确保最高优先级的、可运行的任务,马上就能执行
对于相同优先级的、可运行的任务,轮流执行

这无需记忆,就像我们举的例子:
厨房着火了,当然优先灭火
喂饭、回复信息同样重要,轮流做。

1.Tick

对于同优先级的任务,它们“轮流”执行。怎么轮流?你执行一会,我执行一会。
"一会"怎么定义?
人有心跳,心跳间隔基本恒定。
FreeRTOS中也有心跳,它使用定时器产生固定间隔的中断。这叫Tick、滴答,比如每10ms发生一次时
钟中断。
如下图:
假设t1、t2、t3发生时钟中断
两次中断之间的时间被称为时间片(time slice、tick period)
时间片的长度由configTICK_RATE_HZ 决定,假设configTICK_RATE_HZ为100,那么时间片长度就
是10ms
在这里插入图片描述
相同优先级的任务怎么切换呢?请看下图:
任务2从t1执行到t2
在t2发生tick中断,进入tick中断处理函数:
选择下一个要运行的任务
执行完中断处理函数后,切换到新的任务:任务1
任务1从t2执行到t3
从图中可以看出,任务运行的时间并不是严格从t1,t2,t3哪里开始。

在这里插入图片描述
有了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多一点就返回了。

注意,基于Tick实现的延时并不精确,比如 vTaskDelay(2) 的本意是延迟2个Tick周期,有可能经过1个
Tick多一点就返回了。

我们可以写出下面的示例代码:

void Task(void *p)
{
	int32_t *i = (int*)p;
	while(1)
	{
		printf("Count:%d\r\n",*i);
	 (*i)++;
		
		vTaskDelay(pdMS_TO_TICKS(500));
	}
	
	vTaskDelete(NULL);
}

void Task2(void *p)
{
	while(1)
	{
		
	}
	
	vTaskDelete(NULL);
}

uint32_t count = 0;
TaskHandle_t mytaskHandle;

void TaskTest(void)
{
	xTaskCreate(Task,"MyTask",50,&count,1,&mytaskHandle);
	xTaskCreate(Task2,"MyTask2",50,&count,3,&mytaskHandle);
	vTaskStartScheduler();

}

MyTask2的优先级高于MyTask,所以会先执行MyTask2,当他执行MyTask2时,没有延时,他就会一直执行,因为没有比他更高优先级的任务了,只有他延时了,才会执行优先级更低的任务,而这里并没有,所以MyTask会一直不执行,就像下面这样,没有任何打印:
在这里插入图片描述

所以我们尽量在任务中延时一下,以便其他任务的执行。

2.修改任务优先级

使用uxTaskPriorityGet来获得任务的优先级:

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );//参数为任务句柄

使用vTaskPrioritySet 来设置任务的优先级:

void vTaskPrioritySet( TaskHandle_t xTask,
UBaseType_t uxNewPriority );//参数1:任务句柄,参数2:新的优先级

根据上面的函数分析可得下面的代码:
通过按键更改优先级,在这里我直接用定义好的函数检测:if(key_scan(0) == KEY0_PRES)
如果大家想自己写也可以的!

uint32_t count = 0;
TaskHandle_t mytaskHandle;
TaskHandle_t mytaskHandle2;
void Task(void *p)
{
	int32_t *i = (int*)p;
	while(1)
	{
		printf("Count:%d\r\n",*i);
	 (*i)++;
		
		vTaskDelay(pdMS_TO_TICKS(500));
	}
	
	vTaskDelete(NULL);
}

void Task2(void *p)
{
	uint8_t Priority = 1;
	while(1)
	{
		if(key_scan(0) == KEY0_PRES)
		{
			Priority++;
			vTaskPrioritySet(mytaskHandle,Priority);
		}
		
		vTaskDelay(20);
	}
	
	vTaskDelete(NULL);
}

void TaskTest(void)
{
	xTaskCreate(Task,"MyTask",50,&count,1,&mytaskHandle);
	xTaskCreate(Task2,"MyTask2",50,&count,3,&mytaskHandle2);
	vTaskStartScheduler();
}

实验效果:当我们按下按键0,他的优先级会++,在串口里会看到count的数量打印。
在这里插入图片描述

总结

任务管理是 FreeRTOS 提供的一个强大功能,它允许开发者以并发的方式组织和管理多个任务。通过任务的创建、删除、挂起、恢复和优先级控制等操作,开发者可以灵活地控制任务的执行顺序和调度策略,从而实现复杂的系统功能。任务通信与同步机制进一步增强了任务的协同工作能力,使任务之间能够高效地共享数据和协调操作。借助 FreeRTOS 提供的任务管理功能,开发者可以更加方便地构建实时嵌入式系统,并具备可靠性和高效性。

需要注意的是,在使用 FreeRTOS 进行任务管理时,开发者需要注意任务的资源管理、优先级设置和调度策略等方面,以确保系统能够稳定地运行,并满足实时性和响应性的要求。

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

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

相关文章

使用关键词一站式精准搜索指定期刊或会议论文集中的论文

问题描述 如题,例如,想要找点某主题的相关文献,当然要看本领域权威刊物了,假如你想从CCF人工智能类A级期刊找点文本相似度的论文,逐个点开期刊主页进行搜索,那就有点繁琐,不是一站式。 解决方…

小程序商城开发制作

当开发一个商城小程序时,费用是一个非常重要的考虑因素。然而,准确回答这个问题是有一定困难的,因为开发商城小程序的费用取决于多个因素。以下是一些可能影响价格的主要因素: 1. 功能需求:商城小程序的复杂程度和功能…

华为:为员工提供高质量住宿和配套服务,不对外经营房地产业务

华为官方发布声明指出,东莞棠雅实业投资有限公司是一家专门负责建设和管理华为员工园区配套人才房的公司,而不是从事房地产业务的企业。这意味着该公司的主要职责是为华为数万名员工提供高质量的住宿和配套服务,为其创造舒适便利的工作和生活…

[SpringBoot3]基础篇

二、SpringBoot基础篇 2.1什么是SpringBoot SpringBoot是目前流行的微服务框架,倡导“约定优于配置”,其目的是用来简化新Spring应用的初始化搭建以及开发过程。SpringBoot提供了很多核心的功能,比如自动化配置starter(启动器&a…

【配置环境】Linux下安装MySQL

目录 一,环境 二,安装步骤 1.使用包管理器安装MySQL 2.配置MySQL的安全选项 3.设置root用户使用密码进行身份验证(可选) 三,拓展知识 1.如何修改MySQL的密码策略? 一,环境 VMware Workst…

Linux —— 文件系统

目录 一,背景 二,文件系统 一,磁盘简介 磁盘分为SSD、机械磁盘;机械磁盘,即磁盘高速转动,磁头移动到读写扇区所在磁道,让磁头在目标扇区上划过,即可完成对扇区的读写操作&#xff…

数字经济对产业结构升级和创业增长的影响(2011-2021年)

参照刘翠花(2022)的做法,对来自中国人口科学《数字经济对产业结构升级和创业增长的影响》一文中的基准回归部分进行复刻。文章从理论层面分析数字经济发展对产业结构升级、创业增长的影响及其机理,并利用2011-2021年中国省级面板数…

数据结构刷题训练:用栈实现队列(力扣OJ)

目录 前言 1. 题目:用栈实现队列 2. 思路 3. 分析 3.1 定义 “ 队列 ” 3.2 创建队列 3.3 入队 3.4 队头数据 3.5 出队 3.6 判空和销毁 4.题解 总结 前言 栈和队列是数据结构中的两个重要概念,它们在算法和程序设计中都有着广泛的应用。本文将带你深入了…

K8S系列文章之 Docker安装使用Kafka

通过Docker拉取镜像的方式进行安装 照例先去DockerHub找一下镜像源,看下官方提供的基本操作(大部分时候官方教程比网上的要清晰一些,并且大部分教程可能也是翻译的官方的操作步骤,所以直接看官方的就行) 老实说Kafka…

EVE-NG MPLS L2VPN BGP pw -- static route,static mpls lsp

1 拓扑 2 配置步骤 2.1 配置接口IP 和静态路由 PE1 interface LoopBack 0ip address 1.1.1.9 32 quitinterface GigabitEthernet 1/0ip address 10.1.1.1 255.255.255.0quitip route-static 2.2.2.9 32 10.1.1.2 ip route-static 3.3.3.9 32 10.1.1.2 P interface LoopBac…

AI绘图(4)stable diffusion如何写好prompt 二

在进行绘制时,会添加很多的风格或细节来进行描述土拍你,当然也会由一些专业的词汇,如广角、相片、3d模型等,下面我们就会具体进行介绍。 1、「风格」的提示词 相片(photshop)、3D建模(3d model)、装饰艺术(art deco)、石像(ston…

Matlab时频工具箱tftb下载及安装

Matlab 时频工具箱下载及安装 首先下载安装包安装包地址如下 链接: https://tftb.nongnu.org/ 点击下面的download 跳转到如下界面,选择下面的安装包下载 下载之后得到一个压缩包 然后找到Matlab的安装目录,右键桌面图标,打开文件所在位置…

怎么申请Tik Tok海外菲律宾公会呢?

2023年是承上启下的一年,对于TIKTOK来说是一个大的机遇和风口,是大势所趋;相对于其他的跨境电商平台,Y马逊、X皮、S卖通这些传统电商平台来说,TikTok是属于兴趣电商,和国内DY是一样的,它的平台运营规申请cm…

论文阅读:《Waymo Public Road Safety Performance Data》

文章目录 1 背景2 方法2.1 数据来源2.2 碰撞数据 3 碰撞事件分析4 讨论 1 背景 这篇文章是讲waymo道路安全性能数据分析的,主要想表达的是waymo自动驾驶系统在安全上面的出色表现,以向政府、大众提高自己产品的公信力。 这篇文章分析的数据是自从2019年到…

防火墙组建双击热备后,点击管理对端设备,老是打不开,怎么办?

环境: 防火墙 8.0.75 AF-2000-FH2130B-SC 问题描述: 防火墙组建双击热备后,点击管理对端设备,老是打不开,怎么办? 浏览器老是加载 解决方案: 1.打开设置查看双机连接的心跳接口是哪个端口 …

SpringBoot复习:(36)国际化

一、Resources目录下建立一个目录(比如international)来存储资源文件 message.properties 空的,但不能没有 message_zh_CN.properties hello您好message_en_us.properties hellohello world二、自动配置类MessageSourceAutoConfiguration 常量MESSAGE…

深度学习常用的python库学习笔记

文章目录 数据分析四剑客Numpyndarray数组和标量之间的运算基本的索引和切片数学和统计方法线性代数 PandasMatplotlibPIL 数据分析四剑客 Numpy Numpy中文网 ndarray 数组和标量之间的运算 基本的索引和切片 数学和统计方法 线性代数 Pandas Pandas中文网 Matplotlib Mat…

ThinkPHP成考学员管理平台

有需要请加文章底部Q哦 可远程调试 ThinkPHP成考学员管理平台 一 介绍 成考学员管理平台基于FastAdmin框架开发,数据库mysql,是一款针对学员,教师,专业,课程,成绩,学费等信息管理的系统&#…

【算法】排序+双指针——leetcode三数之和、四数之和

三数之和 (1)排序双指针 算法思路: 和之前的两数之和类似,我们对暴力枚举进行了一些优化,利用了排序双指针的思路: 我们先排序,然后固定⼀个数 a ,接着我们就可以在这个数后面的区间…

八、解析应用程序——分析应用程序

文章目录 一、确定用户输入入口点1.1 URL文件路径1.2 请求参数1.3 HTTP消息头1.4 带外通道 二、确定服务端技术2.1 提取版本信息2.2 HTTP指纹识别2.3 文件拓展名2.4 目录名称2.5 会话令牌2.6 第三方代码组件 小结 枚举尽可能多的应用程序内容只是解析过程的一个方面。分析应用程…