RTOS中的RTOS

时间:2015-06-01 11:15:09

标签: arm rtos freertos

我打算运行RTOS,例如Nuttx作为另一个RTOS的进程,例如FreeRTOS,以便freertos任务和作为Freertos任务运行的Nuttx将共存。

鉴于底层硬件是ARM cortex A8单核处理器,这是否可行?如果实施不是基于VM概念,可能需要进行哪些更改?

3 个答案:

答案 0 :(得分:2)

简而言之,您的要求是允许GUEST RTOS在底层HOST RTOS的领域内完全运行。第一个答案是使用虚拟化扩展,但A8处理器没有,因此将统治此选项。如果没有虚拟化扩展,则必须使用以下方法之一,并且需要进行大量代码更改。

选项1 - 移植您的GUEST OS API

获取所有GUEST OS API并替换它们的实现,以便通过使用HOST OS的API来模仿所需的API行为。从技术上讲,现在您的GUEST操作系统将没有调度程序,并将缩减为主机操作系统之上的移植层。当公司需要他们的软件解决方案来跨多个RTOS工作时,公司就会使用这种方法。他们会根据RTOS编写软件解决方案。当客户要求在他们的RTOS上运行软件时,他们只需将RTOS API实现移植到客户的RTOS上。

选项2 - 半虚拟化

您的guest虚拟机RTOS用户和内核空间应该都在主机RTOS的用户空间内工作。让我们把问题分成几个部分。

处理特权说明

当您的Guest OS在“内核模式”下执行尝试执行特权指令时,将导致undef指令中止。您必须修改主机内核的undef指令中止处理程序以捕获/拦截这些指令并对其进行操作。每个特权指令都必须被捕获/截获并“模拟”。有一些指令不会陷阱,但需要通过修改代码来处理。例如。如果您的内核代码读取CPSR以确认执行模式,则CPSR会将模式称为用户模式。 (该指令不会导致指令中止,因此您无法跟踪陷阱并模拟模型。唯一的方法是在GUEST OS代码库中识别,搜索和替换这些指令。)

内存管理单元

如果发生权限违规,数据中止将被触发到您的主机操作系统。它必须转发给您的客户操作系统。

<强>中断

您必须使用虚拟SVC调用替换您的GUEST OS的中断控制器驱动程序,这些调用将调用您的主机操作系统来设置中断。

<强>计时器

在运行HOST OS任务时,您必须修改GUEST计时器驱动程序以解决“丢失”刻度。

硬件驱动程序

必须修改GUEST OS使用的所有其他硬件驱动程序,以允许GUEST和HOST之间的设备共享。

<强>调度程序

您的GUEST操作系统调度程序现在可以在另一个调度程序(HOST OS Scheduler)内部工作(因此受其支配)。

答案 1 :(得分:1)

这是可行的。 您需要分离资源:内存,计时器,IRQ等。这样,&#34; Host&#34;操作系统(FreeRTOS)甚至不知道&#34;知道&#34;关于&#34; Guest&#34; OS(Nuttx)。

对于Cortex-A8,您可能希望将IRQ用于FreeRTOS,将FIQ用于GuestOS。它会让你不要重写IRQ控制器(但是再次确保HostOS在GuestOS启动后不控制FIQ。)

上下文切换可能需要进行一些更改:您需要区别主机 - 主机上下文切换,Host-Guest(和Guest-Host)和Guest-Guest上下文切换。

答案 2 :(得分:1)

虽然不直接回答你的问题,但是在设计层面解决这个问题,分离依赖硬件的代码(创建API)并使应用程序级代码独立于底层操作系统或运行时,即依赖于特定的实现让它取决于API。

需要将硬件(OS)相关代码移植到底层OS /运行时