【RT-Thread基础教程】线程优先级、Tick与线程状态

文章目录

  • 前言
  • 一、线程优先级
    • 1.1 线程优先级是什么
    • 1.2 设置优先级范围
  • 二、时间片
    • 2.1 Tick是什么
    • 2.2 时间片是什么
    • 2.3 时间片轮转
  • 三、线程状态
    • 3.1 线程有哪些状态
    • 3.2 完整的状态转换图
  • 总结


前言

在 RT-Thread 操作系统中,线程的优先级、Tick 以及线程状态是非常重要的概念。了解这些概念可以帮助开发者更好地管理和调度系统中的各个线程,从而提高系统的性能和稳定性。本文将介绍线程优先级的概念、Tick 的作用以及常见的线程状态,并简要讨论它们在 RT-Thread 中的应用。


一、线程优先级

1.1 线程优先级是什么

想象你在参加一个派对,有很多人都想和你聊天。但是,你并不可能同时和所有人聊天,你需要决定先和谁聊。

在RT-Thread里,线程优先级就像是这个派对上的VIP身份。每个线程都有一个优先级,就像每个派对上的人有一个“重要程度”一样。如果你是VIP,其他人就会让你先说话;同样,如果一个线程的优先级比其他线程高,那么它就会在其他线程之前执行。

线程优先级高的线程会优先执行,就像派对上的VIP先说话一样。这样,系统可以根据线程的优先级来决定哪个线程先执行,哪个线程后执行,以确保系统的功能正常运行,就像派对上的气氛一样,有序而不混乱。

高优先级的就绪的线程立刻抢占低优先级的线程

1.2 设置优先级范围

rtconfig.h文件中有这样一个宏:#define RT_THREAD_PRIORITY_MAX 32,他是来设置优先级范围的
RT-Thread 最大支持 256 个线程优先级 (0~255),数值越小的优先级越高,0 为最高优先级
在一些资源比较紧张的系统中,可以根据实际情况设置优先级,比如 ARM Cortex-M系列,通常采用 32 个优先级。比如说F103ZE
在这里插入图片描述

最低优先级默认分配给空闲线程使用,用户一般不使用。我们可以类比FreeRTOS中的最低优先级的函数,他就是来处理一些比如任务删除之后的内存回收,一般不用这么低的优先级。

在学习调度方法之前,只要初略地知道:
 RT-Thread 会确保最高优先级的、可运行的线程,马上就能执行
 对于相同优先级的、可运行的线程,轮流执行这无需记忆,就像我们举的例子:
 厨房着火了,当然优先灭火
 喂饭、回复信息同样重要,轮流做

二、时间片

2.1 Tick是什么

想象一下你在玩一个大家都要按照音乐节拍跳舞的游戏。每一拍都是一个小的时间单位,所有人都必须在这个时间单位内完成一次动作。

在RT-Thread中,Tick 就像是系统中的音乐节拍。它是一个小的时间单位,系统的时钟会按照这个 Tick 不断地前进。就像跳舞游戏中的每一拍要求你做一次动作,RT-Thread中的每一个 Tick 要求系统执行一次任务。

Tick 的存在让系统有了时间的概念,可以精确地控制任务的执行和定时器的触发。所以,RT-Thread的 Tick 就好比系统中的心跳,让系统按照固定的节奏不断地运行和执行任务,保持整个系统的有序

我们可以设置他一个tick多长时间:
在这里插入图片描述

2.2 时间片是什么

在我们FreeRTOS中,相同级别的任务他是交替执行的,你执行1个tick我执行一个tick
但是在RT-Thread中,可以指定某一个任务一次执行多久,然后给别的任务执行
在这里插入图片描述
如上图,如果A运行了7个tick,更高优先级的C线程强占了他,C运行一段时间,阻塞了,那么后面是运行A还是B呢?
答案是运行A,继续运行3个tick,然后运行B,运行5个tick

2.3 时间片轮转

同优先级别的就绪线程依次运行

