登录/注册

rt-thread 线程调度优先级

更多

好的,RT-Thread 的线程调度优先级机制如下所述(使用中文描述):

  1. 优先级数值范围

    • 默认配置下,RT-Thread 采用 256 个线程优先级。
    • 优先级数值的范围通常是 0255 (即 RT_THREAD_PRIORITY_MAX - 1,其中 RT_THREAD_PRIORITY_MAX 默认是 256)。
    • 这个范围(数值大小)可以在配置系统时 (rtconfig.h) 进行调整。
  2. 数值大小的含义

    • 数值越小,优先级越高。
    • 优先级 0 是系统的最高优先级
    • 优先级 255(或配置的最大值减一)是系统的最低优先级
    • 例如:一个优先级为 2 的线程比优先级为 5 的线程有更高的执行权,会被调度器优先选择运行。
  3. 调度策略

    • RT-Thread 是一个实时操作系统内核,因此其核心调度策略是抢占式调度 + 优先级驱动
    • 抢占式调度: 当一个更高优先级的线程就绪(比如由中断唤醒、释放信号量等)时,如果它优先级比当前正在运行的线程高,调度器会立即暂停(抢占)当前运行的低优先级线程,转而执行那个更高优先级的就绪线程。这是实时性的关键保证。
    • 优先级驱动: 调度器总是从就绪队列中选择优先级最高的线程来运行。
    • 时间片轮询(可选): 对于优先级相同的多个线程,RT-Thread 支持(需要配置)时间片轮询调度(Round-Robin Scheduling)。每个线程运行一个固定的时间片(例如默认 10 个系统时钟 tick),然后调度器让下一个相同优先级的线程运行。在时间片用完前,相同优先级的线程之间不会发生抢占。
    • 协作(非必须): 虽然内核提供抢占能力,但一个线程也可以通过调用如 rt_thread_yield() 之类的函数,主动放弃 CPU 让给其他同优先级的线程(协作),即使时间片还没用完。这更多是编程风格上的选择。
  4. 线程状态与调度

    • 调度器的选择范围总是在处于就绪状态(RT_THREAD_READY)的线程集合中进行。
    • 当一个线程从其他状态(如挂起 RT_THREAD_SUSPEND)变为就绪态时,如果它的优先级比当前运行线程(或相同优先级且开启了时间片轮询,但当前线程时间片用完),就会触发调度器进行重新选择。
    • 常见的导致线程状态变化(可能引发调度)的操作包括:创建线程、启动线程、中断服务例程(ISR)唤醒等待资源/事件的线程 (rt_sem_release, rt_mutex_release, rt_mq_send 等)、线程主动睡眠 (rt_thread_delay, rt_thread_sleep)、线程被挂起/恢复 (rt_thread_suspend/rt_thread_resume) 等。
    • 从中断退出时(rt_interrupt_leave()),内核会检查是否有更高优先级线程就绪,如果有,立即触发调度。
  5. 优先级反转解决

    • RT-Thread 支持优先级继承(Priority Inheritance Protocol)或优先级置顶(Priority Ceiling Protocol)等机制(需要配置)来处理使用互斥量(rt_mutex)时可能发生的优先级反转问题,确保实时性。这是一种在更高层次上对优先级调度的保护和增强。
  6. 系统线程优先级

    • 主线程(main线程): 应用入口 main() 函数运行的线程通常是系统启动后创建的第一个线程,其默认优先级通常是比较低的(比如配置为 10 或 20,具体看配置),不会干扰关键的内核服务线程。
    • Idle线程: 系统总会创建一个最低优先级(通常为 RT_THREAD_PRIORITY_MAX - 1,如 255)的空闲线程(idle)。当系统中没有其他就绪线程时,它被调度运行,负责清理资源等。
    • 其他系统线程: 如定时器线程、Shell线程(FinSH)等,根据具体功能和需要,它们会被赋予不同的、通常高于主线程但低于实时关键线程的优先级。

总结关键点:

理解 RT-Thread 的优先级调度机制对于开发实时嵌入式应用至关重要,它直接决定了关键任务是否能得到及时处理。配置线程优先级时,务必明确任务的实时性要求。

揭秘!基于RT-Thread探究“优先级反转”下的任务调度究竟是什么样的?| 技术集结

本文将基于RT-Thread,结合RT-Trace调试器细化到实际任务调度的粒度,来调试并逐步讲解“

2025-08-17 10:07:20

深度剖析 RT-Thread 线程调度流程

rt_system_scheduler_start:调度系统第一个线程rt

2025-06-25 18:24:38

RT-Thread启动进入就绪态最高优先级线程的全过程与栈帧分析(上)

本文简单讨论RT-Thread在启动后,逐步进入到处于就绪态最高优先级main线程的全过程。部分内容涉及到汇编指令,但通俗易懂。

2023-11-08 12:47:09

RT-Thread文档_线程间通信

RT-Thread文档_线程间通信

资料下载 贾小龙 2023-02-22 18:29:48

RT-Thread文档_线程间同步

RT-Thread文档_线程间同步

资料下载 陈游斗 2023-02-22 18:29:24

RT-Thread文档_线程管理

RT-Thread文档_线程管理

资料下载 佚名 2023-02-22 18:28:37

uC/OS-II学习笔记——优先级反转与优先级继承机制

优先级反转,是指某同步资源被较低优先级的进程/线程所拥有,较高优先级的进

资料下载 佚名 2022-02-09 10:33:09

RT-Thread学习笔记 --(6)RT-Thread线程间通信学习过程总结

前两篇文章总结了RT-Thread多线程以及多线程同步的学习过程,关于前两篇学习总结,可以查看之前的文章。

资料下载 龙献益 2022-01-25 18:50:59

如何去处理RT-Thread线程优先级的问题呢

RT-Thread优先级问题,官方文档互斥量一节,线程2的优先级比

2022-12-05 11:51:43

RT-Thread系统线程调度器的设计实现

线程调度器RT-Thread中提供的线程

2022-08-23 15:24:19

RTthread线程调度详解

系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该线程。但是

2022-05-19 17:07:29

RT-Thread线程优先级链表与位图算法的介绍

1 线程优先级链表每个线程控制块都带有一个链表成员,根据优先级将

2022-05-13 15:38:39

rt-thread优先级线程可以调度执行吗?

请教下,在rt-thread中,如果低优先级的线程中用while(1){}直接死循环,是不是高

2022-05-13 10:51:47

RT-Thread基于优先级的全抢占式调度算法的实现

一、原理概述RT-Thread 是一款嵌入式实时操作系统(RTOS),同时也是一款优秀的物联网操作系统,相对于裸机的轮询调度算法,它使用的线程(

2022-04-20 14:17:28

RT-Thread与UCOS的简单比较

一、RT-Thread与UCOS的简单比较任务或线程调度RT-Thread

2021-08-20 06:00:32
7天热门专题 换一换
相关标签