第2章 Chapter2

嵌入式操作系统的历史

20世纪70年代末,嵌入式操作系统商业产品开始在北美出现,20世纪90年代末嵌入式OS的数量呈井喷式增加,最鼎盛的时候有数百种之多,即使经过30多年的发展和淘汰,现在嵌入式OS依然有数十种之多。最早的嵌入式操作系统是实时多任务操作系统(RTOS)内核,支持8位和16位微处理器,它初期使用汇编和PLM语言编程,后来支持C和Ada。本章讲述了RTOS发展历史中几个重要产品背后的故事。

VRTX:嵌入式操作系统的开拓者

最早出现的商业嵌入式操作系统当属VRTX,因其技术上的创新性,VRTX很快就得到了用户和嵌入式系统公司的广泛支持。VRTX可称为商业嵌入式操作系统的开拓者和领导者。

VRTX的历史

起初VRTX是Hunter & Ready公司的产品,该公司是由James(Jim)Ready和Colin Hunter在1980年创立的。VRTX是英文Versatile Real-Time Executive的缩写。VRTX最初支持Z8002、8086、8088和68000这些16位微处理器,原理上讲,VRTX可以运行在任何微处理器芯片上。VRTX并不要求客户一定购买源代码,使用C语言作为内核API接口,这在当时是颇具远见的。Jim提供给我的资料显示,Hunter & Ready最初的大客户是AMD公司和AMD生产的AMZ8000/8002(Zilog Z8000/8002)。VRTX/8002是一个多任务实时内核,使用事件驱动的调动方式,代码尺寸很小,而且可以扩展,这些特征奠定了之后很长一段时间实时多任务操作系统的技术基础。有关VRTX/8002,海外媒体在1981年12月21日以“基于PROM的OS为Z8002微处理器带来了实时控制功能”为题撰写了专文,详见“延伸阅读”。

Hunter & Ready后来更名为Ready Systems。在历史上VRTX有这样一些重要的贡献:在1987年成为最先实现了具有确定性内核机制的RTOS;在1989年发表了第一个RTOS仿真器VRTXdesigner;在1990年应用VRTX的MD-11 Honeywell飞行控制系统通过了美国联邦航空航天局的FAA认证。

1991年,Ready System开发了VRTX Velocity产品,它将VRTX与UNIX OS开发环境完美地整合在一起。VRTX Velocity支持以太网下载和调试,Velocity Rtscope支持VRTX内核交互调用的源代码调试器,Velocity支持UNIX标准的I/O和网络。UNIX OS在20世纪80~90年代是使用最广泛和最标准的通用操作系统。

1993年,Ready System与硅谷著名的嵌入式软件公司Microtec Research合并,在已经是工业界广泛认可的RTOS标准-VRTX32基础上开发了VRTXmc和VRTXsa两个新的RTOS内核,并结合Microtec著名的调试软件XRAY,开发了VRTX集成开发环境Spectra。1995年,EDA公司Mentor Graphic收购了Microtec Research,在收购之后的7、8年间,VRTX得到了持续发展,比如前面提到的借助Menotor在EDA方面的优势,VRTX支持SoC芯片的集成和软硬件协调开发,这在当时是颇具前瞻性的投资。2002年,Mentor Graphic 收购了另外一个嵌入式OS公司(Accelerated Technology)之后,转向开放源代码的嵌入式OS(Nucleus),VRTX就逐渐被放弃了。因为不断被收购,VRTX市场在20世纪90年代末被pSOS和VxWorks等产品替代。VRTX的创始人Jim Ready也在1999年离开Mentor Graphic,创立了专注于嵌入式Linux的MontaVista Software公司,这在后面有关开源嵌入式OS的章节中会有更多叙述。

VRTX的产品家族

VRTX 1.0版本是在1981年发布的,经历2.0、3.0版本之后,于1987年发表了世界上首个具有确定性调度机制的RTOS—VRTX32。VRTX32最初是针对68K和80x86 CPU设计的,这也是工业界RTOS之中最早应用在机载电子设备中,并通过FAA认证的产品。它是错误报告最少、应用最广泛的RTOS内核之一。1992年新产品Spectra集成开发环境和VRTXsa 问世,VRTXsa是基于超微内核(Nanokernal)的新一代RTOS,sa意味着具备可以伸缩的RTOS架构,可以支持更大规模的嵌入式系统应用。1994年VRTXmc发布,mc是Micro-Controller(微控制器)的缩写,也有支持SoC芯片的含义,它占用最少的RAM和ROM空间。VRTXmc除了继续支持68K 系列CPU外,还支持Motorola M "CORE和ARM SoC。不同于VRTX32和VRTXsa,VRTXmc采用按产品系列一次性授权的模式,更加适合产量大的消费电子产品使用。

VRTX的应用

作为最早的商业嵌入式OS,VRTX有大量引以为傲的成功应用,比如F14、MD-11、A320、A330、A340飞机、法国TGV火车、Motorola手机、三星通信交换设备、医疗生命保障系统、心脏监视系统、机顶盒等。据1999年的资料记载,当时已经有超过5万用户在使用VRTX相关产品。

VRTX在中国

VRTX于1993年前后进入中国,与竞争对手相比起步是比较早的。之后Integrated Systems(产品是pSOS和pSOS+)和Windriver(风河公司,产品是VxWorks)分别在1997年和1998年通过代理商进入中国市场。VRTX对中国高校的嵌入式OS研究和教学发展有一定的贡献,1996年与成都电子科大合作建立嵌入式软件设计中心(CESD),为中国用户提供学习课程和培训。为此Microtec免费提供了可以支持4种嵌入式微处理器的嵌入式OS开发工具,Intel公司也为实验室提供了嵌入式386EX开发系统。Microtec之后还在清华大学与Motorola合作建立了嵌入式软件设计中心。VRTX在航空和工业控制领域凭借国外的市场优势及产品技术优势,较早得到了中国用户的认可,其用户有华为技术(通信电源)、三菱电梯、南瑞、许继、华控等公司。成都、上海、西安等地的航空电子设备研究所都使用过VRTX。在通信领域,VRTX与pSOS竞争激烈,但VRTX还是获得了包括上海贝尔(现在的上海阿尔卡特)、华光科技、巨龙、金鹏、大唐、重庆邮电设备厂和北邮泰康等著名的通信公司的青睐,它们使用VRTX开发了数字程控交换机、SDH传输设备和新一代宽带接入等通信产品。2013年我在深圳遇到过长园深瑞(原深圳南瑞)的罗工程师,与他交流都江堰嵌入式OS的时候,他还回忆起当年在华为技术使用VRTX开发通信电源产品的情景,可见VRTX对中国老一代工程师的巨大影响力。如今VRTX作为RTOS开发平台已经消失,但它或许还会长期嵌入在某些电子设备之中。所幸,它的技术和思想已经深深影响了一批嵌入式软件开发者,比如国外的VxWorks和国内由成都电子科大参与开发的Delta OS。

