据我所知,每个操作系统都需要有一些机制来定期检查是否应该运行某些任务并暂停其他任务。
一种方法是某种计时器在其到期时操作系统将检查它是否应该运行/暂停某项任务。
一般来说,在一个可能属于某种ISR的ARM系统上。
我真正的问题是,我一直只是想象这个而不是在某个地方看到它。有人可以指向一些免费/开放的RTOS代码,我可以在其中实际看到处理抢占/调度的代码吗?
答案 0 :(得分:2)
您可以查看xv6
它不是RTOS,它只是一个用于学术目的的骨架操作系统(基于V6 unix)
在XV6 book中看一下第4章,有关于如何在像xv6.XV6这样的小型操作系统上进行调度的代码的解释,在等待磁盘或某些I时将进程置于休眠状态。 / O操作,每100毫秒还有一个定时器中断来切换过程
还有关于如何进行上下文切换,保存了什么信息(进程的上下文帧)的代码,以及在调度程序必须运行时如何从用户切换到内核模式的解释。
最好的部分是你需要做的阅读量来理解这些概念,这与OS上的一些参考书不同:)代码相对较小,你可以在sched,swtch和qtu设置断点上运行XV6其他功能,实际上看到上下文切换过程中保存的信息。(如何在此link中运行xv6)
您不必阅读前面的章节来理解第4章。有很多依赖,xv6使用struct proc来识别一个进程,ptable用于系统中当前正在运行的进程,proc-> conext-指向进程所处的状态(注册值等),这是由调度。
干杯:)
答案 1 :(得分:2)
freertos.org。整个操作系统都是开源的,就在那里供您查看。并且有许多不同的端口可供比较和对比。对于上下文切换代码,您需要查看ports目录,在任何一个名为port.c,port.asm等的文件中查找。是的,在freertos的情况下,所有上下文切换都在中断中执行(a tick timer ISR或任何其他SysCall中断。)
上下文切换是特定于处理器的,因为要保存的寄存器列表和用于保存它们的汇编代码在处理器系列之间变化,有时在给定系列中也不同。因此,每个端口都有一个单独的文件用于此代码。
另一方面,调度(选择要运行的下一个任务)在一个名为tasks.c的文件中完成,该文件对所有端口都是通用的,并引用特定于端口的代码。
答案 2 :(得分:1)
情况并非仅仅是RTOS周期性上下文切换 - 这就是大多数GPOS的工作方式。在RTOS中,调度程序在任何调度事件上运行。这些包括系统勾选,但也包括消息发布,事件触发器,信号量给予或互斥锁解锁。例如。
在ARM Cortex-M上,CMSIS 3.x包含一个RTOS API(主要用于RTOS开发人员,而不是完整的RTOS本身),其源代码将包括一个上下文切换机制。
如果您想要了解简单RTOS的详细说明,可以考虑阅读µC/OS-II: The Real-Time Kernel或更复杂的µC/OS-III: The Real-Time Kernel 。
FreeRTOS越来越受欢迎,尽管在建筑上可能有点不同寻常。更完整(因为它不仅仅是一个调度内核,而是一个更完整的操作系统)和非常强大的选项是eCos。