如何在使用FreeRTOS时保持代码的可移植性

时间:2012-11-04 08:21:51

标签: c embedded portability freertos

我很想知道如何在我的应用程序中使用FreeRTOS。让我提出一个简单的方案。假设我有main和一个具有一些硬件特定代码的模块。该代码可用于控制系统或传感器中的特定电机......具有定义角色的任何硬件。在module.c中,我有一个名为ModuleNameTask的函数。在main我使用xTaskCreate创建任务,然后传递ModuleNameTask。由于我的ModuleNameTask是在module.c而不是main.c中定义的,所以我现在必须在module.c中包含一些FreeRTOS才能使用像vTaskDelay这样的函数。我不喜欢我在module.c中包含这些文件的事实,因为我觉得它不再可移植。

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

2 个答案:

答案 0 :(得分:8)

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

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

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

您的createtask函数应该只包含您关心的参数。其他应该在包装器中进行硬编码。这将使端口更容易(您将在其他操作系统中使用不同的硬代码参数)。

答案 1 :(得分:5)

抽象RTOS和设备层。

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

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

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

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

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

您的界面可能与FreeRTOS本身有很大不同,可能值得查看其他一些RTOS界面,看看您的界面可能需要哪些功能。