"); //-->
应用处理器的应用范围越来越广泛。系统芯片都是采用
ARM® ? Cortex-A 正在抢占部分原来由 ARM® Cortex-M
和其他微处理器设备统治的市场。这种趋势由几个因素造成:
作为支持上面论述的典型案例是我们消费者每天都看到产品的重新设计,从微控制器升级到微处理器。这种迁移伴随着新的挑战,例如设计变得越来越复杂,操作系统的抽象层也更加繁杂。使用应用处理器所带来的复杂硬件设计的难题可以被公版参考设计以及使用现成的计算机模块/系统模块或者单板电脑所克服。在操作系统层面,嵌入式 Linux 系统已经在行业中得到广泛应用。大量的开源工具简化功能丰富的复杂嵌入式系统开发。如果使用微控制器,类似的开发工作将变得复杂和耗时。尽管有着诸多的好处,使用类似 Linux 操作系统仍旧产生了不少的质疑和缺乏信心,热别是针对实时控制应用。
开发人员通常的做法是将实时任务和一般任务分摊到不同的处理器上。因此,类似与 Cortex-A 的处理器主要用于多媒体和联网功能,而微控制器则仍然被用作处理实时、关键性任务。本文旨在为开发人员提供一些建议,当他们需要使用应用处理器完成实时系统的时候。
现在有许多 benchmark 工具可以用于评估软件系统的实时性能,然而我们想要快速地测试下面提到的方法是否可以真的提高系统性能。为了看到结果,我们测量由嵌入系统的标准 GPIO 产生的方波抖动。用这种方法,我们可以简单、快速地分析实时性能,并提供初步的优化建议。我们开发了一个以2.5KHz(200µs High / 200µs Low) 频率翻转 GPIO的应用。用示波器连接 GPIO,测试方波和输出时序。
标准 Linux 测试结果如图2所示。翻转 GPIO 的应用配置为实时任务(SCHED_RR),内核配置了Voluntary Kernel Preemption (CONFIG_PREEMPT_VOLUNTARY)。
测试结果表面只有 92% 的波形在 ±10% 的误差以内。最差的测量结果显示延时超过 15ms,逾 3700% 的误差。
本文中我们采用第一个方式是软件相关的。Linux 并不是一个实时操作系统,但是许多项目在很大程度上提高了 Linux 的决策能力和实时性。其中一个项目是 Real-Time Linux project。Real-Time Linux 是一系列的补丁(PREEMPT_RT),为 Linux 内核提供新的强占机制,以及其他的功能和工具,使其更加适合于实时任务。你可以在其官方 Real-Time Linux Wiki (之前在这里)上找到应用 PREEMPT_RT 补丁和应用开发的文档。
我们在 Colibri iMX6DL 上使用PREEMPT_RT 来验证实时性能的改进。在 Toradex Linux 镜像中部署 PREEMPT_RT 补丁的说明可以在 Toradex Developer Center 上找到。
下面的图表(图3)展示了使用 PREEMPT_RT 补丁的 Linux 的实时强占测试结果。结果表明只有0,002% 的波形超过±10% 的误差。最差的结果(0,106us)也只有 25% 的误差,相比于标准 Linux (图2)这是一个很大的提高。
使用 PREEMPT_RT 补丁的软件方案 Codesys Solutions。其依靠 Real-Time Linux 内核以及 OSADL,部署软件 PLC方案,这已经在自动化产业中得到广泛的使用。你可以在这里找到更多关于在 Toradex 计算机模块上运行 Codesys 的信息,包括演示 demo。
Xenomai 是另外一个实现 Linux 实时系统的框架。Xenomai 通过提在 Linux 内核提供一个 co-kernel 而实现。co-kernel 处理实时任务,并拥有比标准 Linux 更高的优先级。在这里你可以了解更多信息。为了使用 Xenomai 的实时特性,你必须使用实时 APIs(libcobalt)来连接用户应用和 Cobalt 内核,后者确保任务的实时性能。
关于安装 Xenomai 到你的设备的相关文档可以在 Xenomai 网站找到:www.xenomai.org。除此之外,还有许多嵌入式硬件可以使用,详见: 参考硬件列表(包括NXP® i.MX SoC 系列)
我们再次使用方波测试 Xenomai 在 i.MX6 SoC 的性能。使用 Toradex 的 Colibri iMX6DL 作为测试设备。我们采用和上面提到的 Real-Time Linux 同样的方式来测试。测试所用的部分代码如下所示,使用 Xenomai API。
void blink(void *arg __attribute__((__unused__))) { int iomask = 0; rt_task_set_periodic(NULL, TM_NOW, TIMESLEEP); while(1) { rt_task_wait_period(NULL); if(iomask) SET_G35; else CLR_G35; iomask = 1 - iomask; } } int main(void) { rt_task_create(&blink_task, "blinkLed", 0, 99, 0); rt_task_start(&blink_task, &blink, NULL); getchar(); rt_task_delete(&blink_task); return 0; }
下图(图5)是 Xenomai 的测试性能。同样,实时解决方案相比于标准 Linux 有着巨大的优势。值得注意的是,最差的结果也在 ±10% 的误差以内。
异构多核处理(HMP)是硬件解决方案。诸如 NXP i.MX7 系列、 NXP i.MX6SoloX 和即将面市的 NXPi.MX8 系列 提供了不同功能的内核。例如我们看 i.MX7S,你会发现一个具有 Cortex-A7@800MHz 和 Cortex-M4@200MHz 的双核处理器。基本的目的是用户界面和高速互联由类似 Linux 的操作系统在 Cortex-A 运行,与此同时,控制任务由类似 FreeRTOS 的实时操作系统在 Cortex-M 上执行。两个核都能够访问内存和外设,在定义每个核上运行的任务时保持灵活性。参考图6。
Toradex、Antimicro 和 The Qt Company 联合开发了一个机器人来展示这个概念。机器人的名字是 TAQ,采用 Toradex计算机模块 Colibri iMX7 的自平衡机器人。用户界面在 Linux 中使用 Qt 构建,运行在 Cortex-A7 上,平衡和电机控制则由 Cortex-M4 完成。双核之间的通信实现了远程控制和面部动画,正如视频中演示的一样.
图7 是 Colibri iMX7 的测试结果。方波由运行在 i.MX7 M4 上的 FreeRTOS 生成。和预计的一样,测试结果好于上面其他所有的方法。
本文概括介绍了在应用处理器上使用 Linux 作为操作系统开发实时系统的解决方案。对于想要使用微处理器并且关注实时控制和决策的开发者,这可以作为入门。
我们展示了使用异构多核处理的 SoC 硬件方案,以及两个基于软件的方法:Linux-RT Patch 和 Xenomai。演示的结果并不是为了对比操作系统或者实时技术。每一种方法都具有优势和劣势,最终还是取决于应用场景。
文章主要为了说明几种现成的解决方案可以在应用处理器上使用 Linux 实现可靠的实时应用。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。