【RT-Thread】线程启动流程
线程启动流程详解
·
🧵 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())
调度器会:
- 查找
rt_thread_ready_priority_group中最高优先级位 - 获取该优先级链表中的第一个线程
- 调用
rt_context_switch()或rt_context_switch_to() - 切换上下文,恢复该线程的寄存器状态,跳转至
thread_entry()执行
六、🧼 线程自动退出流程
线程函数执行完毕时,会自动跳转到 rt_thread_exit():
- 设置线程状态为
CLOSE - 从就绪链表中移除
- 回收资源(栈、TCB)
🔁 总体流程图

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



所有评论(0)