【RT-Thread基础教程】线程优先级、Tick与线程状态
@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 线程有哪些状态
线程有下面这一些状态:
-
初始状态
当线程刚开始创建还没开始运行时就处于初始状态,未调用rt_thread_startup
之前,调用rt_thread_create
或者rt_thread_init
之后 -
就绪状态
这个线程完全准备好了,随时可以运行:只是还轮不到它:这时它就处于就绪态(Ready)
我们可以使用rt_thread_startup()
函数让某个线程进入就绪状态 -
运行状态
当处于就绪状态的线程运行时,它就处于运行状态。 -
挂起状态
挂起状态是类似于FreeRTOS的block阻塞状态的
我们可以使用rt_thread_delay
函数来阻塞他 -
关闭状态
当线程运行结束时,将处于关闭状态:
可由运行状态正常退出,进入关闭状态
或者通过线程删除函数进入关闭状态
rt_err_t rt_thread_delete()
,用来删除使用 rt_thread_create()创建的线程在进入关闭状态时,线程所占据的资源(比如栈)不会立即释放,需等到空闲进程运行时才能清理。
3.2 完整的状态转换图
总结
本文简要介绍了 RT-Thread 中线程优先级、Tick 以及线程状态的概念和作用。线程优先级决定了线程在系统中的调度顺序,较高优先级的线程将获得更多的 CPU 时间;Tick 是 RT-Thread 中的基本时间单位,用于实现系统中断、定时器和任务调度等功能;线程状态描述了线程在不同阶段的状态,包括就绪、运行、挂起和终止等状态。理解这些概念对于开发者编写高效、稳定的嵌入式系统应用至关重要。通过合理设置线程优先级、处理 Tick 事件以及监控线程状态,开发者可以优化系统性能,提高系统的响应速度和稳
- 点赞
- 收藏
- 关注作者
评论(0)