之前我讨论了非对称多核以及如何在需要实时响应时间和丰富的用户界面和/或连接性的场景中使用它。我使用飞思卡尔的 Vybrid 作为此类架构的示例,并讨论了使这种解决方案比使用串行链路连接两个独立处理器的“传统”方法更易于开发和更可靠的硬件特性。
在本文中,我将通过展示一个由 Toradex 和 AntMicro 开发的演示项目来展示可用于在这种架构上实现解决方案的软件组件。我们开发了一个提供触摸屏用户界面的 2D 绘图仪。机械部分不是很复杂。它来自 Internet 上可用的工具包。我们进行了一些改进以提高绘图质量和机械可靠性。
控制绘图硬件需要有限数量的数字 I/O。另一方面,我们需要精确的时间来获得良好的绘图质量,并且需要处理大量的数据来绘制复杂的主题。
现在您已经了解了最终结果,我们可以深入了解它并了解它是如何实现的。
该系统有两个主要组成部分:一个基于触摸屏的用户界面,显示不同的矢量图形图像并让用户选择绘图仪将转移到纸上的一个,以及一个在绘图过程中控制硬件的实时控制系统。每个组件都在专用内核上运行。我们将 Cortex-A5 用于用户界面,将 Cortex-M4 用于实时控制。
在 Cortex-A5 上,我们选择运行 Linux 并使用 QT 框架来实现用户模式应用程序。Linux 是嵌入式设备的常见选择,并以合理的占用空间提供了我们系统所需的所有功能。
Digia 维护的 Qt 框架也是嵌入式设备的流行选择。它提供了丰富的功能集(不限于用户界面)、用户友好的集成开发环境(包括 UI 设计器)和双重开源/商业许可。Qt 支持 SVG 矢量图形格式,这使得选择它作为显示器上显示的图像格式变得很容易。相同的图像被转换为 G 代码(一种数字控制编程语言)。控制系统解析 G 代码以执行实际的绘图操作。
在 Cortex-M4 上,我们需要同时执行活动,从 UI 获取命令和数据,同时移动 X 和 Y 轴。这种控制可以在裸机固件中实现,但实时操作系统 (RTOS) 可以简化开发。RTOS 管理不同任务的调度,而不会丢失实时响应时间。它还允许从应用程序代码直接访问硬件。
我们选择 eCos(由 AntMicro 移植)作为 m4 内核的 RTOS。它提供了一个调度器和一个硬件抽象层,使我们的应用程序代码变得简单。这两个组件需要通信,我们有三种不同的通信方式:
• 发送到控制系统的命令
• 关于绘图仪当前状态的反馈
• 提供用于控制绘图的 G 代码
前两种通信涉及少量数据,需要快速传递。飞思卡尔提供了一个名为多核通信 (MCC) 的库,可以很好地满足这些要求。它提供了一个基于端点的接口,用于交换消息。在 Linux 上运行的每个应用程序都可以创建自己的端点,也可以将消息发送到由 M4 核心管理的端点。从开发人员的角度来看,这种机制类似于套接字或管道,提供易于使用的通信链接。
AntMicro 将 MCC 移植到 eCos,在 M4 内核上提供相同的功能。MCC 消息可用于发送小数据包,保持它们的顺序。它们不适合一次发送复杂图形的完整 G 代码。为此,我们决定使用共享内存,允许 M4 内核访问 Linux 应用程序加载的 G 代码数据。
架构如下图所示,突出显示了在两个内核上运行的不同组件。
Linux应用程序将M4代码加载到内存并使用飞思卡尔提供的mqxboot命令行工具启动(该工具是开源的,可以作为参考了解M4如何初始化,并在内部直接实现该功能如果需要对过程进行更严格的控制,则应用程序代码)。然后通过 MCC 交换“欢迎”消息,以确保两个内核都启动并运行。当用户选择一个绘图并按下按钮开始绘图时,Linux 应用程序执行一系列操作:
• 发送“home”命令移动绘图区域左上角的笔
• 将 G 代码数据加载到与 M4 共享的内存区域(这也可以使用 mqxboot 完成)
• 发送“start”命令开始绘图过程
此时,M4 内核独立运行,处理 G 代码数据,移动轴,并发送回有关其进度的通知。我们提供了一个按钮,可以在一段时间内以 100% 的速度加载 A5 内核,以表明这不会影响另一个内核的操作,因为它可以独立操作并访问完成绘图所需的数据。
两个应用程序的源代码都可以在github上找到,你可以看到代码总量相当合理(几百行),并且通过MCC实现的管理通信通道的代码非常简单易读。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !