当前位置: 首页 > 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…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...