延伸阅读

VRTX/8002操作系统为Z8002 16位微处理器带来了完整的多任务和实时控制功能,通过将“内核”功能转移到芯片上,操作系统可以在不损失可定制性的基础上简化嵌入式微处理器的开发,这是嵌入式实时操作系统最初的形态。

VRTX/8002嵌入式微处理器多任务实时执行系统

VRTX/8002(Versatile Real-Time Executive of Embedded Microprocessor,嵌入式微处理器多任务实时执行系统)由专注于8/16位微处理器软件开发的Hunter and Ready公司提供,其硬件固化在一对型号为2716的EPROM中。当时的Hunter and Ready公司市场营销副总裁Jim Ready解释说,和一般的用户端可编程计算机不同,嵌入式计算机在接受大量任务时需要同时满足实时响应和并行处理两种需求。

VRTX将这些机制整合到了芯片上,让开发者不必在新的计算机设计上重新实现和修改这些机制。

VRTX只使用一个组件

VRTX相当于用一个简单的组件代替了软件的随机逻辑单元,就像用微处理器取代了随机逻辑硬件一样。VRTX位于系统内存空间中。

接下来,RAM或者PROM中会加入一个配置表,将VRTX和除CPU、内存以外的系统硬件连接起来。然后用户就可以使用VRTX的系统调用编写任务了。

设计者可以专注于为应用程序添加价值,而不是和系统软件打交道,这样费时费力,而且有风险。“VRTX只是系统的一个组件。”

双芯片设计提供基于中断的任务调度、任务间通信和同步、动态内存分配、实时时钟支持、字符I/O和快速响应。如此广泛的基础机制只需要一个CPU和内存的最小配置即可使用。

控制最多256个任务

尽管VRTX可以控制最多256个任务,支持至多256个优先级,但它是独立于开发系统和配置语言的,不需要时钟,而且不对中断的结构做出任何假设。

VRTX通过用户提供的配置表(ROM或者PROM中14个两字节内存字)和环境相连接。因为操作系统并不是一个需要系统生成软件或者配置语言的模块的集合,Ready认为用户在配置表中完全可以指定需要的全部参数。

当设计者增加系统调用时,可能会需要更多内存字。VRTX中一个新的程序状态区域为增加中断处理程序提供了方法。

VRTX/8002只需要任意4KB内存,它的重要功能如下(见图2-1):

1)提供任务通信和同步机制,不需要邮箱、信号量、信息头和交换。

2)支持256个任务和优先级。

3)基于优先级的调度,可以支持在同一个优先级下,按时间片进行调度。

4)128个用户定义的系统调用。

5)提供逻辑上高于中断–服务例程的位置服务。

6)支持实时时钟和至少一个基于字符的I/O设备。

7)同时支持静态和动态内存块分块。

8)支持将内存分为最多4个65KB的地址空间,或者完全不进行地址空间分割。

图2-1 基于PROM的VRTX

Hunter和Ready同时提供C语言编写的库与VRTX进行交互,以及Z8002芯片级别的支持软件包。VRTX/8002价格是200美元(100个级别批量购买)和2000美元(非批量购买),以上包括授权和支持。

嵌入式操作系统的“摩托”系

摩托罗拉在嵌入式系统的地位举足轻重,其微处理器、单片机和计算机系统是当时行业的标准,很多开发嵌入式操作系统的公司都是借助摩托罗拉的市场而起家的。

这里说的“摩托”是指摩托罗拉公司(Motorola),它是美国著名的通信和芯片设计制造公司,成立于1928年。作为一家老牌通信巨头,摩托罗拉在通信业的地位毋庸置疑。从摩托罗拉发明第一款手机开始,摩托罗拉见证了迄今为止整个手机的发展史。许多人很熟悉摩托罗拉手机,但对于摩托罗拉公司芯片和计算机部(简称MCG)的业务了解不多。2003年,摩托罗拉将半导体业务分离出来成立了飞思卡尔(Freescale)公司,并独立上市,继续摩托罗拉以前的通信、汽车电子和通用嵌入式处理器和MCU芯片设计业务。2007年,摩托罗拉的另外一部分与嵌入式相关的业务—MCG则以3.5亿美元出售给艾默生公司。2011年,摩托罗拉自己的核心业务—手机也被互联网巨头谷歌公司以125亿美元收购。2015年3月2日,恩智浦(NXP)半导体斥资112亿美元收购了飞思卡尔,继承了摩托罗拉半导体技术和产品的飞思卡尔公司在2015年12月完全与NXP 合并了,飞思卡尔公司的名字从此消失。这里将讲述与摩托罗拉嵌入式芯片和计算机密切相关的嵌入式操作系统发展中的一些有趣的事情。

靠摩托罗拉起家的OS-9

摩托罗拉自1974年发布第一款MC6800–8位微处理器到1979年发布MC68000(简称68K)16/32位CPU之后,其芯片因为既可以使用在计算机系统中,也可以使用在嵌入式系统中,很快成为当时行业的标准。最早开发嵌入式OS的公司,许多都是借助摩托罗拉的市场起家的,比如VRTX(Reday System公司的产品,后被Microtec Research公司收购)、pSOS(ISI公司产品,后被Windriver公司收购)、LynxOS等。其中OS-9(Microware公司的产品)的经历值得特别说一说。

OS-9是一个实时的、基于进程的、多任务和多用户的操作系统,它很像UNIX的一个实时版本(使用类似技术的嵌入式OS还有LynxOS和QNX等)。OS-9的开发始于20世纪80年代初,最初是支持MC6809微处理器一个称为BASIC09的项目,后来随着MC6809支持64KB存储器扩展到2MB,OS-9组件逐渐丰富起来,比如GUI,这使得它不仅可以使用在摩托罗拉的寻呼机上(见图2-2),还可以应用在早期的个人电脑上,比如TRS-80 Color Computer(俗称CoCo),如图2-3所示。这样的OS和图形技术在当时还是非常领先的。

