您好!<br /> <br />首先建议看看《uc/os-II微小内核分析与程序设计-基于LPC2300》教程,该书中对LPC2300系列ARM的任务切换有详细的解答。<br /><br />1 任务级OSSched() 主要做了:关中断,找出进入就绪态且优先级最高的任务,最后宏调用OS_TASK_SW()完成实际上的任务切换。<br /><br />OS_TASK_SW()任务级的任务切换函数是通过调用TASK_SW来实现的,因此可以说TASK_SW是真正实现任务调度的函数。<br /><br />TASK_SW的作用是先将当前任务的CPU现场保存到该(当前任务)任务的堆栈中,然后获得最高优先级任务的堆栈指针,从该(最高优先级任务)堆栈指针中恢复此任务的CPU现场,使之继续运行。同时,任务间切换,遵循“从哪儿去,回哪儿来”的原则,当前任务虽然进入临界区没有退回,但当任务再次切换回来时,CPU现场是完好无缺的恢复到进入临界区时的状态,并且会继续执行当前任务后面的程序,也即必然执行该任务的退出临界区代码。<br /><br />2 当系统刚开始运行时,即第一次从高优先级切换到低优先级时,在切换时会出现将低优先级任务堆栈(用于保存本任务CPU现场)内容恢复到CPU现场,这里加载的是初始化值,初始化值中默认是开了中断的,详见任务堆栈初始化程序OSTaskStkInt()。对LPC23xx来说,是通过指令LDMFD SP!, {R0-R12, LR, PC }^ 来实现,管理模式下LDMFD指令仅用于恢复现场、中断异常返回并执行新任务,即通过出栈操作将PC、LR(R14_svc)和状态字的值装回CPU的寄存器中。<br /> <br />
|