UCOS任务切换过程

一、UCOS任务获得处理器运行前的环境恢复过程

        任务在建立的时候就进入就绪态,它们的堆栈是由软件来初始化的,使得与发生中断后的堆栈相似。在内存中每个任务都会创建一个虚拟处理器(用于备份物理处理器)。其中虚拟处理器中存储的主要信息为:程序的断点地址(PC)、任务堆栈指针(SP)、程序状态字寄存器(PSR)、通用寄存器内容,以及函数调用信息(已存在于堆栈)。这些内容通常保存在任务堆栈中。当需要运行某个任务时,就把任务的私有堆栈指针赋给处理器的堆栈指针SP,把该任务的虚拟处理器复制到实际处理器中。

处理器通过两个指针寄存器PCSP来与任务代码和任务堆栈建立联系,PC指向的是执行的任务代码,SP则是指向任务的堆栈。

任务堆栈指针(SP)指向当前正在运行任务的任务私有栈的栈顶,用任务控制块(TCB)保存任务堆栈指针(SP)。

总的来说,uC/OS内核负责管理任务的上下文切换过程,它通过保存和恢复任务的堆栈和处理器寄存器状态来实现任务之间的无缝切换。这确保了任务之间的独立性和并发执行。

二、UCOS任务被剥夺处理器停止运行前的环境备份过程 

答:当任务被剥夺,运行态转变成就绪态,将会进行任务切换。

当需要中止当前任务时,则把任务对应的虚拟处理器复制到内存,同时任务控制块(TCB保存此时该任务的私有堆栈指针SP。随后再把另一个需要运行的任务的私有堆栈指针赋给处理器的堆栈指针SP,其虚拟处理器也复制到实际处理器中,由操作系统的调度器按某种规则来进行这两个复制工作

当任务级的调度器(OSSched())确定有一个新的高优先级的任务需要执行时,就会调用OSCtxSw()。

OSCtxSw做任务切换执行步骤:

1)OSCtxSw()首先把当前任务的状态寄存器和程序计数器保存到当前任务的堆栈中。寄存器入栈的顺序和中断发生时CPU将寄存器压人堆栈的顺序一样。这里假设状态寄存器 SR 首先入栈,其余寄存器接着依次人栈。

2)OSCtxSw()CPU堆栈指针的当前值保存到将要停止运行的任务的控制块OS_TCB中,也就是OSTCBCurPtr->StkPtr = R14

3OSCtxSw()将新任务的OS_TCB 中保存的该任务的堆栈指针的值载人CPU的堆栈指针寄存器,该指针的值是在上一次该任务被切换时保存的,指向的是当时的任务堆栈的栈顶。这步操作即 R14 = OSTCBHighRdyPtr->StkPtrc

4)最后,OSCtxSw()从新的堆栈中恢复CPU寄存器的值。程序计数器和状态寄存器通常是在执行中断返回指令时弹出堆栈的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钻仰弥坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值