恢复线程 tx_tr.c

新创建线程时或其他线程主动让某个线程执行,会调用_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值