(实时操作系统分析任务管理及调度.pptVIP

  • 6
  • 0
  • 约1.69万字
  • 约 37页
  • 2016-12-24 发布于北京
  • 举报
任务的调度(续) 2. 任务切换宏OS_TASK_SW() SP R1 R2 … … Rn PC PSW R1 R2 …… Rn PC PSW R1 R2 …… Rn PC PSW CPU的各寄存器 被中止任务TCB 待运行任务TCB OSTCBStkPtr OSTCBStkPtr 被中止任务堆栈 待运行任务堆栈 图2-11 调度器进行 任务切换时的动作 断点:任务被中止运行时的位置。 断点数据:当时存放在CPU的各寄存器中的数据。 “无缝”接续:当任务恢复运行时,必须在断点处以断点数据作为初始数据接着运行。 正确地恢复断点数据的关键: CPU的堆栈指针SP是否有正确的指向。 在系统中存在多个任务时,如果在恢复断点数据使用另一个任务的任务堆栈指针(存放在TCB的OSTCBStkPtr中)来改变CPU的堆栈指针SP,那么CPU运行的就不是刚才被中止运行的任务,而使另一个任务了,也就是实现任务切换了。 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile . Copyright 2004-2011 Aspose Pty Ltd. 任务的调度(续) 2. 任务切换宏OS_TASK_SW()-续 为了完成图2-11的操作,要依次做如下7项工作: 把被中止任务的断点指针保存到任务堆栈中; 把CPU通用寄存器的内容保存到任务堆栈中; 把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中; 获得待运行任务的任务控制块; 使CPU通过任务控制块获得待运行任务的任务堆栈指针; 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中; 使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile . Copyright 2004-2011 Aspose Pty Ltd. 用压栈指令把CPU通用寄存器R1、R2...压入堆栈; //把SP保存在中止任务控制块中 OSTCBCur - OSTCBStkPtr = SP; //使系统获得待运行任务控制块 OSTCBCur = OSTCBHighRdy; //把待运行任务堆栈指针赋给SP SP = OSTCBHighRdy - OSTCBStkPtr; 用出栈指令把R1、R2...弹入CPU的通用寄存器; 2. 任务切换宏OS_TASK_SW()-续 任务的调度(续) Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile . Copyright 2004-2011 Aspose Pty Ltd. 任务切换过程 获得待运行任务的任务控制块 恢复待运行任务的运行环境 处理器的PC=任务堆栈中的断点地址 处理器的SP=任务块中保存的SP 如何获得待运行任务的任务控制块? 根据就绪表获得待运行任务的任务控制块指针 其实,调度器在进行调度时,在这个位置还要进行一下判断:究竟待运行任务是否为当前任务,如果是,则不切换;如果不是才切换,而且还要保存被中止任务的运行环境。 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile . Copyright 2004-2011 Aspose Pty Ltd. 给调度器上锁 OSSchedlock():给调度器上锁函数,用于禁止任务调度,保持对CPU的控制权(即使有优先级更高的任务进入了就绪态); OSSchedUnlock():给调度器开锁函数,当任务完成后调用此函数,调度重新得到允许; 当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,它不希望高优先级的任务在邮箱、队列和信号量还没有得到消息之前就取得了CPU的控制权,此时,可以使用调度器上锁函数。 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile . Copyright 2004-2011 Aspose Pty Ltd. 谢 谢! Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile . Copyright 2004-2011 Aspose Pty Ltd. * * 1、系统在调用函数OSInit()对uC/OS-II系统进行初始化

文档评论(0)

1亿VIP精品文档

相关文档