Operating system uCOSⅡ中高优先级任务到低优先级任务的切换

Operating system uCOSⅡ中高优先级任务到低优先级任务的切换,operating-system,rtos,ucos,Operating System,Rtos,Ucos,我对RTOS(uCOS II)是新手,通过阅读uCOS作者写的书来学习它。我有一个疑问,我找不到答案 在uCOS中,具有最高优先级的任务按照调度算法分配给CPU。因此,如果我通过创建两个任务来创建一个uCOS应用程序,一个任务具有高优先级(对于ex,Prio=1),另一个任务具有低优先级(对于ex,Prio=9)。 例如,如果最高优先级的任务正在等待事件,那么调度程序应该开始执行下一个更高优先级的任务吗?如果这是正确的,那么代码的哪个部分将高优先级与低优先级切换 三个arch相关代码为: 1.中

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

在uCOS中,具有最高优先级的任务按照调度算法分配给CPU。因此,如果我通过创建两个任务来创建一个uCOS应用程序,一个任务具有高优先级(对于ex,Prio=1),另一个任务具有低优先级(对于ex,Prio=9)。 例如,如果最高优先级的任务正在等待事件,那么调度程序应该开始执行下一个更高优先级的任务吗?如果这是正确的,那么代码的哪个部分将高优先级与低优先级切换

三个arch相关代码为: 1.中断级上下文开关 2.启动最高优先级任务,准备运行 3.任务级上下文切换

在案例1中,中断服务完成后,调度程序返回到最高优先级的任务。在案例2中,当我们通过OSStart()启动操作系统时调用它 在案例3中,当一个更高优先级的任务准备就绪并被定时器中断调用时

现在,如果高优先级任务处于等待状态,调度程序将在何处或如何准确地将CPU分配给低优先级任务


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

每当发生调度事件时,调度程序都会运行。在您的示例中,当高优先级任务调用事件等待时会发生这种情况。一般来说,可能阻塞或产生的操作系统调用会导致调度程序运行。调度程序也在从ISR(包括IS定时器ISR)退出时运行

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

关于uC/OS-II的事情是,它在Jean Labrosse的书中被详细描述。中介绍了RTOS的一般原理以及使用uC/OS-II的示例
由Jack Gansle编写。

中断级上下文开关用于抢占,例如,您有一个低优先级任务正在运行,而高优先级任务需要运行(例如OSTIMEDY timeout),在这种情况下,中断级上下文开关将暂停低优先级任务,然后切换到高优先级任务


对于高优先级到低优先级的切换,需要高优先级的任务通过调用OS_Sched放弃CPU资源

还有另一个任务,您没有考虑,即空闲任务,它在没有其他任务需要CPU时运行。