linux OS 与Mbed OS相结合(1)-Mbed 库的实现
对于程序员而言,硬件永远是麻烦制造者。而对付硬件的有力武器就是软件抽象。使用C++对象程序设计语言可以将硬件封装成C++对象。让程序员像定义和调用类的方式来访问硬件。这方面做的不错的是arduino,树莓PI和Arm 公司的Mbed OS。 在Mbed OS 中,使用C++类定义了大多数Cortex-M 处理的接口驱动:
-DigitalOut
-PWMout
-DigitalIn
-CANBUS
-AnalogIn
-AnalogOut
-SPI
-serial
-I2C
-Timer
注:关于Mbed OS 的详细内容,可参见:
https://os.mbed.com/docs/mbed-os/v5.12/introduction/index.html
嵌入式模块化电脑modular-2 采用Mbed OS 作为应用软件的开发平台。使用这些C++类定义的API,使嵌入式程序设计摆脱了底层硬件的细节,提高应用软件的开发效率。对于不熟悉cortex-M 硬件的程序员而言,他们可以迅速开发出嵌入式应用程序。
Arm cortex-A处理器的性能越来越强大。并且从手机应用逐渐向物联网边缘设备渗透。我们也开始计划开发一台基于cortex-A处理器的边缘设备modular-2 Edge。这种边缘设备软件通常基于Linux OS。
如何构建cortex-A/linux 下的嵌入式设备的应用软件开发运行环境,让熟悉,习惯于使用cortex-M的嵌入式程序员平滑,迅速地切换到Cortex-A/linux高性能平台上去。这是富有挑战性的。毕竟程序员才是主角,他们不喜欢,在牛叉的硬件平台也难以推广。
linux OS似乎更加远离了底层硬件。但是它离硬件底层又太远了。在linux OS 中,我们看到了都是文件操作,难以找到GPIO,SPI,I2C 那些熟悉的身影。其实windows也是如此。要想在windows 系统下接个小小的LED,都比登天还要麻烦。第一个拦路虎就是windows 的驱动。搞了许多年,楞没搞清楚。树莓PI 要好一点,搞了一个WiringPi,是LED 闪烁方便了许多。
linux OS 下的硬件扩展方法
开始设计modular-2 Edge 时,其中一个重要的目标是设计一套与cortex-A 处理器和核心板无关的软件架构,甚至于可以在Intel 处理器板运行。毕竟硬件系统发展太快了,软件跟不上硬件的步伐。
为了达到与硬件无关的目标,我们采取了双处理器结构,主处理器是一个运行Linux 的标准平台。可以采用各种处理器核心板构建。IO处理器采用cortex-M 处理器实现,运行Arm Mbed OS。两个处理器之间采用了USB 相连接。
硬件层采用USB 的好处是接口简单,几乎任何一块主板都支持USB ,而且速率比标准UART要快。
软件架构
但是软件接口如何实现呢?我们希望将Mbed OS 的接口驱动API 能够呈现到Linux 的应用程序中来。Mbed OS 的应用程序员可以mbed类似的方式编写linux 下的程序。只是觉得处理器的性能有飞的感觉。
这样的想法是通过下面的架构来实现的。
linux上的应用程序调用类似于Mbed OS 的API 类定义的mbed库(mbed-like lib),Mbed 库通过USB Serial接口和RPC(远程过程调用)协议实现Linux与Mbed OS 上适配程序MAL(mbed Adapter layer)的通信。实现远程调用Mbed OS 的API 类。
扩展API 接口
为了充分发挥Cortex-M 模块的能力,根据不同的IO扩展板,MAL可以实现更多,更强大的软件定义的模块。
Linux 上的Mbed 库(v1.0)
为了验证方案的可行性和性能,我们在linux 上实现了一个Mbed 库,目前包括下列类:
-DigitalOut
-PWMOut
-DigitalIn
-AnalogIn
-AnalogOut
-AnalogIn24bits
-serial
-CAN
-SPI
-I2C
-modbus
-RS485
这个库包括了两部分程序
-linux 上的mbed库
- Mbed 上的适配层软件 Mbed adapter layer.
实现和测试
(未完待续)