图2-2 摩托罗拉寻呼机                                图2-3 CoCo计算机

OS-9在20世纪80年代初开始支持68K,20世纪80年代后期重新改写成方便移植的内核(基于C代码),该内核可以广泛支持x86、PPC、68K、MIPS和ARM。

OS-9内核在结构上很有特色,非常类似微内核模式,但效率却很高,也不是单片结构,架构更加安全可靠。OS-9的内核、文件、驱动和应用都是一个单独的逻辑存储模块。每个模块有自己单独的头、数据/代码和CRC。这样,这些逻辑模块很容易在保证高可靠性基础上动态地创建和维护。

OS-9支持POSIX的线程和API,因为具备实时性和UNIX应用兼容性这两个特点,OS-9在支持摩托罗拉VME和CPCI总线的工业计算机方面更具有特色。

2001年,北美的一家工业计算机公司Radisys 收购了Microware,Radisys希望提供一站式的解决方案,比如提供与Intel合作的网络处理器IXP1200的解决方案等。但是因为没有长期的发展策略和资金支持,OS-9的发展和技术服务在后期基本处于停滞状态。2013年,3家Microware经销商从Radisys手里购买了OS-9的资产,成立了Microware LP,继续为OS-9用户提供技术支持和服务。

提供完整方案的飞思卡尔

2003年,飞思卡尔从摩托罗拉独立出来之后,一直致力于提供一站式解决方案。飞思卡尔不仅继续加大力量与著名的嵌入式OS公司合作,比如MontaVista的嵌入式Linux和风河公司的VxWorks RTOS,还自己投入人力、物力成立软件研发中心,专门负责开源Linux在PowerPC芯片上的移植和优化工作。2004年,飞思卡尔在通信基站上大量使用的StarCore DSP芯片上推出了免费SmartDSP OS软件套件,套件内包含了CodeWarrior IDE(该工具产品在若干年后也被飞思卡尔收购)。今天,许多用户都会在使用飞思卡尔MCU的时候,看到或者用到一个MQX的RTOS,它原来是Precise软件技术公司1989年开发的一款RTOS。与OS-9的技术路线不同,它是一款微内核的RTOS,具备多任务可抢占特性,经过裁剪可配置为低至6KB的ROM,除了内核外还有文件、TCP/IP和USB模块等组件,支持68K、Coldfire、PPC、ARM等CPU。MQX以率先采用开放源代码和免版税商业模式在业内著名。2000年,MQX被ARC公司收购(ARC是一家销售可配置处理器核的公司)。2009年,飞思卡尔收购了MQX,并在官方网站上提供、开放了其源代码,使其成为开源RTOS,允许用户可以在基于飞思卡尔的芯片上免费使用这个软件。MQX的应用主要是面向智能电子系统。今天,用户在购买飞思卡尔半导体的MCU开发板的时候,将可以免费获得包括已经优化好的MQX RTOS和CodeWorrios的IDE开发工具。这不仅有助于降低研发和生产的成本,还加快了产品上市的时间,对用户来说是极大的福音。

C/OS的故事

μC/OS也叫MicroC/OS,它是在国内外具有广泛影响力的RTOS之一,这主要得益于作者Jean Labrosse 的几本介绍μC/OS原理和使用的中文版图书在国内广为流传。与其他商业RTOS不同的是,μC/OS内核的源代码是开源的,对于非商业客户(比如大学老师和学生)也是免费的。至今已有数十本以μC/OS命名的中文版图书出版,数百所学校院系和专业开设的嵌入式系统相关课程使用μC/OS作为嵌入式OS 案例,数千篇研究μC/OS相关技术的论文发表。

C/OS的故事起始于1989年。那时,Jean Labrosse先生加入了位于美国佛罗里达州劳德代尔堡市的Dynalco控制公司,并开始为大型工业往复式发动机设计全新的、基于微控制器的点火控制系统。由于有实时内核的使用经验,Jean相信使用操作系统可以强力地推动该项目以及Dynalco公司其他在研项目的进展。对于该点火控制系统而言,进入市场的时间至关重要,并且,实时内核的使用能够帮助Jean实现既定目标。Jean也知道,将来还要为这款产品增加一些新的功能,而使用可抢占式的操作系统将允许在不破坏系统响应特性的情况下进行这些升级。最初Jean考虑使用的内核是一个过去用过且很熟悉的内核。不过,该内核非常昂贵,而经费却不是很充足。备选的是一个过去没有用过的内核,其价格只有最初选择内核的1/5。最终,考虑节省经费的因素,Jean选择使用他不熟悉的那个操作系统。然而,他很快意识到他需要为这个看起来更便宜的操作系统付出更多的时间。在拿到内核后的两个月,Jean不停地联系对方的技术支持人员,徒劳无益地做各种尝试,想知道为什么连一个最简单的应用程序都运行不起来。这个操作系统说是用C语言写的,却要求用汇编语言初始化所有的内核变量。后来发现,Jean是最先购买这个操作系统的那批用户,在不知情的情况下充当了这个操作系统的试用版测试员。

实在是受够了。Jean转而使用最初放弃的那个较昂贵的操作系统。眼看项目要延期,钱就不再是问题了。不到两天,简单的应用程序就运行起来了,这在之前那个便宜的操作系统上好像是不可能做到的事。内核相关的问题似乎解决了。然而,很快Jean发现自己又进入了另外一个僵局。有一天,一个工程师向他汇报这个新的操作系统好像有毛病(bug),从此,一系列的问题就开始了。Jean很快把这个工程师发现的问题转发给软件厂商,暗想他们会对此感兴趣。但是,没有收到他们修正bug的保证,取而代之的是,Jean接到通知说:90天的担保期已过,除非支付给他们一笔维护费,否则,他们不会修正这个bug。对Jean来说这种要求简直是不可理喻。按照软件厂商的要求支付了这笔维护费用。想不到的是,软件厂商竟然花6个月才去掉了这个bug。最终,在拿到第二个操作系统的一年以后,才利用该操作系统完成了项目的点火控制系统。很明显,项目需要一个更好的解决方案。

