3

我对如何在我的应用程序中使用 FreeRTOS 感到困惑。让我提出一个简单的场景。假设我有 main 和一个具有一些硬件特定代码的模块。该代码可以用于控制系统或传感器中的特定电机......具有定义角色的任何硬件。在 module.c 我有一个名为ModuleNameTask. 在main我使用创建任务xTaskCreate并通过ModuleNameTask. 由于 myModuleNameTask是在 module.c 而不是 main.c 中定义的,因此我现在必须在 module.c 中包含一些 FreeRTOS 才能使用vTaskDelay. 我不喜欢将这些文件包含在 module.c 中的事实,因为我觉得它不再可移植。

那么,我该如何处理呢?我应该ModuleNameTask从 module.c 中删除它并将其放在 main.c 中吗?或者只是接受我必须在 module.c 中包含一些 FreeRTOS 的事实。有什么建议吗?

4

2 回答 2

8

需要FreeRTOS 提供哪些功能才能使您的模块正常工作。显然有一些东西,或者你不需要包含标题,你也不会调用函数。

获取这些函数并将它们放在一个单独的头文件中,并将它们os/<operating_sys>/freertos.h包装在您自己的函数名称中(例如my_createtask(<args>).)。现在要移植到不同的操作系统,您需要为您自己的功能提供一个带有新包装器的新文件。

如果你做得不好,你会注意到你的 createtask 函数看起来与 FreeRTOS 函数完全一样,并且可以很容易地映射,但是当你想使用 linux/vxWorks/其他操作系统时,该函数没有正确的参数。

您的 createtask 函数应该只包含您关心的参数。其他的应该在包装器中硬编码。这将使移植更容易(您将拥有与其他操作系统中的硬编码不同的参数)。

于 2012-11-04T08:45:01.340 回答
5

抽象 RTOS 和设备层。

定义您设计的操作系统接口(这可能只是 FreeRTOS 功能的子集,甚至包括使用 RTOS 原语实现的更高级别的接口)并使用 FreeRTOS 实现此接口。

然后,您只使用您的 RTOS 抽象层接口定义您的整个应用程序,包括您的设备层。当您将应用程序移植到另一个平台或 RTOS 时,您只需要更改抽象层实现,并确保保持与原始实现相同的语义。如果设备层也被适当地抽象为能够在不同硬件之间通用,那么您可以对硬件依赖项做同样的事情(即从物理实现中抽象它们)。

多年来,我已成功使用这种方法,使用 C++ 中的 RTOS 抽象,我已将其移植到 FreeRTOS、VxWorks、Segger embOS 和 Keil RTX,甚至 Windows 和 Linux(用于测试和模拟)。您当然不需要使用 C++,但它非常适合这项任务。

在您的抽象中,您需要考虑以下内容:

  • 穿线
  • IPC(队列、管道、事件标志、邮箱等)
  • 同步(互斥量、信号量)
  • 计时器
  • 中断处理程序

您的界面可能看起来与 FreeRTOS 本身非常不同,可能值得查看许多其他 RTOS 界面,以了解您可能需要什么样的功能。

于 2012-11-04T09:06:04.020 回答