在 RT-Thread 中,与上述小任务对应的程序实体就叫做“线程”(或任务), RT-Thread就是一个能对这些**小“线程”进行管理和调度的多“线程”**操作系统。
线程是实现任务的载体,它是RT-Thread 中最基本的调度单位,它描述了一个任务执行的运行环境, 也描述了这个任务所处的优先等级。
RT-Thread 中,线程由三部分组成:线程代码(入口函数)、线程控制块、线程堆栈
无限循环结构
void thread_entry(void *parameter){
while(1) {
/* 等待事件的发生*/
...
...
/* 处理事件*/
}
}
顺序执行结构
void thread_entry(void *parameter){
/* 事务1处理*/
/* 事务2处理*/
...
...
/* 事务N处理*/
}
线程控制块
线程栈
线程时间片
如果有相同优先级的线程,那么这个时候 “时间片” 就有肩负重任了
在 RT-Thread 操作系统中,线程时间片(Thread Time Slice)是多任务调度中的一个关键概念,它决定了同一优先级线程之间共享 CPU 时间的策略
定义
作用
时间片的配置
时间片的默认值
RT_THREAD_TIME_SLICE_DEFAULT调整规则
while(1){……} 中就是 一直在运行,除非 主动让出 CPU(如 调用延时函数 rt_thread_delay()),也就是 该线程 进入“挂起状态” 的时候时间片的工作原理
rt_thread_delay())的情况下,才会运行下一个最高优先级的 就绪线程时间片的实际应用
示例场景
20 → 单次运行 20ms10 → 单次运行 10ms运行过程
线程1运行20ms → 线程2运行10ms → 线程1运行20ms → 线程2运行10ms → ...
关键注意事项
1~100 Tickrt_thread_delay(), rt_thread_yield() 等函数主动释放 CPU,无需等待 时间片 耗尽调试与观察
**查看线程状态:**使用 list_thread 命令(FinSH 控制台)查看 线程的 剩余时间片
Stack Pointer 线程运行过程中
线程名称 线程的优先级 线程的当前状态 线程的堆栈指针 线程的堆栈总大小 堆栈历史最大使用率 线程的剩余时间片 线程的错误码
thread pri status sp stack size max used left tick error
------ --- ------- ---------- ---------- ------ ---------- ---
thread1 10 running 0x00000060 0x00000400 80% 5 0
thread2 10 ready 0x00000060 0x00000400 75% 10 0
数值越小优先级越高 指向当前线程栈顶的内存地址 单位为字节 以 Tick 为单位 通常为 0
例如 0 为最高优先级 用于调试堆栈溢出问题 示例中为1024字节 用于评估堆栈是否足够 归零时触发同优先级线程切换 若线程发生异常会记录错误类型
代码中获取时间片
rt_thread_t thread = rt_thread_self(); // 获取当前线程句柄
rt_uint32_t time_slice = thread->remaining_tick; // 剩余时间片
总结
创建线程
创建静态线程 (线程控制块 和 线程栈 以 静态 的形式 定义出来)
线程栈大小的设置技巧
资源形式
运行效率
在 选择 使用 静态线程 还是 动态线程 的时候,我们可以从 芯片 使用的是 片外RAM 还是 片内RAM 还有 运行效率 这几个 角度 来 考量
启动线程
高优先级的线程先被运行,低优先级的线程后被运行
rt_thread_create 用于动态创建线程(自动分配内存和栈),需配套使用rt_thread_delete销毁。rt_thread_init + rt_thread_startup。