经历两次失望之后,Jean开始开发自己的内核。起初他想得很简单,认为一个内核真正需要做的事情就是保存和恢复CPU寄存器,写一个内核应当不是一件很有挑战性的事情。大约花了一年时间,果真写完了第一个操作系统C/OS。也正是由于有了新操作系统在手,开发多任务应用程序就如鱼得水了。该操作系统主要由一个C文件构成,一个应用中允许创建多达64个任务。每个任务有独一无二的优先级。每次调用任务调度器时,CPU总是运行处于就绪态的优先级最高的任务。C/OS是可抢占内核,在任意时刻都可以发生任务调度。高效的任务调度实际上只是C/OS提供的众多服务之一。此外,该操作系统还会提供任务间通信(通过消息队列和邮箱)及任务间同步(通过信号量)相关的服务。C/OS所有元素的设计都考虑了高可靠性和简便易用。

在Jean Labrosse的职业生涯中,他自始自终都很注重代码的一致性和文档说明。从1984年开始,他就使用规范的代码标准,C/OS代码的一致性可以很好地证明这一点。在Dynalco工作时,Jean创造并推广了一套严格的代码编写规范,C/OS就是根据这套规范设计的。C/OS源代码的特点包括:大量的空行、字斟句酌的注释和统一的命名。C/OS内核还具有极好的可移植性,这也进一步证实了这种严谨的代码编写规范的优势所在。虽然C/OS跟它的先驱者一样也有少量与处理器相关的函数,但是,这些函数代码与操作系统中的其他代码很清楚地分开了。工程师们能够非常简单地把C/OS移植到一个新的CPU架构上。

为了把新软件介绍给其他人,Jean写了一篇很长的文章,详细解释了C/OS的内部工作原理。因为有太多内容要介绍,最终文章长达70页。Jean把文章投给《C语言用户日记》(C User抯 Journal),被拒了,原因有二:一是文章太长;二是文章主题不够新。该杂志已经出版了多篇关于内核的文章,而这只是又一篇关于实时内核的文章。但Jean坚信文章是独一无二的,他又把它投给《嵌入式系统编程》(Embedded Systems Programming)。该杂志编辑的答复和《C语言用户日记》一样,《嵌入式系统编程》分两部分连载了经过删减的Jean的文章。发表的两部分文章反响强烈,工程师们非常高兴地看到,高质量内核的内部工作原理被揭露出来了,他们争相下载C/OS的源代码。另一方面,内核厂商则对该文章的发表非常不安。实际上,那个廉价内核厂商尤其不安,竟声称Jean抄袭了他们的工作。试想一下,Jean怎么可能基于一个不能运行的软件来开发C/OS呢!

很快,令RTOS厂商更加不安的事情出现了。Jean的文章被《嵌入式系统编程》杂志刊登后不久,《C语言用户日记》的出版商R&D出版社主动联系Jean,表示想出版一本关于C/OS的图书。起初,这本书只是计划把Jean最早提交给《C语言用户日记》的材料打印出来。如果采用这种思路,这本书也就80页左右。为了充分利用这次机会,Jean计划写一本深入介绍C/OS的书籍。经R&D出版社同意,在接下来的几个月,Jean开始写作。到1992年的下半年,Jean Labrosse的第一本书《C/OS:The Real-Time Kernel》出版了(见图2-4)。最开始,这本书的售出速度并不令人满意,但R&D出版社每个月都会在《C语言用户日记》上给这本书做广告。与此同时,Jean Labrosse渐渐被大家认可,成为一个内核专家。1993年的春天,他接受邀请,参加了在乔治亚州亚特兰大市举办的嵌入式系统会议(ESC),为超过70位嵌入式爱好者讲述了操作系统的基本原理。在接下来的几年中,他一直参加ESC年会,每次都会给几百个工程师讲述MC/OS内核。逐渐大家对书的兴趣也提高了。过了最初缓慢发售阶段,《C/OS:The Real-Time Kernel》最终销量超过15 000本。

图2-4 《C/OS:The Real-Time Kernel》和书后附的1.1版软件

由于《C/OS:The Real-Time Kernel》写得很成功,在20世纪90年代,使用C/OS的工程师越来越多。开发者很容易就可以把操作系统移植到新的硬件平台上,开发无数基于C/OS的应用。虽然有少数C/OS用户只是在业余时间对C/OS修修改改,但更多工程师真正把该操作系统用在了复杂的和要求苛刻的商业项目上。而来自C/OS用户的评论和建议也帮助Jean不断完善着该操作系统。在最初几年内,他仅仅对C/OS做过一些很微小的改动。然而,当R&D出版社要求写C/OS的第二个版本时,他决定对操作系统和书做一次大的改进。升级后的操作系统就是C/OS-II。

如果快速浏览C/OS-II源文件,你可以发现该操作系统与C/OS不同。在C/OS中,所有与处理器无关的代码都包含在一个C文件中,而C/OS-II把它分成多个文件,每个文件对应操作系统中的一种服务。C/OS-II还提供了其前一版中没有的许多功能,包括栈检测功能、介入函数和安全的存储器动态分配法。为了将这个全新的操作系统的新功能交代清楚,书的页数几乎增加了一倍。正如新操作系统要有一个新的名字一样,这本新书也有一个新名字《MicroC/OS-II:The Real-Time Kernel》。(在新的书名中,用“Micro”替代了“”,这是因为书名中的这个希腊字符给很多零售商带来了麻烦。)《MicroC/OS-II:The Real-Time Kernel》一书于1998年出版。在这本新书中配有C/OS-II源代码。这一次,很快有数千名开发人员测试了这个新的内核,并反馈了很多宝贵意见。此外,对于那些不太熟悉内核的人来说,这本书全面并通俗易懂地讲述了操作系统的基本原理。很多大学教授开始意识到这本书对想学习内核的新手来说有着很大的吸引力,于是,他们开始围绕C/OS-II设计整套教学课程。很快,学习过C/OS-II内核的大学毕业生开始参加工作,并在他们的工作中继续使用C/OS-II。

当很多学生因为他写的书和很容易拿到的源代码而开始学习C/OS-II时,大量的工程师则是由于其可靠性而选择使用C/OS-II。2000年7月,一款嵌入C/OS-II的航空电子产品得到了DO-178B A级认证,这意味着这个操作系统的可靠性得到了权威认证。该认证受航空电子联合组织(FAA)认可,也只有那些被认为是足够安全、可用于航空器的软件才能得到该认证。直到今天,也只有很少几个操作系统成功地通过了该软件认证必须经历的苛刻测试。DO-178B认证只是C/OS-II取得的众多认证书中的一个,其他的认证书包括美国食品和药品管理局的上市前通知书(pre-market notification,510(k))、医疗设备的上市前许可证(pre-market approval)和针对工业控制的IEC-61508。符合这些标准对C/OS-II在工业领域中的应用是至关重要的。不过,这些认证对其他行业的工程师也有重要意义,因为这些认证表明C/OS-II具有可靠性高、文档完备和可缩短产品上市时间等优点,这对任何设计都是很有益的。

