1.插入线程
Q1;同一优先级中多个线程,RT_Thread怎么标记该些线程?
当同一优先级有多个线程(Thread1,Thread2,Thread…),插入线程时,只是将优先级组rt_thread_ready_priority_group
对优先级位置1,
那RT-Thread是怎么记录,同一优先级中有个线程的呢?优先级组rt_thread_ready_priority_group
只能标志该优先级是否存在线程,并不能标记相同优先级有多少个线程。
2.移除线程
Q2:同一优先级中多个线程,怎么查找该些线程?
如果同一优先级中有多个线程(Thread1,Thread2,Thread…),在移除一个线程时如Thread1移除,重置优先级组(即将优先级对于标志位置0),
那其他Thread2,Thread3,再下次被调用时,需要查优先级组rt_thread_ready_priority_group中对于的标志位,
但此时优先级组rt_thread_ready_priority_group
已被置0,无法查找其他线程。
线程相关的全局变量有两个:
一 个 是 线 程 就 绪 优 先 级 组rt_thread_ready_priority_group
另 一 个 是 线 程 优 先 级 表rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]
线程是有一个线程控制块,每次在让出时间片时会做以下操作:
1.调用rt_list_remove(&(thread->tlist))将时间片耗完的线程从就绪列表移除
2.将线程插入到该优先级下的链表rt_thread_priority_table的尾部、
3.执行线程调度rt_schedule()(会从rt_thread_priority_table中找对应优先级线程链表的表头线程控制块,并执行)
做完以上三步之后,新的线程开始执行了,但是新的线程在优先级线程链表的位置是不变的,直到它让出时间片后被重新安置在同优先级的双向链表尾端
如果线程正常执行完毕或者被调用函数销毁,导致这个优先级没有线程了,那么该优先级在rt_thread_ready_priority_group 中的对应位会被清零,在rt_thread_priority_table下的链表只剩下一个空表头,空表头的前后指针都指向空表头本身
以下摘录自RT_THREAD NANO,时间片轮转关键代码
/**
@return RT_EOK
*/
//将当前时间片执行完的线程从就绪链表中的位置放到最后,然后重新调度一个新的优先级高的线程
rt_err_t rt_thread_yield(void)
{
register rt_base_t level;
struct rt_thread *thread;
/ 关中断 / //临界区处理
level = rt_hw_interrupt_disable();
/ 获取当前线程的线程控制块 /
thread = rt_current_thread;
/ 如果线程在就绪态,且同一个优先级下不止一个线程,就暂时执行调度,让出CPU /
//如果同一个优先级只有该线程,那就不用让了
if ((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_READY &&
{
}
/ 开中断 /
rt_hw_interrupt_enable(level);
return RT_EOK;
}
感谢回复,对的,RT介绍是基于轮询方式,但不知道系统是怎么再下一次轮询找到对应的线程,系统查找线程,是根据位图来查找的,同优先级的一个线程被运行结束,会被移除,此时优先级组中对应位已被置0了。还是下次不再查找了?难道是一直遍历链表吗?