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

举报
人才程序员 发表于 2024/09/14 19:13:48 2024/09/14
【摘要】 @TOC 前言在 RT-Thread 操作系统中,线程的优先级、Tick 以及线程状态是非常重要的概念。了解这些概念可以帮助开发者更好地管理和调度系统中的各个线程,从而提高系统的性能和稳定性。本文将介绍线程优先级的概念、Tick 的作用以及常见的线程状态,并简要讨论它们在 RT-Thread 中的应用。 一、线程优先级 1.1 线程优先级是什么想象你在参加一个派对,有很多人都想和你聊天。但是...

@TOC


前言

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。