【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 事件以及监控线程状态,开发者可以优化系统性能,提高系统的响应速度和稳

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署开源白板工具Excalidraw并结合内网穿透远程访问

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. 安装Docker2. 使用Docker拉取Excalidraw镜像3. 创建…

微服务远程调用Feign

目录 RPC概述 什么是Feign? Ribbon&Feign对比 Feign的设计架构 Spring Cloud Alibaba快速整合Feign Spring Cloud Feign扩展 日志配置 契约配置 通过拦截器实现参数传递 自定义拦截器实现认证逻辑 超时时间配置 RPC概述 微服务之间如何方便优雅的实…

外包干了两个月,技术退步明显。。。。。

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

VegaPrime 2013 VP2013

Vega Prime 2013 VegaPrime 2013 VP2013

解决SSH远程登录开饭板出现密码错误问题

输入“adduser Zhanggong回车”,使用adduser命令创建开发板用户名为Zhanggong 输入密码“123456” 输入密码“123456”

使用LinkedList实现堆栈及Set集合特点、遍历方式、常见实现类

目录 一、使用LinkedList实现堆栈 堆栈 LinkedList实现堆栈 二、集合框架 三、Set集合 1.特点 2.遍历方式 3.常见实现类 HashSet LinkedHashSet TreeSet 一、使用LinkedList实现堆栈 堆栈 堆栈(stack)是一种常见的数据结构,一端…

Leetcoder Day17| 二叉树 part06

语言:Java/C 654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 …

matlab|计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

1 主要内容 该程序参考《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》模型,主要实现的是计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度模型。通过引入碳捕集电厂–电转气–燃气机组协同利用框架,碳捕集的CO2 可作为电转气原料&#xf…

springboot213大学生心理健康管理系统的设计与实现

大学生心理健康管理系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,试卷信息因为其管理内容繁杂,管理…

发现了一个超赞的办公利器!ONLYOFFICE 文档 8.0 强势登场!

迎接 ONLYOFFICE 文档 v8.0发布后的全新升级!现在,适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序更加强大!全新的 RTL 界面、本地界面主题、与 Moodle 的集成等实用功能,让你的办公体验更加出色!全新…

备战蓝桥杯—— 双指针技巧巧答链表2

对于单链表相关的问题,双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决: 合并两个有序链表: 使用两个指针分别指向两个链表的头部,逐一比较节点的值,将较小的节点链接到结果链表…

码农永远高薪吃香的3项特质

最近看到Google在裁员滚滚,再次对CS就业环境有了清醒认知。之前听程序员担忧裁员,还以为他杞人忧天。然而,现实就是如此寒冷彻骨啊! 当然,有些具备不可替代性的码农,永远吃香。总结发现有以下几点特质&…

RabbitMQ鉴权设计以及相关探讨

文章目录 1. rabbitmq的鉴权设计2. rabbitmq鉴权应用范围3. rabbitmq鉴权的常用方法3.1 用户管理3.2 角色管理3.3 权限管理 4. 默认鉴权4.1 默认用户4.2 默认角色 5. 参考文档 鉴权,分别由鉴和权组成 鉴: 表示身份认证,认证相关用户是否存在…

J7 - 对于ResNeXt-50算法的思考

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 J6周有一段代码如下 思考过程 首先看到这个问题的描述,想到的是可能使用了向量操作的广播机制然后就想想办法验证一下&…

WebGIS开发实战:智慧机场项目【含教程源码笔记】

智慧机场项目功能: 1、航班飞机轨迹的展示 2、航班终点天气的展示 3、异常航班的公告和推送 4、不同风格地图的切换 5、不要要素图层的显示和隐藏 前置知识 1、html,css 2、JavaScript 3、Http请求的知识 GIS技术已经成为了许多行业的热门需求,而…

【算法分析与设计】1的个数

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位…

Canvas:开启web上的图形编程之门

一.概述 <canvas>元素是HTML5引入的一个新标签&#xff0c;它允许浏览器绘制二维图形和图像。这个元素本身并不具备绘图能力。实际上&#xff0c;它提供的只是一个容器&#xff0c;而绘图操作则需要使用JavaScript来完成。Canvas的API极其丰富&#xff0c;支持绘制文本、…

2.5网安学习第二阶段第五周回顾(个人学习记录使用)

本周重点 ①多进程和多线程 1、进程和线程 2、多线程爆破 ②Redis数据库 1、Redis的使用 2、Redis持久化 3、Redis未授权免密登录 ③嗅探和Python攻击脚本 1、嗅探&#xff08;端口扫描和IP扫描&#xff09; 2、SCAPY的应用 3、Python攻击脚本&#xff08;SYN半连接…

Jmeter教程-JMeter 环境安装及配置

Jmeter教程 JMeter 环境安装及配置 在使用 JMeter 之前&#xff0c;需要配置相应的环境&#xff0c;包括安装 JDK 和获取 JMeter ZIP 包。 安装JDK 1.JDK下载 示例环境为Windows11环境&#xff0c;读者应根据实际环境下载JDK的安装包。 JDK下载地址&#xff1a; Java21 下载 …

JavaWeb——004Maven SpringBootWeb入门

一、Maven 1、什么是maven&#xff1f; 2、Maven的作用是什么&#xff1f;&#xff08;3种&#xff09; 1.1、方便的依赖管理 依赖管理&#xff1a;有了Maven&#xff0c;我们就不用再手动导入Jar包了&#xff0c;我们只需要在配置文件当中&#xff0c;简单描述一下项目所需要…