一直到20世纪90年代末,Jean Labrosse仍然全职在Dynalco公司工作,那时他仅用工作以外的时间做与C/OS-II有关的工作,但这很难跟上操作系统的发展要求。Jean认为回答每一个C/OS-II用户的问题是他的责任,但流入邮箱的信件却源源不断。既然已经不能再把操作系统作为一个业余项目来做,Jean决定创建自己的软件公司。1999年秋,Jean Labrosse的公司Micriμm正式成立。Micrim由两个词构成,即“Micro”(意思为微处理器或微控制器)和“ium”(意思为世界),因此,Micriμm的意思是(从软件的眼中看)微处理器世界。在成立Micrim公司前不久,Jean开始编写C/OS-II一书的第2版,该书于1999年11月出版,并配有新版本的内核。该操作系统增加了两个主要的功能:事件标志组和互斥型信号量。书中详细描述的这些新功能深受C/OS-II用户的欢迎。同样,这本书本身也非常受欢迎,《MicroC/OS-II:The Real-Time Kernel》的第2版很快就出现在众多嵌入式软件开发者的书架上。实际上,这本书是在嵌入式系统方面最畅销的一本书。

进入2000年以后,Micrim公司扩张了,一些工程师加入Micriμm公司。他们不仅把C/OS-II移植到一些新的硬件平台上,而且开发了大量的范例工程,写了很多应用笔记。2002年,Jean的一个老朋友Christian Legare加入Micrim公司,并成为公司副总裁。他有着丰富的管理和技术经验,这进一步促进了公司的快速发展。自从Christian加入Micrim公司后,公司就从一个只有一个产品的公司发展成一个有15个组合产品的公司。与此同时,为了满足C/OS-II用户不断发展的需求,C/OS-II还增加了一些新的功能,包括给操作系统增加各种各样新的API函数,以及把内核支持的最大任务数从64个扩展到255个。作为公司的总裁,Jean仍然专注于编写一流的内核代码,最近完成的是C/OS-III。经过无数小时小心翼翼地编程和测试才完成的C/OS-III是一个鲁棒性很好的操作系统,虽然它的根基是C/OS-II,但却是一个全新的内核。根据用户的反馈和长时间的经验积累,C/OS-III增加了几个重要的功能。

编写新软件的时候,Jean Labrosse对那些流行的、没有经过验证的技术的使用持高度谨慎的态度。虽然他喜欢跟踪高科技领域内的最新发展,但他认为,把关注点放在解决工程师的实际问题和提供一个可靠的、完整的内核,要比放在如何尽早跟上那些刚出现的发展趋势更加重要。这种哲学思想已经在C/OS发展中获得了相当大的成功。到今天,Micrim公司已经成为一个高度知名的嵌入式软件提供商。工业界调查报告一致显示,该操作系统是嵌入式领域中最为流行的操作系统之一。Jean的目标过去是、将来还会继续是为他在Dynalco公司时所面临的、现在数以百万计的嵌入式系统开发者还在继续面临的那一类问题提供有效的解决方案。

后记

我于2016年2月24日在纽伦堡嵌入式世界展与Jean Labrosse(图2-5左1)和Christian Legare(图2-5左3)见面和交流,Jean介绍了他们最新的C/OS for Maker计划,该计划允许年销售额少于10万美元或者投资额少于100万美元的商业公司可以免费使用包括C/OS-III Kernel、TCP/IP、USB device和Host,以及Modbus和文件在内的系统软件,据悉已经有几家中国企业开始签约该计划,祝愿他们的创业项目取得成功!

图2-5 2016年纽伦堡嵌入式世界展

风河—嵌入式操作系统的常青树

过去30年间,风河的VxWorks在嵌入式操作系统领域一直处于领先地位,在航空航天、通信、工业控制等行业有着广泛的应用,风河在业内被称为嵌入式操作系统的常青树。

风河公司(Wind River System)是一家专门从事嵌入式操作系统、软件开发工具、解决方案平台和服务的软件公司,由Jerry Fiddle和David Wilner于1981年在美国加州创立。VxWorks是风河公司推出的实时多任务操作系统。

VxWorks的历史

VxWorks最初的版本并不是一个全新的产品,而是在VRTS内核上增加了一些功能之后的一个产品。VRTX原本是Ready System公司的产品,它缺少一个简单的实时操作系统的文件系统模块和集成开发环境。VxWorks的创建帮助VRTX内核形成了一个完整的嵌入式操作系统及开发环境。风河的创始人David Wilner认为VxWorks的名称“VRTX Works”是一个双关语。之前,风河已经和Ready System公司达成协议,风河拥有销售VRTX的授权。但到了1987年,风河预感到VRTX的销售合同可能会终止,于是转去开发了自己的Wind内核。这个Wind内核是由当时只有17岁的加州大学伯克利分校的学生John Fogelin编写的,目标是替换VxWorks中的VRTX。20世纪80年代初的各种RTOS是用汇编语言书写的,而Wind内核是用C代码书写的,因为Wilner坚持认为微处理器性能会按照摩尔定律发展,C语言在性能上不会输给汇编语言。事实证明这个决策是正确的,C语言带给Wind内核很好的可移植性、标准的C库和兼容的API。1989年,风河正式发布了自己的嵌入式OS-VxWorks。

风河产品的特点

现在风河产品包含两个嵌入式OS平台:Linux和VxWorks;基于Eclips支持这两个平台的开发工具Workbench、On-Chip Debugging工具产品(即JTAG仿真器,该工具在2015年年初已经停止开发和销售了)、测试管理工具和工程服务。

VxWorks是由支持多核、32/64位嵌入式处理器、内存包含和内存管理的VxWorks 5.0和VxWorks 6.0、Workbench开发工具(包括多种C/C++编译器和调试器)、连接组件(USB、IPv4/v6、多种文件系统等)、先进的网络协议和图像多媒体等模块组成。除了通用平台外,VxWorks还包括支持工业、网络、医疗和消费电子等的特定平台产品。风河网络设备平台是其中最受欢迎的产品之一。如图2-6所示。

