Linux 使用 libmraa 与 rtos

Linux with libmraa vs rtos

在研究嵌入式系统时,我发现 libmraa Linux 库。但我无法确定它是否适合我。

我想做的是实现一个包含步进电机、加热器和风扇等的嵌入式系统。如果我能用Linux做就好了,但我认为不行实用可行。

libmraa是否提供调度保证以确保确定性行为和及时响应事件和中断?因为我总是确保步进器始终不间断地工作。

libmraa 只是爱好者的工具还是真正的嵌入式系统的好工具?

A lib 无法授予实时行为。这是内核问题。

您应该使用实时 Linux 内核:例如RTI or PREEMPT RT Patch.

警告:我没有使用 mraa 的经验。不过,除了查看它的内容之外,我所做的是克隆存储库并 grep 'sched'、'nice' 等

的源代码

我唯一找到的是这个 mraa_set_priority() API:

https://github.com/intel-iot-devkit/mraa/blob/master/api/mraa/common.h#L153

请注意,它适用于 SCHED_RR,但没有 API 更激进和确定性 SCHED_FIFO 也没有现代改进 SCHED_DEADLINE

所以:

Does libmraa provide scheduling guarantees to ensure deterministic behaviour and timely response events and interrupts?

(这个SCHED_RRAPI的相对较小的例外)。

它这样做是正确的, 因为 "Libmraa is a C/C++ library [...] to interface with the IO on Galileo, Edison & other platforms",调度策略与此无关:调度策略是特定于应用程序的 and/or 系统集成范围(考虑其他进程)设计决策和设置。 大多数时候(存在一些例外)在不考虑的情况下将特定的计划方案硬编码到应用程序中并不是明智的选择其他 运行 个进程,也不是内核内置的 sched 策略机制(内核配置选择)。

这是以下人员的工作:

  • 对系统进行基准测试(内核+应用程序+其他进程),

  • 利用标准工具(或他们在应用程序中使用的 API 构建或运行时配置选项)and/or 配置内核以 使新的预定选项可用,

  • 再次基准测试,冲洗,重复。

这方面的标准工具是:

...以及他们使用的标准 API,例如 sched_set/getaffinity、sched_set/getscheduler 等(查看 [=28= 中的 shchedutils/ 源代码目录]).

至于内核调度选项,请查看 scheduler/ 子目录中的 the doc。您还可以查看 CPU cgroup 控制器,查看 cgroup-v2.txtcgroup-v1/ 子目录,具体取决于您的内核版本。

我自己做了一些 benchmarks/tests 使用这些替代品的嵌入式产品,最后决定使用来自 CPU cgroup 控制器的 CPU 共享,因为它们是 "smartest self-adapting" 和灵活的负载平衡机制(实时与非实时的混合,但对于产品功能与低优先级任务(如日志记录)很重要)。我没有没有 considered/tested cgroups cpuset,对双核嵌入式系统没有多大意义,也没有period/quota设置。

当然,可以混合使用上述技术。

Is libmraa just a tool for hobbyists or a good to for a real embedded system?

同样,没有使用过它的经验。虽然, 有一些英特尔开源的经验(来自他们的 e10000 以太网驱动程序),但对我来说,英特尔是认真的,不会在野外丢弃一些源然后忘记它。偶换了很"prototypesque" project。 对于 mraa,查看 github,wiki 最少,问题跟踪显示一些问题确实已修复。

所以我会倾向于相信它"for a real embedded system"。虽然社区可能很小,但这是一个不可忽视的因素。

PS:

最重要的是:benchmark, benchmark, benchmark...

编辑:

至于 "real RTOS" 与 Linux:

我对此也有一些经验,虽然是的,但从技术上讲,这将是您描述的应用程序的合理选择,只有在您有时间(= 金钱)的情况下 and/or 可能会错过最后期限导致灾难性事件,例如 hurting/killing 某人或破坏某物(包括您自己的硬件,前无人机坠落)或完全未能完成其关键任务工作。想想国防、航空航天、health/medical 设备。

Linux 的开发周期(代码 -> 构建 -> flash/install -> 调试,重复)与实时 OS 相比 [=145= 会更快](你可以在没有任何硬件的情况下在你的 PC 上制作很多东西的原型),libs/apps 的生态系统会更丰富,社区会更广泛,需要更少的特殊技术培训,大量的文档等 = 更快上市时间和丰富的功能。

如果考虑"no catastrophic event"的情况,去真正的嵌入式RTOS更多的是BOM问题(Bill Of Material: less flash/RAM/CPU power)或有时与产品可靠性有关的法律责任。

并且使用 Linux 进行硬实时是可能的(不一定在用户区),正如@LPs 回答指出的那样。