三、线程状态

3.1 线程有哪些状态

线程有下面这一些状态:

  1. 初始状态
    当线程刚开始创建还没开始运行时就处于初始状态,未调用rt_thread_startup之前,调用rt_thread_create或者rt_thread_init之后

  2. 就绪状态
    这个线程完全准备好了,随时可以运行:只是还轮不到它:这时它就处于就绪态(Ready)
    我们可以使用rt_thread_startup()函数让某个线程进入就绪状态

  3. 运行状态
    当处于就绪状态的线程运行时,它就处于运行状态。

  4. 挂起状态
    挂起状态是类似于FreeRTOS的block阻塞状态的
    我们可以使用rt_thread_delay函数来阻塞他

  5. 关闭状态
    当线程运行结束时,将处于关闭状态:
     可由运行状态正常退出,进入关闭状态
     或者通过线程删除函数进入关闭状态

rt_err_t rt_thread_delete(),用来删除使用 rt_thread_create()创建的线程在进入关闭状态时,线程所占据的资源(比如栈)不会立即释放,需等到空闲进程运行时才能清理。

3.2 完整的状态转换图

在这里插入图片描述


总结

本文简要介绍了 RT-Thread 中线程优先级、Tick 以及线程状态的概念和作用。线程优先级决定了线程在系统中的调度顺序,较高优先级的线程将获得更多的 CPU 时间;Tick 是 RT-Thread 中的基本时间单位,用于实现系统中断、定时器和任务调度等功能;线程状态描述了线程在不同阶段的状态,包括就绪、运行、挂起和终止等状态。理解这些概念对于开发者编写高效、稳定的嵌入式系统应用至关重要。通过合理设置线程优先级、处理 Tick 事件以及监控线程状态,开发者可以优化系统性能,提高系统的响应速度和稳

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

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

相关文章

每日一练 | 华为认证真题练习Day187

1、关于BGP状态机描述错误的 A. IDIE状态下,BGP拒绝任何进入的连接请求,是BGP初始状态 B. ACTIVE状态下,BGP将尝试进行TCP连接的建立,是BGP的中间状态 C. ESTABLISHED状态下,BGP对等体间可以交换UPDATE报文&#xf…

算法--动态规划(背包问题)

这里写目录标题 总览dp问题的优化01背包问题概述算法思想算法思想中的注意点例题代码等效为一维数组 完全背包问题概述算法思想例题代码等效为二维数组等效为一维数组 多重背包问题概述算法思想例题代码优化(采用二进制的方式)基本思想时间复杂度例题代码…

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本(通常命名content.js),在后台脚本(通常命名background.js或service-worker.js)中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台,执行如下步骤: 访问…

2024年2月17日~2月23日周报

文章目录 一、前言二、DDNet架构学习2.1 数据预处理2.2 网络模型构建 三、基于深度学习地震数据去噪处理3.1 深度学习在地震数据去噪中的研究方向3.2 深度学习地震数据去噪流程3.2.1 数据集准备3.2.2 模型构建3.2.3 训练网络 3.3 基于DnCNN的地震数据去噪实验 四、小结4.1 存在…

前端项目打包体积分析与优化

一、安装依赖分析工具 npm install webpack-bundle-analyz 二、修改webpack.config.js文件 1、导入上面下载的包 2、在plugins里创建实例 三、启动打包命令 npm run build 会弹出如下界面: 四、优化 1、通过CDN导入react-dom文件 修改webpack.config.js文件里…

【前端素材】推荐优质后台管理系统GramOs平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具,它通常作为一个独立的后台界面存在,供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能: 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Linux环境非root用户配置SSH免密登录,并解决登录仍提示输入密码

Linux环境非root用户配置SSH免密登录,并解决登录仍提示输入密码 ssh免密登录的简单理解 以A和B进行举例:A免密登录B (即在A服务器输入命令:ssh 非root用户名B的IP地址)可以直接免密码直接登录 A生成私钥和公钥&#…

