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

本文详细解释了RT-Thread中的线程优先级概念,如何影响线程调度,Tick的作用作为时间管理单元,以及线程的不同状态及其转换。理解这些有助于提升嵌入式系统性能和稳定性。
摘要由CSDN通过智能技术生成

文章目录

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

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RT-Thread 是一个实时操作系统,支持多线程操作。线程RT-Thread 中的基本执行单元,可以通过 RT-Thread 的 API 来创建和管理线程RT-Thread 线程创建 API 主要有以下几个: 1. rt_thread_t rt_thread_create(const char *name, void (*entry)(void *parameter), void *parameter, size_t stack_size, rt_uint8_t priority, rt_uint32_t tick); 该函数用于创建一个线程,参数如下: - name:线程的名称(必填)。 - entry:线程的入口函数(必填)。 - parameter:传递给线程入口函数的参数。 - stack_size:线程栈的大小,以字节为单位。 - priority:线程优先级,取值范围是 0~31,数值越小优先级越高。 - tick线程的时间片长度,以系统时钟节拍为单位。 2. void rt_thread_startup(rt_thread_t thread); 该函数用于启动一个线程,参数是线程句柄。 3. rt_thread_t rt_thread_self(void); 该函数返回当前线程的句柄。 4. rt_err_t rt_thread_delete(rt_thread_t thread); 该函数用于删除一个线程,参数是线程句柄。 5. rt_err_t rt_thread_yield(void); 该函数用于让出当前线程的时间片,让其他线程执行。 6. rt_err_t rt_thread_suspend(rt_thread_t thread); 该函数用于挂起一个线程,使其暂停执行。 7. rt_err_t rt_thread_resume(rt_thread_t thread); 该函数用于恢复一个被挂起的线程,使其继续执行。 以上是 RT-Thread 线程创建的几个基本 API,可以根据实际需求选择使用。需要注意的是,线程优先级和时间片长度是影响线程执行顺序的重要因素,需要根据实际情况进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值