【问题标题】:build real time operating system on microcontroller在微控制器上构建实时操作系统
【发布时间】:2015-04-24 09:38:48
【问题描述】:

现在我尝试自己编写 RTOS。 我有一个问题:在 RTOS 概念中,我们有“上下文切换”理论。 据我所知,上下文切换是描述当某个任务正在运行而另一个任务具有较高优先级时,较高优先级的任务将运行,当前任务将保存其状态并在较高任务完成后继续启动。要做到这一点,我认为更高优先级的任务将在中断函数中运行,因为中断函数的优先级高于其他指令,对吗?如果我是对的,那么我不需要编写代码来保存当前任务的状态,因为据我所知,中断后,程序将返回到中断的地方。如果我错了,如何保存当前任务的状态?是否有必要编写汇编代码来执行此操作,因为我看到卤素为 FreeRTOS 生成了一个汇编代码文件来执行此操作?

【问题讨论】:

  • 有很多开源的多处理操作系统可供您查看任务切换。

标签: embedded rtos


【解决方案1】:

我认为更高优先级的任务将在中断函数中运行,因为中断函数的优先级高于其他指令,对吗?

不,中断处理程序在它们自己的上下文中运行。中断的上下文切换和优先级(通常)由处理器硬件处理,而 RTOS 线程(再次通常)由软件机制切换,涉及存储当前任务的寄存器状态,恢复新任务的寄存器状态,最后一个寄存器恢复作为程序计数器,以便从新任务的存储位置继续执行。

在本质上不支持线程的语言中,不可能完全在高级代码中执行上下文切换,因为寄存器集是特定于体系结构的,而系统级语言(如 C)不是体系结构特定的,也不提供寄存器级访问。

详细了解 RTOS 内部工作原理的最佳资源之一是Jean Labrosse's book MicroC/OS-II(现在可从 Micrium 免费获得 PDF 格式);从第 2 章开始,概述 RTOS 概念,第 3 章描述内核实现(具体在第 3.06 节中进行上下文切换)——您必须查看可用的各种端口才能看到 OS_TASK_SW() 针对特定架构的精确实现;在书中它以伪代码的形式呈现。

虽然它本身就是一个商业 RTOS(很大程度上被 MicroC/OS-III 取代),但 MicroC-OS/II 最初只能通过购买本书才能获得,并且专门用于教授 RTOS 概念和实现。另一方面,FreeRTOS(被其他人推荐为示例)具有开源的优势,但在实现级别上几乎没有那么好的文档记录,并且可能是一个有点非传统的 RTOS 实现(尽管不一定在上下文中切换电平)。

MicroC/OS-II 可能不寻常,因为它不支持同等优先级的任务(所有任务必须有不同的优先级),因此不支持循环调度;它是一个纯粹的抢占式、基于优先级的 RT 调度程序——这允许非常高效和快速的上下文切换时间。 MicroC/OS-III 在这个意义上更传统,但代价是上下文切换时间。

【讨论】:

    【解决方案2】:

    上下文切换与任务优先级无关。它只是意味着你保存了一个任务的整个 CPU 状态,并加载另一个任务的状态。是的,这将用汇编编写,因为您需要保存寄存器。

    如果您尝试采用当前方法,您将立即失败。如果中断处理程序中正在运行休优先级任务,您的内核将如何处理下一个中断?低中断延迟是成功 RTOS(或任何操作系统)的关键。

    【讨论】:

      【解决方案3】:

      一个名副其实的 RTOS 需要具有更多的功能,而不仅仅是抢占式调度。其他设计决策包括是否使用嵌套中断、是否应用延迟中断处理方案、是否允许优先级反转或如何处理它、是否存在时间片或运行完成(或两者)以及许多其他方面.

      您的 CPU 有一组寄存器,例如累加器和其他 CPU 工作寄存器、堆栈指针,可能还有浮点寄存器,可能还有更多寄存器。

      为了实现上下文切换,您需要确定需要保存的正在运行任务的状态集,以便稍后恢复。

      通常,状态部分的保存是在汇编程序中完成的,或者在 C 代码中使用内部汇编程序函数。

      RTOS 任务绝不应该在中断上下文中运行。

      如果你实现了一个中断处理程序,你只需要一个带有中断处理程序的程序,而不是一个 RTOS ;)

      【讨论】:

        【解决方案4】:

        编写 RTOS 是一项艰巨的任务,鉴于您的问题,我建议您先尝试一些更简单的事情。但是,如果您决定尝试制作自己的 RTOS,这里有一些建议。

        RTOS 的一部分是能够为抢占式调度创建系统(运行多个任务并根据时间和优先级等条件在它们之间切换)。将更高优先级任务的应用程序代码硬编码到中断中不会这样做。相反,您应该以稳定的速率进行定时器中断。在中断中,您应该存储当前上下文,跟踪您的系统时间(在您的操作系统中设置/获取系统时间,并更新每个中断的时间),检查新的滴答是否导致另一个任务的延迟如果过期,则切换到该任务的上下文。

        如果您希望能够跟踪每个任务的内存布局,因为您需要为每个任务分配一定数量的堆栈。 您想实现一个控制结构来跟踪所有任务的状态:

        • 您目前有多少任务?
        • 每个任务的内存段是什么?
        • 任务是 ACTIVE、READY 还是 BLOCKED?
        • 如果 BLOCKRED,每个任务计划在什么时间再次准备好?

        而且你肯定不会在上下文切换中使用至少一点汇编代码。

        我可以建议您查看 FreeRTOS.org,因为它们描述了 FreeRTOS 内核的所有内容。马比开始看:http://www.freertos.org/implementation/a00014.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多