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 相连接。

linux OS 与Mbed OS相结合(1)-Mbed 库的实现_第1张图片

 

    硬件层采用USB 的好处是接口简单,几乎任何一块主板都支持USB ,而且速率比标准UART要快。

软件架构

        但是软件接口如何实现呢?我们希望将Mbed OS 的接口驱动API 能够呈现到Linux 的应用程序中来。Mbed OS 的应用程序员可以mbed类似的方式编写linux 下的程序。只是觉得处理器的性能有飞的感觉。

这样的想法是通过下面的架构来实现的。

linux OS 与Mbed OS相结合(1)-Mbed 库的实现_第2张图片

      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.

实现和测试

(未完待续)

你可能感兴趣的:(mbed,linux,C++)