1995年,VxWorks 5.0 发布,风河推出一套称为Tornado的嵌入式OS开发环境,如图2-7所示。在多数用户眼里Tornado就是VxWorks,因为工程师每天的开发工作都是在Tornado上完成的(就像今天MCU开发中使用的Keil或者IAR EW开发工具一样),多数用户使用以太网作为连接开发主机和目标机(比如PowerPC、MIPS、ARM和x86)的通信方式,这非常方便且高效,类似今天的嵌入式Linux开发方式,当时Tornado是嵌入式OS领域最有影响力的开发环境。2004年,支持内存保护机制VxWorks 6.0发布之后,Workbench逐渐代替Tornada,成为可以支持WindRiver Linux、VxWorks和On-Chip Debugging的开发环境。

图2-6 风河网络设备平台

图2-7 风河Tornado开发环境和VxWorks

VxWorks的应用

风河公司的VxWorks以其高可靠性和优异的实时性被广泛应用在通信、军事、航空航天、工业控制等领域,比如在美国的F-16、FA-18战斗机、B-2 隐形轰炸机和爱国者导弹上都使用着VxWorks,最为著名的是1997年4月在火星表面登陆的火星探测器、2008年5月登陆的凤凰号,以及2012年8月登陆火星的好奇号火星车,如图2-8所示。

图2-8 2012年8月登陆火星的好奇号

风河的重要并购活动

在嵌入式软件行业,风河是一家历史悠久、产品线完整、资源充分的公司。风河公司在2009年被Intel收购之前已经在美国纳斯达克独立上市。根据风河的财报,2008年财年风河公司的销售额已经达到3.286亿美元,比2007年增加了15%。风河公司之所以能够在竞争激烈的嵌入式软件市场脱颖而出,除了其卓越的技术、产品和服务外,并购也起到了重要的作用。根据风河公司的官方资料,在2000年~2008年期间,风河共进行了10次并购活动。笔者观察到,其中技术和产品互补型的收购占大多数,比如2000年3月收购EST公司。EST(Embedded Support Tools)是美国马萨诸塞州的一家嵌入式开发工具公司,以提供Vision Probe/ICE JTAG仿真器和PowerPC开发板而著名,支持VxWorks和Tornado开发环境。此次收购让风河增加了硬件的低层开发能力和新的产品线,EST产品线目前已经整合到风河四大产品线之一的On-Chip Debugger产品线之中。2008年10月,风河收购MIZI Research是为了在嵌入式Linux智能手机OS上积累技术并提升在亚洲市场的服务能力。MIZI公司成立于1999年,是韩国一家专注于移动应用领域的嵌入式Linux企业,在智能手机、车载汽车信息系统和视频电话等方面有超过20个成功应用案例。而2000年风河收购美国ISI(Integrated System)公司却不是单纯技术和产品的互补了,市场因素才应该是这次并购的更重要原因。ISI也是一家老牌的嵌入式OS企业,它们的嵌入式OS-pSOS在行业中有着很高的知名度,市场占有率很大。风河的VxWorks在市场上与pSOS竞争非常激烈,这次收购帮助风河成为嵌入式OS名副其实的嵌入式软件巨头。对于这次收购的目的,当时有媒体直言不讳地提出质疑,质疑风河未来很有可能因为产品政策调整的原因,而让ISI的pSOS操作系统半途而废。事实上,在收购ISI公司5个月之后的芝加哥嵌入式系统会议上,风河的董事长Jerry Fiddler就上述质疑果真给出了明确表示:“在(收购)那一天结束的时候,你拥有的平台就只能是一个,否则你无法正常运行公司。”就这样,曾经声名显赫的pSOS从此消失不见了。

结语

2009年,Intel收购了风河,这让风河再一次走到了风口浪尖上。现在,风河是Intel全资拥有的子公司,这极大地改变了市场的结构。虽然这两家公司都宣布,“风河公司将继续开发支持多种硬件体系的创新商业级软件平台,以满足众多嵌入式系统用户和移动用户的需求。”然而,对这一点不少人心存疑虑。很多人担心风河的嵌入式OS针对ARM、MIPS或者Power PC等非Intel芯片,将来可能会被降低为二级版本。但是几年过去了,回头再看,这些曾经的顾虑显然都是多余的。收购风河给Intel在嵌入式市场带来了一些有利的资源,比如获得了一支极富经验的嵌入式OS研发和服务团队。虽然其他大的利好目前还不很明显,但风河在嵌入式OS道路上将继续稳定发展,这一点已毋庸置疑。

风河对于市场的把握有自己的独到之处,每次进入市场都是在最恰当的时间点。风河公司虽然进入开源的Linux市场较晚,但发展迅猛并最终击败竞争对手成为市场老大。在物联网操作系统领域,风河也不是物联网市场的领路者,在微软和ARM推出物联网操作系统产品之后,风河才开始逐渐调整自己的产品策略。2015年10月,风河发布了自己的物联网操作系统软件—Wind River Rocket,与ARM mbed一样,Wind River Rocket是一个免费的、支持MCU的实时操作系统,Wind River Rocket包括风河Helix App Cloud,形成了一整套解决方案。我们期待,作为嵌入式操作系统的常青树的风河公司,在新一波物联网大潮中能够再放异彩,续写辉煌。

嵌入式操作系统的红花绿叶

在众多嵌入式操作系统公司中有人尽皆知的著名企业,比如微软和风河,而更多的则是映衬在这些“大红花”周围的“绿叶公司”。其中许多都是小公司,甚至只是个人,他们大多都辛勤地默默耕耘着,为嵌入式操作系统的发展奉献自己的才能和智慧。

20世纪70年代末,嵌入式操作系统商业产品在美国和加拿大等国家出现,20世纪90年代末嵌入式OS的数量呈现井喷式增加,最鼎盛的时候有数百种之多,即使经过30多年的发展和淘汰,现在依然有数十种之多。

最早的RTOS公司不在硅谷

广为人知的嵌入式实时多任务操作系统公司比如风河(VxWorks)、ISI(pSOS)和Ready System(VRTX)都是从硅谷起家的。2015年5月底,我在纽约见到一位嵌入式系统的老前辈Bernard Mushinsky,如图2-9所示。通过他我才了解到,美国最早的RTOS公司不在硅谷。

图2-9 作者与Bernard Mushinsky 2015年在纽约的合影

