当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、任务优先级
    • 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 进行任务管理时,开发者需要注意任务的资源管理、优先级设置和调度策略等方面,以确保系统能够稳定地运行,并满足实时性和响应性的要求。

相关文章:

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

文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS&…...

【报错】ModuleNotFoundError: No module named ‘websocket‘

1 报错 ModuleNotFoundError: No module named websocket 2 解决方法 pip install websocket 1 报错 AttributeError: module websocket has no attribute enableTrace 2 分析 一般是由于websocket的依赖包没有安装造成的。websocket.enableTrace()方法是在websocket-cli…...

[Leetcode] [Tutorial] 多维动态规划

文章目录 62. 不同路径Solution 62. 不同路径 一个机器人位于一个 m ∗ * ∗ n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 问总共有多少条不同的路径? 示例…...

C语言 二级指针和多级指针

什么是二级指针? 假设: int a 10;int * p &a;如上,p是指针变量,寄存的是a的地址,指向的是元素a 那么,指针变量p有地址吗?指针变量p的指针指向的是? int * * pp &p; …...

新机器到了要做的事情

文章目录 新机器到了要做的事情背景检查机器安装系统装系统步骤 总结 新机器到了要做的事情 背景 运维 一台机器到了,去看看机器情况,小编之前是开发呀,由于种种原因,阴差阳错的做了运维,本以为是应用运维&#xff0c…...

个人开发中常见单词拼错错误纠正

个人开发中常见单词拼错错误纠正 前置说明参考地址后端开发相关前端开发相关客户端开发相关大数据/云计算相关工具或软件相关 前置说明 单词太多啦, 我这里只列表我个人见得比较多的, 我没见过就不列举了. 有错误或想补充的可以提交在原仓库提交Pull Request. 😁 …...

vb+sql汽车配件管理系统设计与实现

摘 要 目前汽车配件销售企业大多数在其连锁店的管理还是手工进行,随着汽车配件行业的迅速发展,手工管理的种种弊端暴露无疑,给销售企业的发展带来了不必要的麻烦。为了规范企业内部管理,提高企业业务管理水平,更好的为客户服务,应采用计算机来管理汽车配件的进销存业务。…...

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏)

前言 Java也是测试必知必会的内容,特别是现在类似spring boot 等Java框架更是成为主流。之前实现的图书增删改查是用Python实现的,没看过的请移步:Flaskmysql 实现增删改查接口开发测试(图文教程附源码),本…...

winform 使用CommonOpenFileDialog选择文件夹或文件

选择文件夹 /// <summary> /// 选择文件夹 /// </summary> public void SelectFolder() {CommonOpenFileDialog dialog new CommonOpenFileDialog("请选择一个文件夹");dialog.IsFolderPicker true; //选择文件还是文件夹&#xff08;true:选择文件夹…...

EXPLAIN使用分析

系列文章目录 文章目录 系列文章目录一、type说明二、MySQL中使用Show Profile1.查看当前profiling配置2.在会话级别修改profiling配置3.查看profile记录4.要深入查看某条查询执行时间的分布 一、type说明 我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引&…...

布局性能优化:安卓开发者不可错过的性能优化技巧

作者&#xff1a;麦客奥德彪 当我们开发Android应用时&#xff0c;布局性能优化是一个必不可少的过程。一个高效的布局能够提高用户体验&#xff0c;使应用更加流畅、响应更加迅速&#xff0c;而低效的布局则会导致应用的运行变得缓慢&#xff0c;甚至出现卡顿、崩溃等问题&…...

Python 中的机器学习简介:多项式回归

一、说明 多项式回归可以识别自变量和因变量之间的非线性关系。本文是关于回归、梯度下降和 MSE 系列文章的第三篇。前面的文章介绍了简单线性回归、回归的正态方程和多元线性回归。 二、多项式回归 多项式回归用于最适合曲线拟合的复杂数据。它可以被视为多元线性回归的子集。…...

docker 容器中执行命令出现错误: 13: Permission denied

错误 13: Permission denied [rootVM-32-11-tencentos ~]# docker exec -it kibana1 /bin/bash kibana76c20c215dcb:~$ apt-get install vi E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) E: Unable to acquire the dpkg frontend…...

JavaWeb学习|JavaBean;MVC三层架构;Filter;Listener

1.JavaBean 实体类 JavaBean有特定的写法: 必须要有一个无参构造 属性必须私有化。 必须有对应的get/set方法 用来和数据库的字段做映射 ORM; ORM:对象关系映射 表--->类 字段-->属性 行记录---->对象 2.<jsp&#xff1a;useBean 标签 3. MVC三层架构 4. Filter …...

arx 外部参照文件(XREF)的添加、删除、卸载和重载_objectarx

添加参照 CString strFileName;int nIndex = strFilePath.ReverseFind(\\);if (nIndex != -1){strFileName = strFilePath.Right(strFilePath....

【博客699】docker daemon预置iptables剖析

docker daemon预置iptables剖析 没有安装docker的机器&#xff1a;iptables为空&#xff0c;且每个链路的默认policy均为ACCEPT [root~]# iptables-save[root ~]# iptables -t raw -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt …...

Golang 中的交叉编译详解

Golang 中的交叉编译 在 Golang 中&#xff0c;交叉编译指的是在同一台机器上生成针对不同操作系统或硬件架构的二进制文件。这在开发跨平台应用或构建特定平台的发布版本时非常有用。 交叉编译 Golang 程序的基本步骤如下&#xff1a; 指定目标操作系统和工具链并设置对应的…...

Python中的诡异事:不可见字符!

文章目录 前言1. 起因2. 调查3. 高能4. 释惑 前言 今天分享一件很诡异的事情&#xff0c;我写代码的时候遇到了不可见的字符&#xff01;&#xff01;&#xff01; 1. 起因 今天在使用pipreqs导出项目中所依赖的库时突然报错了&#xff1a; pipreqs . --encodingutf-8 --forc…...

【uniapp】uniapp使用微信开发者工具制作骨架屏:

文章目录 一、效果&#xff1a;二、过程&#xff1a; 一、效果&#xff1a; 二、过程&#xff1a; 【1】微信开发者工具打开项目&#xff0c;生成骨架屏&#xff0c;将wxml改造为vue页面组件&#xff0c;并放入样式 【2】页面使用骨架屏组件 【3】改造骨架屏&#xff08;去除…...

【UE4 RTS】06-Camera Edge Scroll

前言 本篇实现的效果是当玩家将鼠标移至屏幕边缘时&#xff0c;视野会相应的上下左右移动 效果 步骤 1. 打开玩家控制器“RTS_PlayerController_BP”&#xff0c;在类默认值中设置如下选项 新建一个宏&#xff0c;命名为“EdgeSroll”&#xff0c; 添加两个输入和三个输出&a…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...