在研究嵌入式系统时,我发现了用于Linux的libmraa库。但我不能确定这是适合我的工具。
我想要做的是实现一个包含步进电机、加热器和风扇等的嵌入式系统。如果我能用Linux来实现它会很好,但我认为这是不切实际和不可能的。
libmraa是否提供调度保证以确保确定性行为和及时响应事件和中断?因为我总是确保步行者不受干扰地工作。
libmraa只是一个爱好者的工具,还是一个真正的嵌入式系统的好工具?
发布于 2016-04-11 07:36:12
警告:我对mraa__没有经验。我所做的,除了看它是什么,是克隆回购和grep的来源'sched',‘很好’等。
我发现的唯一一件事是这个mraa_set_priority() API:
https://github.com/intel-iot-devkit/mraa/blob/master/api/mraa/common.h#L153
请注意,它是针对SCHED_RR的,但对于更具侵略性和确定性的SCHED_FIFO,以及现代精化SCHED_DEADLINE,都没有API。
所以:
libmraa是否提供调度保证,以确保确定的行为和及时的响应事件和中断?
No (相对较小的SCHED_RR API除外)。
和它这样做是正确的,因为"Libmraa是一个C/C++库.在伽利略、爱迪生和其他平台上与IO接口“,而调度策略与此无关:调度策略是一种应用程序特定和/或系统集成的设计决策和设置(考虑到其他进程)。在大多数情况下(存在一些例外)不是明智的选择--在不考虑其他运行过程的情况下,将一个特定的方案编码到一个应用程序中,也不考虑内核内内置的或不包含的策略机制(内核配置选择)。
它的工作是:
这方面的标准工具是:
...and是他们使用的标准API,例如sched_set/getaffinity、sched_set/get调度器等(查看套餐中的shchedutils/源dir )。
至于内核调度选项,请查看scheduler/子for中的scheduler/。您还可以查看CPU cgroup控制器、cgroup-v2.txt或cgroup-v1/子your,这取决于您的内核版本。
我为使用这些替代方案的嵌入式产品做了一些基准测试,最后决定使用CPU cgroup控制器的CPU共享,因为对于我的情况而言,它们是“最聪明的、自适应的”和灵活的负载平衡机制(实时和非实时的混合,但对于产品功能和低prio任务(如日志记录)很重要)。我没有考虑/测试cgroups,对双核嵌入式系统没有多大意义,也没有考虑到期限/配额设置。
当然,我们可以使用上述技术的组合。
libmraa只是一个爱好者的工具,还是一个真正的嵌入式系统的好工具?
再说一次,没有经验。不过,英特尔的一些开源经验(来自他们的e10000以太网驱动程序),对我来说,英特尔是认真的,不会抛弃一些资源,然后忘记它。即使对于一个非常“原型”项目的人来说。对于mraa,查看github,有最小的wiki,一个问题跟踪显示一些问题确实是固定的。
因此,我倾向于相信它是“一个真正的嵌入式系统”。然而,社区规模可能很小,这是一个不容忽视的因素。
PS:
最重要的是:benchmark,benchmark,benchmark……
编辑:
至于“真正的RTOS”和Linux:
我对此也有一些经验,虽然是的,从技术上讲,这将是你所描述的应用程序的合理选择,但只有当你有时间(=金钱)和/或错过最后期限时,才可能导致灾难性事件,例如伤害/杀害某人或摧毁某些东西(包括你自己的硬件,比如无人机坠落),或者完全没有完成它的任务--至关重要的任务。想想国防,航空航天,卫生/医疗设备。
Linux的开发周期(代码-> build -> flash/install ->调试、重复)与Linux的实时操作系统相比将会更快(你可以在你的PC上建立很多东西,而不需要任何硬件),libs/应用程序的生态系统将更加丰富,社区将更加广泛,所需的专门技术培训也会更少,每件事所需的文档数量会更多,这意味着更快的上市时间和丰富的功能。
如果考虑到“没有灾难性事件”的情况,那么使用真正的嵌入式RT更多的是BOM (物料清单:较少的flash/RAM/CPU能力),或者是有关产品可靠性的法律责任。
正如@LPs的回答所指出的那样,Linux的硬实时是可能的(不一定是在用户的土地上)。
https://stackoverflow.com/questions/36532990
复制相似问题