写本文之前,已经断断续续写了一系列文章,这些文章,属于想到哪写到哪,有点凌乱,本文实际上是一个总结交代。
先用锄头,再举镰刀
我开发操作系统,但并不赞成给操作系统贴上“物联网”的标签,操作系统作为计算机软件的基础设施,应该具有广泛适应性,而不是物联网专用。因此,一直以来,我埋头开发操作系统,并没有特别认真地思考物联网。直到5月份的某一天,熊谱翔把我拉进一个IOT微信群,看了下他们的讨论后,才真正认真思考物联网。
像农民种地一样,要先用锄头深耕,才会有好收成,镰刀才会有用武之地,如果光举着镰刀,只会收获一把杂草。设计物联网开发系统,如果只考虑云平台、APP、手机SDK、编程语言等,虽然这些问题都很重要,但如果过于强调,无异于空中楼阁,只要镰刀不要锄头。
本质上来说,无论什么时代的操作系统,都由其基本内涵和外延构成。内涵就是由内核构成,它是操作系统的基因,根本性地决定了操作系统的品质。对于需求的变化和发展,则通过外延的变化来适应,是随时代而变的。十几年前,一个内核就可以称之为操作系统,今天,门槛提高了,内涵和外延,共同才能组成现代操作系统。
我们需要开发新操作系统么?答案是肯定的,没有听说过有了格力空调,美的空调就不需要了。
我们需要从新开发操作系统内核么?不一定!
对于操作系统来说,有一个好内核永远都是最重要的,但是,最重要的事情,并不一定是工作重点,为什么呢?空气对人重要不?没有空气,人都活不了,你说重要吗?但人们并不需要为获取空气做什么事情,不要去污染它就可以了。反而不是人类生存基本要素的智能硬件,有那么多创客彻夜不眠地为之疯狂,因为空气只能满足人生存的需求,而智能硬件却能满足人的进阶需求。操作系统也一样,理论早在50年前就成熟了,嵌入式操作系统内核,也在几十年前就成熟了,如果你只是实现一个满足基本需求的内核,和传统内核功能差不多,只有小幅度的优化和创新,不如选一个合适的内核,千万别当现代版杨白劳。
整合开源软件、开发关键组件,构建操作系统外延特性,适应时代的发展,营造一个自主可控的应用生态系统,对现代操作系统来说,非常重要。这些工作,可以在任何一个操作系统内核上完成,除非有大幅度的、实用的创新,实在没有必要开发新内核,在一个成熟内核上完成,是最佳选择。开发一个内核容易,但要让他完善、成熟起来,却是不是那么容易的,用户凭什么相信你新开发的内核,会比成熟内核完善和稳定?例如可以选择freertos作为内核,在其上开发操作系统的外延特征,形成一个完整的开发平台,起个名字叫白猫黑猫什么的,不再叫freertos,只要你遵守freertos的许可证,就是自己的操作系统。
只有你能有足够的创新,并且能为用户提供别人提供不了的价值,满足行业的进阶需求,那么,你可以自己做一个内核。而且,内核上的创新,对操作系统的功能和性能上的改进,是根本性的、通过外延开发无法实现的。
djyos内核特征
djyos包含一个新开发的内核,那djyos有哪些创新,以至于值得新开发内核呢?
下图是“全员编程,广泛嵌入”时代的djyos操作系统模型(部分尚未实现):
实时性
实时性是RTOS永恒的话题,它是一个硬指标,是RTOS的基本基因之一。
硬件能力的发展,软件完全不变的情况下,客观上提升了RTOS的实时性,但是RTOS的日益复杂化,使得上下文需要保存的内容越来越多,又降低了实时性。
应用对实时性的追求,是无止境的,即使是消费品类的智能硬件,也有相当部分实时性要求相当高,例如像飞行器、机器人这样的多姿态运动控制。而在工业控制领域,就更不用说了,有兴趣的了解下金切削和纺织机的数控系统,对实时性、抖动要求都非常高,要达到几个微秒甚至亚微秒。一旦在实时性方面出问题,就会导致撞刀、撞机床、撞丝杠等事故,千万元的设备,瞬间没了。长期以来,对于超高实时性的控制设备,人们都认为只能裸跑,不适合用RTOS,其实这些设备并不是没有跑操作系统的需求,而是没有能满足要求的操作系统。
实际应用中,实时性要求特别高的部分,都是用中断实现的,因此,中断响应的速度,等效于RTOS的实时性指标。通过创新的中断架构设计,Djyos系统运行中不关闭实时中断,能实现与裸跑一致的实时性,在cortex-m3上,中断响应时间<1us(最坏情况),颠覆了RTOS下实时性肯定低于裸跑的认识。同时,djyos的中断编程方法还比普通RTOS简单,甚至不用写ISR即可完成中断编程。
实现方法详见:http://www.djyos.com/?page_id=43
安全可靠性
虽然安全性和可靠性是两个概念,但他们是有联系的,这里暂且撸在一起讲。
谈到操作系统的可靠性,许多人会把焦点集中在操作系统本身是否可靠稳定,在运行中是否会出错等。可是,你看到过哪个品牌汽车,谈安全时只谈汽车本身安全可靠,而不谈乘客安全的?djyos已经在对可靠性有非常苛刻要求的电力系统中得到应用,除确保自身可靠外,更加注重用户应用程序的正确和设备的安全可靠性,主要体现在以下几个方面:
1、 简洁而功能完备的事件调度器,它的实现逻辑比线程调度简单,体现高可靠设备“简单可靠”的理念。
2、 有不少在别的操作系统上是隐含错误,会产生难于重现的的故障的编程方法,在djyos中却是合法的,降低用户程序犯错的机会。
3、 完善的异常捕捉机制,以及看门狗支持,协助用户分析和定位故障。
4、 如果软件错误导致重启,能将失控时间控制在us级以内,迅速恢复控制,避免更大损失。
本文不打算详细论述,有兴趣的同学,可以看看我写的这些文章:
http://www.djyos.com/?page_id=39,
http://blog.csdn.net/djyos/article/details/45695217
易用性
在“全员编程,广泛嵌入”的时代,嵌入式工程师队伍空前壮大,对于这些半专业的程序员来说,简单易用的开发环境,至关重要。消费品智能硬件开发方面的重要外延,是向JavaScript、Python等脚本编程发展。而工业应用,还基本上是C,无论是从性能上,还是从可靠性上,复杂的脚本解析器并不受信任。
用c语言进行事件触发编程,天生就比用线程编程简单。Djyos是一个真正的事件调度系统,以事件触发式编程,是一个真正多事件并行处理系统。而传统的嵌入式事件触发编程平台,例如contiki,基本上是一个状态机程序,QP则是寄生在普通实时系统上的状态机程序。运行在其他RTOS上的应用程序,例如VxWorks,只要增加一个简单的兼容层,无须修改就可以直接在djyos上运行,QP和contiki上则做不到。
其他、
实时的内存分配,不但允许malloc在ISR中执行,其执行时间是O(1)级的。
比epoll还高效的多路复用,帮助你高效实现网络服务。
适应从8~64位机,不需要修改代码。
独特的看门狗机制,让系统更安全,还可帮助用户降低硬件成本。
天生具有高效的线程池功能。
资源体系,既统一管理应用中的所有资源,有能帮助用户解耦组件。
Djybus组件,统一管理总线型设备。
操作系统外延特性
与时俱进地,操作系统通过其不同的外延,来适应时代的需要。一般来说,行业内广泛需要的功能和特征,就可以划入操作系统的外延范畴。在“全员编程,广泛嵌入”时代,典型应用是物联网,包括消费品物联网和工业物联网。很多物联网开发工具,一上来就大谈特谈云服务、手机SDK、安全等问题,这些问题都很重要,但还有更重要的问题。其实物联网的核心问题,是“连接、区别、识别、沟通、操作、安全”,操作系统的外延,需要结合这6个方面来进行。如这篇博文分析:http://blog.csdn.net/djyos/article/details/46455851。目前,操作系统提供的服务,主要集中在“连接”方面,“区别”方面,IPV6虽然还有问题,但总是有奔头,“识别”方面呢,还暂无良策,至于“沟通”,用远程界面能解决“物与人”之间沟通的问题。
连接能力
1、 接入公网的能力,虽然不是所有智能设备都需要接入公网,但操作系统必须具备接入公网的能力,且必须支持IPV6接入。
2、 适用各种介质组建局域网的能力,现场若干设备组成一个局域网络,是物联网设备最常见的联网方式,操作系统应该支持ZigBee、蓝牙、WiFi等无线联网协议;对于高可靠的工业应用,还应该支持Modbus、Canopen、ethercat等。
3、 支持P2P,C/S,P2P+C/S混合,三种通信方式。
4、 统一的消息服务,如这篇博文http://blog.csdn.net/djyos/article/details/46363593所述,物联网中所传递的信息时无法标准化的,但是,数据包的格式(即消息格式)是可以标准化的。既然不能确保物体间互相“听得懂”,全网使用相同的消息协议,至少能确保互相“听得见”。
沟通能力
在物联网上,“物与物”之间的沟通,还没有标准的解决方案,还处于一事一议的状况,而“物与人”之间的沟通,用远程界面可以解决。远程界面可用远程桌面或者HTML5实现,用于解决物与人之间的沟通问题,分别有其适用场合,这在本人博客 blog.csdn.net/djyos 上已经有了广泛论述,这里不再重复了。这里需要说明的是,工业控制方面,远程桌面的作用更大:
1、 工业设备秉承“简单可靠”的原则,不喜欢用复杂的webserver。工业设备也不喜欢液晶屏,液晶显示器的可靠性较低,降低了设备的整体可靠性;液晶显示器开这么大一个窗口,直接提高了设备的EMC和EMI成本。
2、 工业设备还可能安装在有人身危险的区域,人员无法接近,当然也无法查看显示器了。工业智能硬件要求生产厂家提供更多的维护,如何能够不去现场却能看到现场的一切,也要依赖远程桌面。
3、 工业液晶屏很贵,差不多是民用品的5~10倍价格,工业设备往往成批安装,少数几个人维护。不安装显示屏,而是给少数维护人员配置手持显示设备,用远程桌面显示,大大节省成本,又方便使用。因为手持终端只是显示器而已,可以用手机实现,因为即使手机出现不可靠的情况,也无损被控设备的可靠性。
4、 通过远程桌面,利于厂家远程维护设备,无须用户现场操作和查看设备输出,厂家就能拿到设备运行的第一手资料,比由用户在现场观察,用电话或邮件传递信息,准确度更高,资料更全面,而且还可以做一些不希望外部看到的操作。
广泛适用性
在“全员编程,广泛嵌入”的时代,嵌入式操作系统的使用场合大大扩展,在“全员编程,广泛嵌入”的时代,嵌入式操作系统的应用场景至少以下几大类:
1、 低端智能硬件。
2、 高端智能硬件。
3、 高可靠工业应用。
4、 手持设备移动,通常是手机。
Djyos凭借高度且简易的可裁剪性,同时适应几类设备。
一个企业内,就可能有超低端、低端、中端、高端的硬件平台,产品的复杂程度也各不相同,但一个企业内的产品,往往有联系,会公用一些组件。如果这些产品,能够用同一个操作系统、同一套开发工具、同一种编程语言下开发,同一套代码,应用于各种层次的设备中,无疑对降低企业工作量,节约人工,以最广泛的重用,使代码在产品快速迭代中迅速稳定,都非常有帮助。
同一个操作系统适应所有平台,意味着操作系统应该有特别出色的可裁剪性,仅仅局限于可以*增加和减少组件是不够的。更重要的是,djyos的重要组件可以无区别地适用于不同场合:
1、 djyos是自裁剪的,你只要不去调用某个组件的初始化函数,该组件就被裁掉了。
2、 djyos的djygui组件,弹性极大,既可以在只有几十K内存,连framebuffer都不够的屌丝平台上适用,又可以在拥有数百M以上内存、带硬件加速的高大上平台上运行,用户编程方法一致,功能一致(只是性能不一样),都可以实现远程桌面。
3、 djyos的TCPIP、filesystem、IO系统,都有上述特性。
编程环境
在“全员编程,广泛嵌入”时代,非专业嵌入式程序员大量涌入,再让他们掌握传统的、高度深入的嵌入式编程,已经不太现实了。现代操作系统,需要有一个友好的、易于掌握的编程环境,主要是通过编程语言、api封装、开发工具来体现的。
1、 “脚本+C语言”混合编程,是未来智能硬件发展的潮流,JavaScript、Python、lua等,都是当前非常热门的脚本编程语言,操作系统应该予以支持。对于部分性能要求高的功能,例如飞控,须能使用c语言进行优化,须实现c语言和脚本语言的无缝接口。而对于高可靠性的工业应用来说,它遵循“简单可靠”的原则,根本就不信任复杂脚本语言的可靠性,就像当年许多用户不信任C编译器而执着地使用汇编一样。
2、 对于工业物联网用户,需要有一个简单易用的C语言api,djyos的事件触发式编程较传统的线程控制编程更加简单易学,符合人类自然思维。在易用性上,它介乎于脚本编程和传统线程编程之间,而在效率和稳定可靠方面,也优于传统线程编程。
3、 物联网使得智能硬件已经不是独立运行了,整个系统的一部分功能,是在手持设备、云服务器上实现的。在智能硬件和手持设备等的上面,需要提供一致的开发平台。Djyos同时适用于多种类型平台的特性,非常适合。
生态环境
物联网应用中,大数据的采集、存储、分析、利用,进而实现协作,是物联网的根本价值所在,没有这些,物联网就会沦为高级遥控器。因此,开发物联网操作系统,与之配套的云平台是必须的。但这种云平台不一定要自己搭建,可以借助BAT的。
同时,用手机(适合消费品)或者专用手持控制器(适合工业品)作为智能硬件的监控平台,已经得到广泛认可,提供与操作系统配套的sdk,用于开发手机APP或手持设备应用程序,也成了标配。
数据库能力,显而易见,有不少智能硬件需要大量数据的存储和检索,操作系统支持数据库跑不了。
信息安全支持,只要连入网络的设备,信息安全是跑不掉的话题。
djyos是国内唯一由大企业出资开发的、类bsd许可证发布的,功能完整的RTOS,欢迎关注。