Bernard创建的公司Industrial Programming Inc(IPI)成立于1969年,位于美国纽约。1976年开发出世界上第一个来自第三方独立软件公司的RTOS,产品是MTOS-68和MTOS-80。第二代产品是在1979年和1981年先后发布的MTOS-68K和MTOS-86。Bernard说,这些产品至今在某些设备中仍然还在使用。20世纪80年代中期之后的10年,MTOS升级支持Intel 32位的处理器,包括386/860。MTOS应用覆盖计算机外设、通信和工业控制等许多领域,有1000多个客户使用了MTOS产品,这在当时可谓是一件很了不起的事情。

即使在今天来看,MTOS的技术还是有独到之处的。第一代MTOS产品率先实现了同构多处理器的多任务、内存池的I/O驱动、邮箱中的事件标准和可协调(异步)的中断机制。

这里详细讨论一下MTOS处理器的技术。MTOS支持的是对称多处理架构(Symmetrical),没有主从(Master/Slave)之分,MTOS的任务不需要知道它(该任务)运行在哪个CPU上,开发者看到是一个虚拟的单CPU。30年前,半导体技术没有今天这样先进,还没有多核CPU。多CPU系统一般是一块单板计算机上有多个CPU,或者多块单板计算机通过总线构成一个多CPU的系统,典型的是Motorola公司的VME总线计算机系统。在外设支持方面,MTOS可以做到支持另外一个CPU板上的I/O设备,而且可以支持最多16个CPU。MTOS的任务可定义为本地任务(运行在一个CPU上)和全局任务(运行在所有的CPU上),MTOS还有一个Invariant Execution技术,它支持应用程序选择以同样的方式在一个CPU上或多个CPU上执行。MTOS多处理器技术与今天Linux对称多处理器(SMP)思想非常接近,可见其技术的先进性。

2015年5月我与Bernard是第一次见面,当他了解到我的经历,以及我与Jim Ready在20世纪90年代初就已经相识,并在之后15年间一起工作时,我们彼此之间的距离就拉近了许多。Bernard对Jim和他的VRTX非常尊敬,一再真诚地说VRTX市场做得好,非常成功,前一年硅谷的嵌入式系统大会上他还与Jim见面并进行交流。当听说我离开纽约后将到硅谷见到Jim时,他让我带去他的问候。

当我表示希望更多地了解MTOS技术时,Bernard非常高兴,他写了邮件向我推荐他们早期出版的一本图书《An Implementation Guide to Real-Time Programming (Yourdon Press computing series)》。Bernard还给了这本书在美国亚马逊网站上的链接,告诉我能买到旧书,如果不方便他可以帮我购买。我已经购买了一本,可惜的是邮寄的时间太久,没能在离开美国的时候带走,直到2015年9月下旬我才收到这本书。

Bernard已经年逾古稀,依然坚持工作,他当时在HCC工作,和夫人长期居住在纽约。HCC公司成立于2000年,由戴夫·休斯创立,总部在波兰的布达佩斯。HCC以提供世界上第一个经过认证的、便携式医疗应用的嵌入式DICOM协议栈而著名,主要产品是安全的文件系统软件和USB协议栈。临别前,我和Bernard约好,下次我再来纽约我们去一家中餐馆品尝地道的中国菜。遗憾的是,2015年8月中,也就是我回到北京两个月后,传来了Bernard去世的消息。我们痛失了一位优秀的老前辈,我和他的中餐之约再也无法实现了。

嵌入式OS的前辈—SMX

Micro digital公司创立于1997年,其产品SMX(simple multitasking executive)是一个嵌入式OS,也是一个RTOS。公司最初只是在嵌入式系统领域做工程应用和服务。SMX开发始于1987年,1989年第一版SMX发布,之后近20年,SMX逐渐丰富和完善,形成了包括内核、文件、网络、图形、USB和WiFi模块在内的一个比较完整的嵌入式OS。

Micro digital的创始人Ralph Moore是这个行业的前辈,他早期从事大型计算机的研究,后来自学编程成为微处理器的程序员,经过多年研究成功地开发出SMX。之后Ralph转入公司业务开发和销售,最近几年他潜心于v4版本的SMX多任务内核的设计和开发,最新版本的SMX内核已经在2014年1月正式发布。

我在2000年1月曾经访问过Micro digital,它位于美国南加州Costa Mesa,距离著名的Orange Country(橘郡)不远,旁边就是UC Irvine大学。我去的时候,见到了Ralph和他的儿子David,还有一个行政助理Betty。与Ralph的见面促成了我们之后的合作。昆明一家公司购买了SMX RTOS,运行在工业PC上,用于生产线自动化控制系统。除了这个客户之外,SMX这个产品没有找到更多机会在国内推广,但是SMX代理的GUI模块—PEG,我们在国内找到了一些用户。PEG既可以支持SMX,也可以独立运行,甚至可以在其他的RTOS上运行。我们把PEG移植到VRTX和PPC823平台上,还开发了中文字库,这样市场就容易推广了。

SMX有20多年的历史,上百个成功应用,最新版本SMX 4.2在内核性能提高、减少存储器使用、提高安全和可靠性、增加新的特性等方面有了很大的改变。SMX不是很有名气的RTOS,既无法与功能完整的QNX和微软Windows CE相比,也无法与小巧灵活的C/OS并论。SMX介于二者之间,既保持着嵌入式OS的实时性,又尽可能地放入更多的功能,以满足高性能嵌入式系统的需求。最难能可贵的是,SMX团队在嵌入式OS上坚持不懈的精神。

埋头苦干的ThreadX

ThreadX创始人Edward L. Lamie博士曾经是美国加州大学斯坦尼斯分校计算机科学系教授,从事计算机科学的教学和科研工作多年,有多本专著出版。其中《Real-Time Embedded Multithreading: Using ThreadX and ARM》已经被翻译成多种文字出版。Lamie的其他著作还包括《Pascal Programming》和《PL/1 Programming:a Structured,Disciplined Approach》。

讲到ThreadX和Lamie博士,还有一段小故事。据业界人士介绍,Lamie也是Nucleus RTOS(Accelerated Technology公司)的创始人。Nucleus从1.0版本发展到1.3版本后被Mentor收购,Mentor将Nucleus的版本修改为1.11后继续发展,而Lamie另立公司Express Logic,重新开发了一个ThreadX,最初版本是3.0,现在已经发展到了5.X。ThreadX和Nucleus虽然大体结构及大部分机制相似,但是Lamie 博士还是做了很多变化。据最新的报道,ThreadX已经嵌入超过15亿个设备中,其中包括大量的消费电子产品,比如HP打印机、多种3G手机芯片,以及近年来日趋增加的物联网设备。

