任务切换:
在多任务系统中,令cpu中止当前正在运行的任务转而去执行另一个任务的工作。
任务切换的工作步骤(主要由调度器实现):
(1) 获得待运行任务的TCB(任务控制块)指针。
(2) 进行断点数据的切换。
为什么要获得TCB指针?
操作系统是通过任务控制块TCB来管理任务的,因此调度器真正实施任务切换之前的主要工作就是获得待运行任务的TCB指针和当前任务的TCB指针。
切换过程描述:
(1)把被中止任务的断点指针保存到任务堆栈中;
(2)把CPU通用寄存器的内容保存到任务堆栈中;
(3)把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中;
(4)获得待运行任务的任务控制块;
(5)使CPU通过任务控制块获得待运行任务的任务堆栈指针;
(6)把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;
(7)使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。
通过上面可以发现,一个任务的中止运行跟另一个待运行任务正好是一个相反的过程。
调度器实现:
用压栈指令把CPU通用寄存器R1、R2...压入堆栈;
//把SP保存在中止任务控制块中
OSTCBCur -> OSTCBStkPtr = SP;
//使系统获得待运行任务控制块
OSTCBCur = OSTCBHighRdy;
//把待运行任务堆栈指针赋给SP
SP = OSTCBHighRdy -> OSTCBStkPtr;
用出栈指令把R1、R2...弹入CPU的通用寄存器;
切换过程:
第一步解释(获得TCB指针):调度器OSSched()在确认未被上锁并且不是中断服务程序调用调度器的情况下,首先在就绪表中查得OSPrioHighRdy(即优先级最高的就绪任务);如果OSPrioCur !=就绪任务,OSTCBHighRdy =OSTCBPrioTbl[OSPrioHighRdy]
最后一步解释(PC介绍):pc叫程序计数器,他用来指向运行的程序的。只有pc获得了新任务的地址,cpu才会执行新的任务。
对于被中止任务:pc中的断电指针压入任务堆栈。
对于待运行任务:任务堆栈中的上次被中止时存放的中断指针压入pc。