现在我尝试自己编写RTOS。 我有一个问题:在RTOS概念中,我们有“上下文切换”理论。 据我所知,上下文切换用于描述当某个任务正在运行而另一个任务具有更高优先级时,将运行更高优先级的任务,并且当前任务将保存其状态并在更高任务完成后继续启动。为了做到这个概念,我认为优先级较高的任务将在中断函数中运行,因为中断函数的优先级高于其他指令,我是对的吗?如果我是对的,那么我不需要编写代码来保存当前任务的状态,因为我知道在中断之后,程序将返回到它被中断的位置。如果我错了,我怎样才能保存当前任务的状态?是否有必要编写汇编代码来执行此操作,因为我看到卤素为FreeRTOS生成汇编代码文件?
答案 0 :(得分:1)
我认为优先级较高的任务会在中断函数中运行,因为中断函数的优先级高于其他指令,我是对的吗?
不,中断处理程序在自己的上下文中运行。中断的上下文切换和优先级(通常)由处理器硬件处理,而RTOS线程(通常再次)由涉及存储当前任务的寄存器状态的软件机制切换,恢复最后一个寄存器恢复的新任务的寄存器状态作为程序计数器,以便从新任务的存储位置继续执行。
由于寄存器集是特定于体系结构的,而系统级语言(如C)不是特定于体系结构且不提供,因此不可能完全在高级代码中执行上下文切换,因为这些语言本身不支持线程。注册级别访问。
详细了解RTOS如何在内部工作的最佳资源之一是Jean Labrosse's book MicroC/OS-II(现在可从Micrium以PDF格式免费获得);从第2章开始概述RTOS概念,第3章描述内核实现(具体在3.06节中进行上下文切换) - 您必须查看可用的各种端口,以查看具体的OS_TASK_SW()
实现架构;在书中它被呈现为伪代码。
尽管MicroC-OS / II本身就是一种商业RTOS(很大程度上被MicroC / OS-III取代),但它最初只能通过购买本书获得,并且专门用于教授RTOS概念和实现。另一方面,FreeRTOS(由其他人推荐作为示例)具有开源的优势,但在实现级别上并没有如此详细记录,并且可能是一种有点非常规的RTOS实现(尽管不一定在上下文中)切换水平)。
MicroC / OS-II可能不常见,因为它不支持相同优先级的任务(所有任务必须具有不同的优先级),因此不支持循环调度;它是一个纯粹的抢先式,基于优先级的RT调度程序 - 这可以实现非常高效和快速的上下文切换时间。从这个意义上讲,MicroC / OS-III更为传统,但代价是上下文切换时间。
答案 1 :(得分:0)
上下文切换与任务优先级没有任何关系。它只是意味着您保存一个任务的整个CPU状态,并加载另一个任务的状态。是的,这将用汇编语言编写,因为你需要保存寄存器。
如果您尝试使用当前的方法,您将立即失败。如果休眠优先级任务在中断处理程序中运行,您的内核将如何处理下一个中断?低中断延迟是成功的RTOS(或任何操作系统)的关键。
答案 2 :(得分:0)
一个名为RTOS的RTOS需要比仅抢占式调度更多的功能。其他设计决策是否使用嵌套中断,是否应用延迟中断处理方案,是否允许优先级倒置或如何处理它,是否有时间切片或运行完成(或两者)和许多其他方面
您的CPU有一组寄存器,例如累加器和其他CPU工作寄存器,堆栈指针,可能是浮点寄存器以及可能更多的寄存器。
为了实现上下文切换,您需要确定需要保存的正在运行的任务的状态集,以便以后可以恢复。
通常,保存状态部分是在汇编程序中完成的,或者使用C代码中的内部汇编程序函数。
RTOS任务决不应该在中断上下文中运行。
如果你实现了一个中断处理程序,你只需要一个带有中断处理程序而不是RTOS的程序;)
答案 3 :(得分:0)
编写RTOS是一项非常重要的任务,考虑到你的问题状态,我建议你先尝试一些简单的事情。但是,如果您决定尝试制作自己的RTOS,请参阅。
RTOS的一部分是能够建立一个抢占式调度系统(运行多个任务并根据时间和优先级等标准在它们之间切换)。将优先级较高的任务的应用程序代码硬编码到中断中不会这样做。相反,你应该以稳定的速率进行定时器中断滴答。在中断中,您应该存储当前上下文,跟踪系统时间(在操作系统中设置/获取系统时间的一些功能,并更新每个中断的时间),检查新的时钟是否导致了另一个任务&#39 ; s延迟到期,如果是,则切换到该任务的上下文。
如果要完成所有这些操作,您希望能够跟踪每个任务的内存布局,因为您需要为每个任务分配一定量的堆栈。 您希望实现一个控制结构来跟踪所有任务的状态:
你肯定不会为你的上下文切换使用至少一些汇编代码。
我建议你看一下FreeRTOS.org,因为它们描述了FreeRTOS-kernal的所有内容。 Maby开始关注:http://www.freertos.org/implementation/a00014.html