3

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

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

三个依赖于架构的代码是: 1. 中断级上下文切换 2. 启动最高优先级任务准备运行 3. 任务级上下文切换

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

现在,考虑到高优先级任务正在等待,调度程序将在哪里或如何准确地将 CPU 分配给较低优先级的任务?

谢谢

4

3 回答 3

1

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

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

关于 uC/OS-II 的问题在于 Jean Labrosse 的书中对它进行了详细的描述。这个在线课程由 Jack Ganssle描述了 RTOS 的一般原理以及使用 uC/OS-II 的 示例。

于 2013-11-19T20:33:00.167 回答
1

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

于 2013-11-17T20:38:38.190 回答
0

中断级上下文切换用于抢占式,比如你有一个低优先级的任务在运行,而高优先级需要运行(比如OSTimeDly超时),这种情况下,中断级上下文切换会暂停低优先级任务,然后切换到高优先级之一。

高低优先级切换需要高一级通过调用OS_Sched放弃CPU资源

于 2017-03-04T00:18:21.723 回答