虽然嵌入式系统和通用计算机系统同源,但由于应用领域和研发人员的不同,嵌入式系统很早就走向了相对独立的发展道路。通用计算机软件帮助人们解决了各种繁杂的问题,随着需求的提升,所面临的问题越来越复杂,软件领域的大师们对这些问题进行了深入研究和实践,于是诞生了科学的软件工程理论,无需多言,通用计算机软件的发展是我们有目共睹的。
再回过头来看嵌入式系统的发展,其需求相对来说较为简单,比如,通过热电阻传感器测温、上下限报警与继电器的动作,因此嵌入式系统的应用开发似乎没有必要使用复杂的软件工程方法,于是通用计算机系统和嵌入式系统走上了不同的发展道路。
当嵌入式系统发展到今天,所面对的问题也日益变得复杂起来,而编程模式却没有多大的进步,这就是所面临的困境。相信大家都或多或少地感觉到了,嵌入式系统行业的环境已经开始发生根本的改变,智能硬件和工业互联网等都让人始料不及,危机感油然而生。
尽管企业投入巨资不遗余力地组建了庞大的开发团队,当乐动官方在线入口开发完成后,从原材料BOM与制造成本角度来看,毛利还算不错。当扣除研发投入和合理的营销成本后,企业的利润所剩无几,即便这样员工依然还是感到不满意,这就是传统企业管理者的窘境。
虽然ZLG投入了大量的人力资源,但重复劳动所造成的损耗以亿元计。上千种MCU、大量的片上外设、众多的外围器件,操作方式不尽相同。由于缺乏平台化的技术,即便相同的外围器件,几乎都要重新编写相应的代码和文档并进行测试,所有的应用软件很难做到完美地复用。
在开发同一系列高中低三个层次的乐动官方在线入口时,通常会遇到这样的问题,主芯片可能使用Arm9™、双核A9和DSP,其操作系统分别为µC/OS-II、Linux和SysBIOS。不仅驱动代码不兼容,而且应用层代码也不一样,如此一来,仅仅维护这些各不相同的代码就要消耗大量的人力资源。同时,对于开发人员,每天处在这繁重的维护工作中,很难再专注于乐动官方在线入口本身,发现新的创新点。
传统的嵌入式开发门槛很高,从硬件到软件,从底层驱动到各种协议栈、中间件,再到应用程序,这些都是嵌入式开发必须要掌握的技能。比如,使用一个新的MCU,需要阅读上千页的数据手册;使用OS不得不深入底层,了解原理和移植底层核心代码;乐动官方在线入口需要联网,又不得不学习丰富的通信技术和物联网协议(NB-IoT、Lora、Bluetooth、WIF、HTTP、MQTT、LWM2M、TLS……)。
相信很多开发者都有过项目从最底层的寄存器操作开始,一步一步地构建整个开发平台的惨痛经历。项目投入了大量的人力、物力、财力,结果往往却不甚理想。这是因为我们并非是各个方面的专家,不可能每一面都能做得很好,项目自然会为此而付出巨大的成本。
什么都要做,却什么也做不好,这就是当前嵌入式开发的真实写照。同时,对于一个具体乐动官方在线入口来讲,这些技术仅仅只是乐动官方在线入口的基础“工具”,并非“核心域”,乐动官方在线入口的价值在于乐动官方在线入口本身的创新。若在开发乐动官方在线入口前,开发者需要花大量的时间和精力学习这些新技术、新知识,不仅严重影响乐动官方在线入口的开发进度,而且随着时间的消耗,最初的创意、最初的灵感,很可能就被这些技术细节打败,消磨殆尽,很难开发出具有竞争力的乐动官方在线入口了。为了解决种种痛点,经过十多年的不断研发、积累和完善,ZLG推出了AWorksLP平台。
如图1所示是AWorksLP的标识符。从概念上讲,AWorksLP是ZLG经过十多年时间积累开发的IoT物联网生态系统。AWorksLP平台的宗旨是“软件定义一切”,使应用与具体硬件平台彻底分离,实现“一次编程、终生使用”和“跨平台”。AWorksLP提供了大量高质量、可复用的组件,行业合作伙伴可以在该平台上直接开发各种应用,通过有线接入和无线接入收集、管理和处理数据。从而将程序员从“自底层寄存器开始开发、学习各种协议”的苦海中解放出来,使开发者可以回归乐动官方在线入口本质,以应用为中心,将主要精力集中在需求、算法和用户体验等业务逻辑上。具体来说,可以从两个方面来理解AWorksLP。
首先,AWorksLP是一个平台。它提供了一种通用机制,能够将各种软件组件有机的集成在一起,使其可以为用户提供数量庞大且高质量、高价值的服务。这些组件经过了精心的设计和实现,在代码体积、效率、可靠性和易用性方面下了很多夫。
其次,AWorksLP是跨平台的,这里的平台指的是底层硬件平台或具体软件的实现。AWorksLP规范了各种类型组件的通用接口,这些通用接口是对某一类功能高度抽象的结果,与具体芯片、外设、器件及实现方式均无关。例如,定义了一组文件系统接口,接口与具体存储硬件,具体文件系统实现方法(FAT、YaFFS、UFFS等)均无关。换言之,存储硬件、文件系统的实现都可以任意更换,不会影响到通用接口。基于此,只要应用程序基于这些通用接口进行开发。那么,应用程序就可以跨平台使用,更换底层硬件不会影响到应用程序。换句话说,无论 MCU 如何改变,则基于AWorksLP平台的应用软件均可复用。
下面,首先简述AWorksLP的基本特点,然后向读者展示AWorksLP的架构图。
AWorksLP具有以下特点:
• 所有内部组件均可静态实例化,避免内存泄漏,提高系统运行的确定性和实时性;
• 深度优化了组件初始化过程,使系统能以极短的时间(通常小于1s)启动;
• 所有组件可插拔、可替换、可配置(可通过便捷的图形配置工具完成);
• 领先的驱动管理框架:AWbus-lite,使驱动程序可以得到最大限度的复用;
• 先进的电源管理模块,最大限度地降低功耗;
• 提供常用的通用组件:文件系统、TCP/IP议栈、USB协议栈等;
• 主要目标领域:IoT物联网,提供WiFi、Bluetooth、Zigbee、GPRS、3G等无线接入方式,以及6LoWPAN、TLS、DTLS、CoAP、MQTT、LWM2M等物联网关键协议栈。云端接入方面,支持机智云、IBM、阿里云等云服务平台应用程序框架,很快也将推出ZLG自主研发的云平台;
• 包含极微小原生内核,任务数量无限制,高达1024优先级,支持同优先级任务,最小能在1K RAM、2K ROM中运行,包含多任务管理、信号量、互斥量、消息队列等多种OS服务;
• 除原生内核外,也可使用ucCOS、FreeRTOS等实时操作系统作为AWorksLP的内核;
• 提供第三方组件的适配器,方便用户跳过移植阶段,直接使用第三方组件,比如LWIP、FatFS、SQLite等。
简单的说AWorksLP平台提供了标准化的硬件扩展接口与硬件无关的标准化API函数接口,提供了大量高质量的组件,这些组件都是可剪裁、可配置的。基于AWorksLP中大量的组件,开发者无需关心与MCU、OS有关的基础知识,只要会 C语言就能将需求开发成乐动官方在线入口。
为了帮助用户快速搭建乐动官方在线入口原型,ZLG还提供了丰富的硬件模块供开发者选择,如i.MX28x底板及系列核心板、M3352底板及系列核心板、M6748底板及系列核心板和一系列外围扩展配件(传感器配件、ZigBee配件、WI-FI配件、3G配件等工业IoT常用配件)。
可以简单地将AWorksLP看作三层结构:应用层、中间层和硬件层。
包含用户编写的应用程序。应用程序可以使用C开发,也可以使用C++开发。对于部分硬件平台,AWorksLP还提供了Python(MicroPython)的支持,用户可以直接使用Python语言开发应用程序。
中间层是AWorksLP的主体部分,其包含了各式各样的组件,在AWorksLP中,一切软件都可以视为组件,常见的有:驱动软件(比如,PCF85063驱动)、通用工具软件(比如,链表、环形缓冲区)、一些大型的协议栈(比如,TCP/IP)等。
虽然AWorksLP集成的组件十分繁多,但都是可裁剪的,AWorksLP甚至能够在只有几K内存的小资源平台上运行。其中,AMetal是一个特殊的组件,其位于外设和外围器件之上,本质上是一个裸机支持包,负责与底层硬件打交道,完成寄存器级别的操作,封装底层硬件的功能,并完成基础功能的抽象,为系统上层提供统一的硬件操作接口。换言之,AMetal处理了底层硬件的差异性,使系统上层专注于硬件功能的使用,无需再处理繁杂器件之间的差异性,为每一类不同器件编写不同的驱动。
除AMetal外,其余所有组件可以分为5大类(在架构图中使用黑色的矩形框进行了划分,并在矩形框左上角对该类组件进行了命名):应用框架&库(Application Frameworks & Libs)、基础服务(Base Facilities)、实时内核(Real-Time Kernel)、网络(Networking)、设备管理(Device Management)。
应用框架是直接为应用程序服务的,主要包含一些大型的系统框架,如:GUI、脚本引擎、数据库、Bootloader等。
AWorksLP兼容Posix,使基于Posix接口的应用程序可以无缝移植到AWorksLP平台中运行。为便于用户使用,AWorksLP还提供了一系列算法库。
在这里,特别说明一下相对读者来讲比较陌生的一个概念:“AWPI C++框架”,其同样是由广州致远电子股份有限公司推出的。AWPI提供了一套C++接口,它与操作系统和平台均无关,在任何地方都可以使用,类似于Posix接口,只要一个系统兼容AWPI,那么基于AWPI的应用就可以在该系统中运行。
当前,AWPI已经支持AWorksLP、Windows和Linux系统。如此一来,习惯于在Windows或Linux上做开发的C++程序员,只要其使用AWPI开发C++应用程序,那么这些应用程序就可以在AWorksLP中运行,而AWorksLP又是定位于IoT物联网的生态系统,换句话说,C++程序员无需了解嵌入式底层,就可以直接使用C++开发物联网相关应用。
AWorksLP提供了一系列基础服务,这是一些高效、功能完善的组件,主要包括:文件系统、I/O系统、Shell服务、加密(安全)服务、电源管理(低功耗)、测试框架、状态机框框架、事件管理框架等。
实时内核可以看作一个OS内核,提供OS基础服务:时间管理、线程服务、同步(互斥锁、信号量、消息邮箱等)、原子操作、数据传递、内存管理等。
通常情况下,AWorksLP默认使用的OS内核是广州致远电子股份有限公司自主研发的轻量级RTOS:AWorksLP(RTK)。但实际上,AWorksLP并不限制使用某一特定的操作系统,操作如同驱动代码一样,仅仅是一个可以根据需要任意更换的组件。
在AWorksLP中,要使用某一操作系统,仅需提供一个对应的适配器即可。操作系统适配器直接驻留在操作系统接口之上,主要用于屏蔽各类操作系统和硬件接口的差异,从而大大地增强了AWorksLP的可移植性和可维护性。
当前,AWorks已经为常见的操作系统提供了适配器,比如,SYSBIOS Adaptor、Windows Adaptor、Linux Adaptor等。以支持在AWorks中使用这些操作系统。
网络是AWorksLP非常重要的组成部分,也是其作为IoT生态系统的必备条件。在万物互联的大趋势下,网络相关技术也得到了快速的发展。AWorksLP紧随时代潮流,支持众多常用协议以及最新的协议。用户基于AWorksLP平台开发,无需再深入研究网络协议,直接使用这些协议即可。
目前,AWorksLP支持常见的通信技术,主要有:ModBus协议、CAN协议(这里的CAN侧重于CAN协议栈,设备管理中的CAN侧重于CAN硬件通讯接口)、Cellular(蜂窝)、WIFI、以太网、Lora WAN、NB-IoT、Bluetooth、zigbee等。
同时,AWorksLP具有TCP/IP协议栈,支持IPv6,支持TLS(使用TLS加密通信)以及大量基于TCP/IP的应用协议,如:FTP、SMTP、HTTP、MQTT、CoAP、LWM2M等。
特别地,随着物联网的发展,越来越多的设备需要接入“云”,AWorksLP已经针对第三方云(主要包括阿里云、机智云等)进行了适配,基于AWorks的应用可以轻松的接入这些“云”,第三方云的支持可以方便用户将之前的程序迁移到AWorksLP平台。除此之外,AWorksLP平台还将推出自主研发的云平台。
设备管理用于管理一系列硬件设备,在嵌入式系统中,设备的种类非常繁多,如GPIO、PWM、ADC、ADC、IIC、SPI、CAN、Serial、USB、PCIe、传感器、人机界面、媒体设备、存储设备等。使用一个设备管理框架可以实现对这些设备“有条不紊”的管理。
硬件层表示了当前AWorksLP支持的硬件设备。主要分为两大类:
当前支持的CPU内核主要有:Cortex®-M0/3/4/7、Coterx-A7/8/9、Arm7™/Arm9™、DSP等常用内核。
外设主要是指MCU的片上外设,如ADC、DAC、GPIO、UART、SPI、IIC等;外围器件主要是指一些IC芯片,常见的有:各类传感器芯片、存储器芯片、接口扩展芯片(比如,UART转两路SPI)、专用芯片(如以太网PHY芯片)等。
AWorksLP的发布形式是SDK(Software Development Kit),SDK中包含了文档、工具、示例代码、模版工程等。详见图3。
详尽的文档旨在帮助用户快速上手AWorksLP。例如:《快速入门手册》可以帮助用户快速搭建好开发环境;《用户手册》可以使用户对SDK有更深入的了解,如目录结构、平台资源(ADC通道数目、PWM通道数目等)等,并掌握硬件平台相关资源的定义和配置(如LED0对应的I/O口)。
示例代码展示了一些组件的使用方法,比如,多任务、文件系统、定时器、内存管理等等。当用户使用一个新的组件时,可以参考SDK中提供的示例代码,快速理解各个接口的使用方法。模版工程用于用户快速创建自己的应用工程,使创建新的工程非常简单:拷贝一份模版工程并重命名即可。
AWorksLP是不开源的,内部核心功能组件都是以库的形式提供,相关接口通过头文件引出。用户直接使用各个组件提供的接口开发应用程序,专注于应用程序开发,无需关心底层实现。需要注意的是,AWorksLP SDK与具体硬件开发套件相对应,不同硬件平台使用的SDK是不同的。广州致远电子股份有限公司推出了一系列嵌入式硬件开发套件,供用户二次开发,快速搭建乐动官方在线入口原型。如EPC-AW280底板可以分别与A280-W64F8AWI(WIFI核心板)、A280-Z64F8AWI(zigbee核心板)和A280-M64F8AWI(无线读卡核心板)组成3套开发套件,详见图4。
为了便于客户使用,广州致远电子股份有限公司为每套硬件都提供了对应的AWorksLP SDK,即SDK与具体硬件开发套件一一对应。在使用AWorksLP前,需要联系广州致远电子股份有限公司,获取到对应硬件的SDK。
不同硬件对应的SDK是不同的,不建议混用。不同SDK对底层硬件的不同分别进行了处理,屏蔽了底层硬件的差异性,对于用户来讲,无论使用何种硬件,应用程序使用的API是完全相同的,也正因为如此,应用程序不会与某一硬件平台捆绑,可以很容易地实现跨平台复用。
对于用户来讲,获取AWorksLP SDK后,即可基于AWorksLP快速开发应用程序。在开发某一应用程序前,需要先建立一个新的工程,在AWorksLP SDK中,已经提供了模板工程,“新建工程”只需简单拷贝一下即可。
模板工程就是位于projects_keil5\applications目录下的template文件夹。新建工程即将template文件夹重新复制一份,并将拷贝得到的文件夹重命名为与具体应用相关的名字,例如:要编写一个LED闪烁应用,则可以命名为:led_blinking。接着打开led_blinking文件夹,将工程文件template.uvprojx也重命名为led_blinking.uvprojx,至此,即完成了工程的建立。若用户已经正确安装了keil软件,则双击led_blinking.uvprojx工程文件即可打开工程。(更详细的操作详见配套开发资料中的《快速入门手册》,其中包含了详尽的软件安装步骤)。打开工程后,即可在user_code分组下的main.c文件中添加具体的应用程序代码。
作为示例,可以编写一个简单的LED闪烁程序,详见程序清单1.1。
将该程序编译、链接后即可生成程序固件,并可以下载到开发板上运行,具体操作方法相见SDK中的《快速入门手册》。
在AWorksLP中,函数的命名以“aw_”开头,其中,aw_led_toggle()在aw_led.h文件中声明,用于翻转LED;aw_mdelay()在aw_delay.h文件中声明,用于延时指定的时间(单位:毫秒)。这些接口的详细使用方法将在后续相关的章节予以介绍。需要特别注意的是,在AWorksLP平台中编写应用程序时,所有源文件都应该首先包含aworks.h文件。
在这里,初步体会了LED和延时服务两类API,实际中,任何模块或服务的使用方法都是类似的。首先,包含该模块或服务对应的头文件(“aw_xxx.h”);然后,使用头文件中提供的API。后续章节将详细介绍AWorksLP提供的一些基础服务,比如,常用设备(LED、按键、数码管等)、常用外设(GPIO、PWM、SPI等)、时间管理、内存管理、OS内核、文件系统等。