linux - Linux与libmraa vs rtos

标签 linux embedded intel iot rtos

在研究嵌入式系统时,我发现了linux的libmraa库。但我不能确定它是否适合我。
我想做的是实现一个包含步进电机、加热器和风扇等的嵌入式系统。如果我能用Linux来实现它会很好,但我认为这是不实际的,不可能的。
libmraa是否提供调度保证以确保确定性行为和及时响应事件和中断?因为我总是确保步进器总是不间断地工作。
libmraa只是爱好者的工具还是真正的嵌入式系统的好工具?

最佳答案

警告:我对mraa没有经验。我所做的,除了看它是什么,是克隆回购和grep的来源'sched','尼斯'等。
我唯一发现的是这个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
所以:
libmraa是否提供调度保证以确保确定性
行为和及时反应事件和中断?
没有(除了相对较小的SCHED_RRapi)。
它确实如此,因为“Libmraa是一个C/C++库[…]与伽利略、爱迪生和其他平台上的IO接口”,并且调度策略与此无关:调度策略是一个特定于应用和/或系统集成的范围(考虑其他过程)设计决策和设置。大多数情况下(有些例外)不明智地选择一个特定的SCED方案到应用程序中,而不考虑其他运行的进程,也不需要将构建到内核中的SCED策略机制(内核配置选择)。
它的工作是:
对系统(内核+应用程序+其他进程)进行基准测试,
使用标准工具(或他们通过应用程序使用的api
构建或运行时配置选项)和/或将内核配置为
提供新的sched选项,
再次基准,冲洗,重复。
标准工具包括:
nice
chrt
taskset
…以及它们使用的标准api,如sched_set/getaffinity、sched_set/getscheduler等(查看shchedutils/ package中的util-linuxsource目录)。
至于内核调度选项,请查看scheduler/子目录中的the doc。您还可以查看cpu cgroup控制器,查看cgroup-v2.txtcgroup-v1/subdir,这取决于您的内核版本。
我使用这些替代品为一个嵌入式产品做了一些基准测试,最后决定使用来自cpu cgroup控制器的cpu共享,因为它们是我的情况下“最聪明的自适应”和灵活的负载平衡机制(实时和非实时的混合对产品功能来说是很重要的,而对于诸如日志之类的低优先级任务)。我没有考虑/测试cgroups cpuset,这对于双核嵌入式系统和周期/配额设置没有多大意义。
当然,可以使用上述技术的组合。
libmraa仅仅是一个爱好者的工具还是一个真正嵌入的好工具?
系统?
再说一遍,没有经验。不过,英特尔开源的一些经验(来自他们的e10000以太网驱动程序),对我来说,英特尔是认真的,不会抛弃一些资源,然后忘记它。即使是非常"prototypesque" project
对于mraa,查看github,wiki非常少,而且显示某些问题的问题跟踪确实已修复。
所以我倾向于相信它是“真正的嵌入式系统”。但社区可能很小,这是一个不容忽视的因素。
附言:
最重要的是:基准,基准,基准…
编辑:
至于“真正的rtos”与linux:
我也有这方面的经验,虽然是的,但从技术上来说,这是你所描述的应用程序的合理选择,只有当你有时间(金钱)和/或错过最后期限时,才可能导致灾难性事件,如伤害/杀害某人或破坏某物(包括你自己的硬件,前无人机坠落),或是在完成关键任务。想想国防、航空航天、卫生/医疗设备。
Linux的开发周期(代码->构建->flash/install->调试,重复)与实时操作系统相比,Linux的开发周期会更快(你可以在没有任何硬件的情况下在你的PC上实现很多东西的原型),libs/apps的生态系统会更丰富,社区会更广泛,所需的专门技术培训更少,每样东西都有大量的文档等=更快的上市时间和丰富的功能。
如果考虑到“没有灾难性事件”的情况,那么使用真正的嵌入式实时操作系统更多的是bom(物料清单:更少的flash/ram/cpu功率)的问题,或者有时是关于产品可靠性的法律责任的问题。
正如@lps answer所指出的,linux的硬实时是可能的(不一定是在userland中)。

关于linux - Linux与libmraa vs rtos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532990/

相关文章:

c - 为什么 const 局部数组/结构在 c 中不是静态的?

intel - Haswell 微架构在性能中没有停滞周期后端

go - 我可以在至强融核(骑士登陆)处理器上编译Go程序吗?

linux - 在 Windows 上为 Linux 编程

database - 是否有一个轻量级的数据库系统支持时间序列数据的插值和间隙?

android - 使用 Intel XDK 递增应用程序版本代码时出错

linux - 为什么在Linux下,golang运行Http服务会自动创建多个子进程?

Linux 环境变量行为

Linux `mpstat` 无法按 crontab 脚本的预期工作

linux - 如何在linux中使用命令行参数编写shell脚本程序将源文件复制到目标文件