QT基本组件

四、基本组件 Designer 设计师(重点) Qt包含了一个Designer程序,用于通过可视化界面设计开发界面,保存文件格式为.ui(界面文件)。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…

​分享87个Html企业模板,总有一款适合您

分享87个Html企业模板,总有一款适合您 87个Html企业模板下载链接:https://pan.baidu.com/s/1iBpfaBRgMJBv4pj07rZhOg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集…

【STM32】Keil RTE使用记录

0 前言 最近因为任务需要,再次开始研究STM32,打算过一遍之前记录的笔记,在创建工程模板时,突然发现一个之前被自己忽略的东西,那就是创建项目时会弹出的Run-Time Environment,抱着好奇的心态去找了一些资料…

Rust: reqwest库示例

一、异步处理单任务 1、cargo.toml [dependencies] tokio { version "1.0.0", features ["full", "tracing"] } tokio-util { version "0.7.0", features ["full"] } tokio-stream { version "0.1" }…

【学习笔记】数据结构与算法03:栈与队列

知识出处:Hello算法:https://www.hello-algo.com/. 文章目录 2.2 栈和队列2.2.1 「栈 stack」2.2.1.1 栈的常用操作2.2.1.2 栈的典型应用 2.2.2「队列 queue」2.2.2.1 队列的常用操作2.2.2.2 队列的典型应用 2.2.3 双向队列 「double-ended queue」2.2.3…

论文阅读——SimpleClick

SimpleClick: Interactive Image Segmentation with Simple Vision Transformers 模型直接在VIT上增加交互是分割 用VIT MAE方法训练的预训练权重 用交互式分割方法微调,微调流程: 1、在当前分割自动模拟点击,没有人为提供的点击 受到RITM启发…

如何使用Douglas-042为威胁搜索和事件应急响应提速

关于Douglas-042 Douglas-042是一款功能强大的PowerShell脚本,该脚本可以提升数据分类的速度,并辅助广大研究人员迅速从取证数据中筛选和提取出关键数据。 该工具能够搜索和识别Windows生态系统中潜在的安全漏洞,Douglas-042会将注意力放在…

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前,需要先对工具的目录有些了解,也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

学习负载均衡的算法

什么负载均衡 负载均衡是一种计算机技术,用于在多个系统、网络链接、硬盘驱动器、CPU等之间分配工作负载,以优化资源使用、最大化吞吐量、最小化响应时间、并避免任何单一资源的过载。在网络负载均衡的情况下,它可以帮助将网络流量有效地分配…

300分钟吃透分布式缓存-11讲:MC如何淘汰冷key和失效key?

淘汰策略 Mc 作为缓存组件,意味着 Mc 中只能存储访问最频繁的热数据,一旦存入数据超过内存限制,就需要对 Mc 中的冷 key 进行淘汰工作。Mc 中的 key 基本都会有过期时间,在 key 过期后,出于性能考虑,Mc 并…

SpringBoot中Redis缓存的使用

目录 1 前言 2 实现方法 2.1 查询数据时 2.2 修改数据 1 前言 对于一些不常改变,但又经常查询的数据,我们可以使用Redis缓存,来缓解数据库的压力,其中的逻辑如下: 2 实现方法 2.1 查询数据时 一般在控制类查询方…

SMIC思洣客矩阵:重塑数字经济的未来

经济的发展 经济是供需满足的过程,它涵盖了社会物资的生产和再生产过程。在这个过程中,经济活动遵循着生产和再生产的规律,通过生产、分配、交换和消费的过程,不断地形成和再造价值。从传统的市场经济到现代的智能经济&#xff0…

Shell好用的工具: cut

目标 使用cut可以切割提取指定列\字符\字节的数据 介绍 cut 译为“剪切, 切割” , 是一个强大文本处理工具,它可以将文本按列进行划分的文本处理。cut命令逐行读入文本,然后按列划分字段并进行提取、输出等操作。 语法 cut [options] filename opti…