新创建线程时或其他线程主动让某个线程执行,会调用_tx_thread_resume,把新的线程加入调度列表,并选择出下一个需要执行的线程。
基本原理:选出系统中最高优先级线程为执行线程
UINT _tx_thread_resume(
//指向将要恢复线程的线程控制块指针
TX_THREAD *thread_ptr);
局部变量
1.线程正在挂起过程中,只需要修改线程状态为ready
2.线程已经挂起或新创建的线程,那么加入到就绪list(就绪优先级队列)中
3.就绪list为基于优先级的数组列表
4.先根据优先级找到_tx_thread_priority_list[priority]对应list,再插入尾部
5.如果系统中没有执行的线程,那么设置恢复线程为执行线程,并且设置系统中最高优先级_tx_thread_highest_priority 为恢复线程优先级
6.系统中已经存在执行线程,那么比较优先级,如果恢复线程优先级大于_tx_thread_highest_priority ,设置恢复线程为执行线程,并且设置系统中最高优先级_tx_thread_highest_priority 为恢复线程优先级
7.如果恢复线程优先级小于系统中最高优先级,那么不需要处理,已经插入就绪列表中。
8.如果上述选择出了新的执行线程,就返回true,可以进行抢占
流程:
1. 将preemption设为false
2.禁用中断 //因为在恢复线程
3.禁用抢占
4.根据线程状态做出操作
(1) 若恢复线程正在挂起过程中(非Completed、非Terminated),将suspending flag删去,修改线程状态为Ready
(2) 若线程延迟挂起,将suspending flag删去,修改线程为Suspend
(3) 已经Suspend或新创建的线程,将线程状态改为Ready
1) 记录该线程的优先级
2) 若同优先级已有就绪线程,将该线程加入就绪优先级队列,建立连接
3) 若同优先级无就绪线程
a) 恢复线程为第一个线程
b) 设置优先级位图对应bit为1
c) 若就绪队列中没有要执行的线程,将此线程设为将要执行线程,且为最高优先级
d) 若就绪队列中要执行的线程优先级更低,将此线程设为最高优先级,进行抢占,并将其设为将要执行线程
5.恢复中断
6.若当前线程不是执行线程,preemption=true,需要进行抢占
7.返回preemption