ThreadX是提供源代码、一次性授权的嵌入式OS,与小型RTOS一样,ThreadX在技术上并无特别的新意。除了内核以外,ThreadX可以提供基本的嵌入式OS的中间件,包括FILEX、GUIX、NETX、USBX等,提供两种内核开发工具:TraceX和StackX,其他工具则要借助第三方,比如IAR和ARM KEIL了。Express Logical在市场上非常低调,如果注意一下ThreadX的公司网站和宣传资料可以发现,他们总是强调有多少设备使用了ThreadX,2007年的数字是4.5亿,到现在已经是15亿了,这与学者出身的Lamie博士严谨务实的作风不无关系。Express Logical位于加州San Diego,这里汇集了美国无线通信和医疗领域的高科技公司,著名的高通(Qualcom)公司总部就在San Diego,德州仪器、三星、Intel、摩托罗拉、松下等全球主流的高科技企业均在此地设有专门的无线通信研发机构,这使得ThreadX在无线通信领域有大量的应用。我在参观美国CES2014展览的时候,看到一款高通公司开发的智能手表Toq,据现场的人员介绍,它就是使用了ThreadX嵌入式OS,如图2-10所示。

图2-10 高通的智能手表Toq

嵌入式操作系统风云录:历史演进与物联网未来第2章 Chapter2相关推荐

  1. 嵌入式操作系统风云录:历史演进与物联网未来导读

    Preface 前 言 我是在1994年正式进入嵌入式系统这个领域的,之前10年,我虽然参与过工业自动化和通信设备开发项目,但在当时,它们还不能算是真正意义上的嵌入式系统.可以这样讲,1994年之前我 ...

  2. 嵌入式操作系统风云录:历史演进与物联网未来Chapter3 第3章

    Chapter3 第3章 开源的嵌入式操作系统 今天开源软件正大行其道,从服务器.云计算.桌面到手机和嵌入式设备,到处都可以见到开源软件和开源的操作系统.本章介绍对嵌入式系统发展具有重要影响的几种开源 ...

  3. 嵌入式操作系统风云录:历史演进与物联网未来Chapter1 第1章

    Chapter1 第1章 认识嵌入式操作系统 操作系统和物联网是今天大众熟悉的二个专业技术词汇.人们拿起智能手机就想到绿色小机器人-谷歌的Android操作系统:使用电脑的时候就想到了Windows操 ...

  4. 嵌入式操作系统风云录

    嵌入式操作系统风云录 历史演进与物联网未来__何小庆著_北京:机械工业出版社 https://pan.baidu.com/s/1rMcyqgma-SHQJ3X_9Cmhpg

  5. 嵌入式操作系统与物联网演进之路

    文/屠敏 物联网是新一代信息技术的重要组成部分,回顾其发展,其中不得不提的必然是嵌入式系统.传统的嵌入式系统与互联网的发展衍生出物联网,而在如今的物联网热潮之下,嵌入式系统也面临着全新的机遇与挑战.那 ...

  6. 国产嵌入式操作系统发展思考

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 作者 | 何小庆 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 嵌入 ...

  7. 国产嵌入式操作系统发展思考 | 何小庆

    国产嵌入式操作系统发展思考 偶然翻到了这篇老文章,出自何小庆(<嵌入式操作系统风云录:历史演进与物联网未来>作者),写的很好,汇总了当下国产 OS 的状态,遂分享出来.本文源自微博&quo ...

  8. 国产嵌入式操作系统任重道远,未来着实可期!

    国际政经环境日益复杂,国产芯片风起云涌,国产操作系统受到国内产业界.学术研究机构和政府部门高度重视.伴随人工智能物联网(AIoT)快速发展,嵌入式操作系统在智能系统中发挥越来越大的作用,为了应对日益复 ...

  9. 学python与嵌入式操作系统_嵌入式操作系统那么多,哪一个适合你?

    原标题:嵌入式操作系统那么多,哪一个适合你? 物联网.人工智能的发展都离不开嵌入式系统,而嵌入式操作系统又是其中不容忽视的重要部分,工程师对其要求也由过去的简单易用上升到既要简单易用又安全可靠.嵌入式 ...

最新文章

  1. PyTorch 1.9发布,支持新API,可在边缘设备中执行
  2. lua 代码加密方案
  3. java web七:http协议
  4. 支持向量机ModuleNotFoundError: No module named ‘sklearn.datasets.samples_generator‘
  5. 【学习笔记】Tableau基础介绍
  6. oracle用户怎么更改空间,ORACLE创建表空间、创建用户、更改用户默认表空间以及授权、查看权限...
  7. Marshal在C#中的应用(void *指针到IntPtr的转化)
  8. java图形包_java流布局图形包
  9. 用C#实现对Oracle 存储过程/函数/包的调试(附源代码)
  10. 台式计算机技术参数响应表,联想台式电脑配置推荐及参数详情【图文】
  11. 开课吧课堂:finally如何使用?作用是什么?
  12. 3.手动搭建Maven项目
  13. [编织消息框架][JAVA核心技术]异常基础
  14. Response.End() 与Response.Close()的区别
  15. 微信支付v2升级v3注意事项
  16. Drupal7学习笔记之Theme感觉非常好转来共享啊!
  17. word实现转换成图片的实现
  18. Java1.5泛型指南中文版
  19. 统计每天每个直播间的访客数、每天最大访客数的直播间
  20. Node.js聊天室

热门文章

  1. 罗克韦尔AB PLC 通过KEPServer实现与西门子1200PLC的以太网通信
  2. 新款宝马MINI钥匙增加!轻松搞定,这MINI看着还可以噢
  3. 2022-07-28 顾宇佳 学习笔记
  4. 天池竞赛-地表建筑物识别 语义分割
  5. arduino 休眠 节能_用 Arduino 自制应急感应灯,给黑夜带来一点光明。
  6. Docker安装OnlyOffice并配置自签证书和自己的域名证书
  7. 网络传输(个人整理 多网站)
  8. 文本编辑器Geany
  9. 华为FreeBuds Pro2+和pro2区别哪个好
  10. 电商平台关联法则模型及推荐系统实现(R语言)