我是RTOS(uCOS II)的新手,通过阅读uCOS作者写的书来学习它。我有一个疑问,我找不到答案。
在uCOS中,具有最高优先级的任务根据调度算法被赋予CPU。因此,如果我通过创建两个任务来创建一个uCOS应用程序,一个具有高优先级(对于ex,Prio=1),另一个具有低优先级(对于ex-Prio=9)。例如,如果最高优先级的任务正在等待一个事件,那么调度程序应该开始执行下一个更高优先级的任务吗?如果这是正确的,那么代码的哪一部分将高优先级切换为低优先级?
三个与拱门相关的代码是:1.中断级上下文切换2.启动准备运行的最高优先级任务3.任务级上下文切换
在情况1中,在服务中断之后,调度器返回到最高优先级的任务。在情况2中,当我们通过OSStart()启动操作系统时调用它在情况3中,当一个更高优先级的任务准备就绪并被定时器调用时,中断
现在,在高优先级任务处于等待状态的情况下,调度器将在哪里或如何将CPU分配给低优先级任务??
感谢
另一种考虑问题的方法是问问自己高优先级任务是如何进入等待状态的。这两个问题的答案都是,高优先级任务调用RTOS例程,如GetEvent()。(我不知道这是否是一个真正的uCOS II例程——我只是在概括。)RTOS例程将高优先级任务置于等待状态(即阻塞),然后RTOS调度器找到下一个准备运行的最高优先级任务,并切换到该任务的上下文。RTOS将具有几个阻止功能,允许任务上下文切换。例如,当您从队列或邮箱中读取时,或者当您等待信号量或互斥量时。
通常,当调度器执行上下文切换时,它会将当前处理器核心寄存器复制到任务的控制块,并将被切换到的任务的存储寄存器值复制到处理器寄存器中,堆栈指针和程序计数器复制在最后。对程序计数器的更改会导致在具有任务自身堆栈的新任务中继续执行,处于上次阻塞或被抢占时的状态。当ISR中发生调度事件,导致优先级较高的任务准备就绪时,可能会发生抢占。
uC/OS-II的特点是在Jean Labrosse的书中对其进行了复杂的详细描述。RTOS的一般原理以及使用uC/OS-II的示例在这是Jack Ganssle的在线课程。
中断级上下文开关用于抢占,例如,您有一个低优先级任务正在运行,而高优先级需要运行(例如OSTimeDly超时),在这种情况下,中断级上下文切换将暂停低优先级任务,然后切换到高优先级任务。
对于高优先级到低优先级的交换机,它需要高优先级通过调用OS_Sched 来放弃CPU资源