第十七章 线程管理
前言
RT-Thread 线程管理的主要功能是对线程进行管理和调度,系统中总共存在两类线程,分别是系统线程和用户线程,
-
RT-Thread的线程调度器是抢占式的,主要的工作就是从就绪线程列表中查找最高优先级线程,保证最高优先级的线程能够被运行,最高优先级的任务一旦就绪,总能得到CPU 的使用权。
-
当一个运行着的线程使一个比它优先级高的线程满足运行条件,当前线程的 CPU 使用权就被剥夺了,或者说被让出了,高优先级的线程立刻得到了CPU 的使用权。
-
如果是中断服务程序使一个高优先级的线程满足运行条件,中断完成时,被中断的线程挂起,优先级高的线程开始运行。
-
当调度器调度线程切换时,先将当前线程上下文保存起来,当再切回到这个线程时,线程调度器将该线程的上下文信息恢复。
一、线程基本概念
- RT-Thread 的线程模块可以给用户提供多个线程,实现了线程之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。
- RT-Thread 中的线程是抢占式调度机制,同时支持时间片轮转调度方式。
- 高优先级的线程可打断低优先级线程,低优先级线程必须在高优先级线程阻塞或结束
后才能得到调度。
二、线程调度器基本概念
线程调度的原则:是一旦线程状态发生了改变,并且当前运行的线程优先级小于优先级队列组中线程最高优先级时,立刻进行线程切换(除非当前系统处于中断处理程序中或禁止线程切换的状态)。
三、线程状态概念
RT-Thread 系统中的每一线程都有多种运行状态。系统初始化完成后,创建的线程就可以在系统中竞争一定的资源,由内核进行调度。
- 该线程不在就绪列表中:包含线程被挂起、 线程被延时、线程正在等待信号量、读写队列或者等待读写事件等。
四、线程状态迁移
五、常用的线程函数
需要线程的挂起与恢复函数理由:
六、线程的设计要点
RT-Thread 中程序运行的上下文包括:
- 中断服务函数。
- 普通线程。
- 空闲线程。
线程执行时间例子:
对于事件 A 对应的服务线程 Ta,系统要求的实时响应指标是 10ms,而 Ta 的最大运行时间是 1ms,那么 10ms 就是线程 Ta 的周期了,1ms 则是线程的运行时间,简单来说线程 Ta 在 10ms 内完成对事件 A 的响应即可。此时,系统中还存在着以 50ms 为周期的另一线程 Tb,它每次运行的最大时间长度是100us。在这种情况下,即使把线程 Tb 的优先级抬到比 Ta 更高的位置,对系统的实时性指标也没什么影响,因为即使在 Ta 的运行过程中,Tb 抢占了 Ta 的资源,等到 Tb 执行完毕,消耗的时间也只不过是 100us,还是在事件 A 规定的响应时间内(10ms),Ta 能够安全完成对事件 A 的响应。但是假如系统中还存在线程 Tc,其运行时间为 20ms,假如将 Tc 的优先级设置比 Ta 更高,那么在 Ta 运行的时候,突然间被 Tc 打断,等到 Tc 执行完毕,那 Ta 已经错过对事件 A(10ms)的响应了,这是不允许的。