🧵 RT-Thread 线程启动流程详解

一、🔨 用户调用 rt_thread_create()

这是你在应用代码中写的创建线程语句:

rt_thread_create("my_thread", thread_entry, param, stack_size, priority, tick);

这一操作做了三件事:

  • 🧱 申请一个 rt_thread 控制块(TCB)
  • 🧱 申请一块栈空间
  • 🔧 调用 rt_hw_stack_init() 初始化线程上下文(伪中断返回现场)
  • 🟢 设置线程初始状态为 READY,加入就绪队列(scheduler ready list)

二、🧠 rt_hw_stack_init() 构造伪现场

该函数手动构造线程的“伪中断返回现场”,以使线程第一次运行时可被调度执行。

寄存器 作用
PC 设置为线程入口函数 thread_entry
R0 设置为线程参数 param
LR 设置为 rt_thread_exit()
xPSR 设置为 0x01000000(Thumb 状态)

🧩 注意:这是 首次运行 的关键所在,线程启动时调度器会“跳转”到这组手动构造的寄存器值。


三、🚀 调用 rt_thread_startup() 启动线程

rt_thread_startup(thread);

此函数作用:

  • 将线程状态从 INIT 改为 READY
  • 调用 rt_schedule_insert_thread() 加入就绪队列
  • 如果调度器已启动,触发调度(rt_schedule()

四、🔗 RT-Thread 就绪链表详解(重点)

✅ 线程插入就绪链表的机制:

thread->stat = RT_THREAD_READY;
rt_schedule_insert_thread(thread); // 👈 插入就绪链表

📚 核心数据结构

RT-Thread 的调度机制基于多级优先级链表位图调度

结构 描述
rt_thread_priority_table[] 数组,每个元素为一个双向链表头
rt_thread_ready_priority_group 位图,记录哪些优先级上有 READY 线程

默认 32 个优先级(也可配置成 256),对应 32 个链表和一个 32 位位图。

📌 插入流程解析(源码简化):

void rt_schedule_insert_thread(rt_thread_t thread)
{
    rt_uint32_t level;
    level = rt_hw_interrupt_disable();

    // 插入链表
    rt_list_insert_before(&rt_thread_priority_table[thread->current_priority],
                          &thread->tlist);

    // 设置位图标志位
    rt_thread_ready_priority_group |= 1 << thread->current_priority;

    rt_hw_interrupt_enable(level);
}

📊 图示说明

假设有线程 T1 (prio=5), T2 和 T3 (prio=10):

rt_thread_priority_table:
[5]  → [T1] ←→ NULL
[10] → [T2] ←→ [T3] ←→ NULL
位图: 0000010010000000(bit 5 和 bit 10 被置位)
  • 同一优先级线程按插入顺序排(默认 FIFO)
  • 调度器通过位图快速定位最高优先级 READY 线程

五、🧮 系统调度器运行(rt_schedule()

调度器会:

  1. 查找 rt_thread_ready_priority_group 中最高优先级位
  2. 获取该优先级链表中的第一个线程
  3. 调用 rt_context_switch()rt_context_switch_to()
  4. 切换上下文,恢复该线程的寄存器状态,跳转至 thread_entry() 执行

六、🧼 线程自动退出流程

线程函数执行完毕时,会自动跳转到 rt_thread_exit()

  • 设置线程状态为 CLOSE
  • 从就绪链表中移除
  • 回收资源(栈、TCB)

🔁 总体流程图

在这里插入图片描述

🧩 模块功能对照表

模块函数 作用说明
rt_thread_create() 分配资源,构造线程控制块
rt_hw_stack_init() 构造线程首次运行所需伪上下文
rt_thread_startup() 改为 READY 状态并插入就绪链表
rt_schedule() 调度系统,根据优先级选择执行线程
rt_thread_exit() 线程退出后释放资源并设置为关闭状态

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