在uCOS II中从高优先级任务切换到低优先级任务

时间:2013-11-17 18:04:40

标签: operating-system rtos ucos

我是RTOS(uCOS II)的新手,通过阅读uCOS作者撰写的书来学习它。我有疑问,我无法找到答案。

在uCOS中,根据调度算法给予CPU最高优先级的任务。所以,如果我通过创建两个任务来创建一个uCOS应用程序,一个具有高优先级(Prio = 1表示前),另一个具有低优先级(前Prio = 9)。 例如,如果最高优先级任务正在等待事件,那么调度程序应该开始执行下一个更高优先级的任务?如果那是正确的,那么代码的哪一部分会以低优先级切换高优先级?

三个拱相关代码是: 1.中断级别上下文切换 2.启动准备运行的最高优先级任务 3.任务级别上下文切换

在服务中断后的情况1中,调度程序返回到最高优先级的任务。在案例2中,当我们通过OSStart()启动操作系统时调用它 在案例3中,当优先级较高的任务准备好并且由定时器中断调用时

现在,如果高优先级任务处于等待状态,调度程序将CPU分配给较低优先级任务的确切位置或准确程度是什么?

由于

3 个答案:

答案 0 :(得分:1)

考虑你的问题的另一种方法是问自己高优先级任务是如何进入等待状态的。这两个问题的答案是高优先级任务调用RTOS例程,如GetEvent()。 (我不知道这是否是真正的uCOS-II例程 - 我只是简单化。)。 RTOS例程将高优先级任务置于等待状态(即被阻止),然后RTOS调度器找到准备运行的下一个最高优先级任务并切换到该任务的上下文。 RTOS将具有多个阻止功能,允许任务上下文切换。例如,当您从队列或邮箱中读取或等待信号量或互斥量时。

答案 1 :(得分:1)

只要发生调度事件,调度程序就会运行。在您的示例中,当高优先级任务调用事件等待时会发生这种情况。通常,可能阻塞或产生的OS调用会导致调度程序运行。调度程序也在退出ISR时运行,包括IS计时器ISR。

通常,当调度程序执行上下文切换时,它会将当前处理器核心寄存器复制到任务的控制块,并使用堆栈指针和程序将存储的正在切换的任务的寄存器值复制到处理器寄存器中-counter最后复制。对程序计数器的更改会导致执行在具有任务自己的堆栈的新任务中继续执行,处于上次阻止或被禁止时的状态。当ISR中发生调度事件导致更高优先级的任务准备就绪时,可能会发生抢占。

关于uC / OS-II的事情是在Jean Labrosse的书中详细描述了它。使用uC / OS-II的示例的RTOS的一般原理在中描述 Jack Ganssle this online course

答案 2 :(得分:0)

中断级别上下文切换用于抢占,例如,您运行低优先级任务,并且需要运行高优先级(例如,OSTimeDly超时),在这种情况下,中断级别上下文切换将暂停低优先级任务,然后切换到高优先级。

对于高优先级到低优先级的交换机,通过调用OS_Sched

需要高的一个放弃CPU资源