Erlang的Actor模型在嵌入式系统中的应用及运行在Raspberry Pi上的Erlang

个人简介 Omer Kilic是Erlang Solution公司Erlang Embedded项目的嵌入式系统工程师,该项目是肯特大学的知识转移合作伙伴(Knowledge Transfer Partnership)项目,主要目的是推广Erlang在嵌入式系统进行并发系统开发的优势。在为Erlang Solution工作前,Omer是肯特大学嵌入式系统实验室的研究生,负责可重构异构计算架构。

Tech Mesh,另类的编程技术大会,专注于促进有助于软件产业的非主流技术发展。其内在主题是“使用正确的工具进行工作”,而非随意选择手中的工具。通过将来自各国用户和发明家以及新老技术聚集到一起,大会演讲者将在此获得启示,分享经验,并提高洞察力。

   

1. 我们现在在伦敦的TechMesh 2012会场,我坐在Omer Kilic的旁边,Omer,能介绍下自己吗?

大家好,我是Omer,Erlang Solution的嵌入式系统工程师,我参与的Erlang Embedded项目实际上是个联合项目,是由Erlang Solution和肯特大学共同负责的知识传递项目。我们正在评估和考虑Erlang能否替代目前在嵌入式系统中使用的工具链(译注:工具链是一系列用于制作软件的工具,这些工具一般一个接一个地运用,一件工具的输出输入至下一件工具,但广义上是指多个相关的工具)。嵌入式系统将变得越来越复杂,但可以肯定的是,这些设备或系统将很难使用现有方法论和工具链进行管理,而我们认为Erlang有些相关和有趣的属性恰好符合这个领域的需求,所以作为项目的一部分,我们正在探索如何应对这些挑战,比如进行合理的并发管理、分布式系统的建立、容错系统的建立等等。

而Erlang最初是爱立信为嵌入式系统设计的,他们在处理这些问题上花了很长时间,所以我们只要试着去建立些更好的方法论等来映射这些我们工作中用到的小设备。虽说Erlang最初是为超大型嵌入式系统而发明的,但今天,它被用于大规模可扩展分布式Web应用和数据库等环境,所以我认为我们只需要将它放回小设备上,利用Erlang本身的特性管理这些设备的并发并建立容错和管理层等,然后映射到现代化的设备和嵌入式设备上。

   

2. 你准备替换的工具链具体是什么,是用的最多的C、Fortan还是其他语言?

我觉得说“替换”不太合适,应该找个更好的词,因为我们并非弃用C,我们深信C很适合做特定的事情,比如编写设备驱动,以及在系统中建立底层模块,但是用C编写并发代码或是进行原生Socket开发,真不是件好玩的事。就算不考虑好不好玩,这样做也没什么意义,就算我们的开发人员异常努力,但最终还是要采用多种不同框架,来将不同的东西捆绑在一起。我们在寻找办法,使用Erlang来协调这些复杂的系统。这样,虽然仍需要在Erlang中使用到一点C来管理硬件,但是我们的设备能够通过C编码为外部实体,进而在Erlang中进行调用,所以虽然使用了更高层的工具如Erlang来处理这些复杂的高层问题如分布式、通讯、并发、容错、管理等等,但是依然能够使用C编写的驱动与硬件底层进行通讯。这就是我们目前使用的方法,正如我所提到的,Erlang确实有这些高层的结构或特性,而我们所要做的,就是增加它对嵌入式工程师的吸引力,因此我们在尝试创建用例、样例程序等类似的东西。

   

3. 你刚说到分布式,但是说起嵌入式系统我想到的只是手表、闹钟或是类似的东西,分布式对我有什么意义呢?

比如你可能会用到传感器网络,会有成百上千个这种小节点通过不同的链路、网络分散在某个地理区域中,你需要某个途径对这些独立的节点或Mesh网络节点编排操作,比如连接在某个Mesh网络中。因此我们将这个词移植到嵌入式系统的设计中,这样所有的东西不仅可以联网,还是分布式的呢,像Ericsson等在行的人预言过,我们正在走向一个物联的未来。

看看手机所带来的变化吧,无论何时何地,任何人都能通过手机获得数据,不只是手机,冰箱等都成为网络的一部分了,变化时刻发生着,岂止是这些,我们的身边不断出现更多有趣的应用,都是联网的和分布式的,这都已成为了目前应用的主要设计标准。当我们看到“物联网”这个术语的泛滥时,感觉很有意思,因为它只是意味着系统的互联,但它作为概括性术语却泛指任何或是全部的对象都和云差不多。现实中,我曾看到过关于这方面的有趣的案例,案例中描述的不是平板电脑或手机这些东西。某家(我觉得是)荷兰公司,他们正在将传感器植入到奶牛的身上,这样依赖,我们所走向的就不再是“物联网”了,而是“奶牛联网”或是“牛联网”,它无处不在。如果你仔细想想——它们只是小型嵌入式系统或传感器节点,能够反馈数据,你需要收集并处理等等——所以我认为未来将会看到更多有趣的、符合这些标准的应用出现。

   

4. 你说的这些用于牛的传感器,仅仅是为了追踪吗?不是用来控制牛吗?

不能,我希望不能,我认为传感器只能发送生物状态的反馈,比如当你养的动物病了或是怀孕了,又比如某个大型的牛养殖场,它分散在……

   

5. 它们是主动式的?难道不是RFID?

我认为它们是主动式的,确实使用了RFID技术,但是我认为他们是主动式传感器。

   

6. 我想分布式的另一个用例就是大型系统,比如汽车,由很多不同的零件组合在一起,从刹车到视频输出,这也是Erlang能够发挥作用的地方吗?

Erlang使用Actor并发模型。这个模型非常简单而且很早就出现了,基本思想就是你使用Actor组成你的系统,在Erlang世界中我们称之为Erlang进程,是自包含的原子单位,实现某些功能,相互之间通过异步消息传递来实现通讯。而汽车和某些工业设备作为用例却有所不同,因为它们需要满足特定的安全保证等等。如果你在这些设备上运行纯Erlang并使用消息传递,可能会违反某些东西,所以我们正在研究CAN(Controller Area Network)或OBD(On Board Diagnostics)总线协议,我们还在研究如何建立类似事务处理这样的系统,使用这种系统,你的Actor就能够通过车载的系统和工业协议互联以确保满足这些需求。

在利用Actor作为硬件控制模块的想法的背后,其真实目的是沿用在电子工程领域的黑盒设计方法论对系统建模,这样你就可以将系统的各个部分描述为Erlang进程,然后使用管理层来为这些组件建立分层的安全模型。而汽车的子系统实际上就是Erlang进程的集合,并由自有管理层提供安全和保障,或者说是为这些应用的各个方面提供了更多的保障。我们现在正在对此进行实验,如子系统组成或分层以纳入管理、代理及硬件驱动程序等。我们使用Raspberry Pi,并将于近期发布一些样例和用例。

   

7. 你提到系统建模使用Erlang进程或者说Actor,通过它们可以控制设备,实际上是通过C与设备通讯,从某种方式来说其本质就是设备驱动,或是设备驱动的表现形式?

是的,我们使用的那点C代码只是用于进行底层寄存器操作或与内核模块的通讯,仅此而已。而它的业务流程或着说实际的感知逻辑是用Erlang编写的,所以对于这些设备你完全用不着编写C代码。而来自Raspberry Pi的例子就是GPIO模块,如果你是用过GPIO内核模块,你会发现它是由sysfs控制的,sysfs实际上是Linux的/sys下可写的虚拟文件。所以我编写了个完整的Erlang模块来控制GPIO的引脚,估计将是我们架构中的第一层或者最底层,在此基础之上,我写了个小的代理单元来避免某些危险操作,比如当别的进程写入的时候释放了引脚。

我们建立了这个代理的原因是,并发的硬件访问存在潜在的风险。我猜大家会争论,这只是替换了嵌入式系统的传统设计中的锁,但实际上又不完全,因为你能做的比建立互斥架构多得多,互斥的特性需要用到这些。我正在研究的另一个有意思的东西,这里要强调安全是嵌入式系统设计的非常重要的方面,我们正在研究能否在这些代理内部实现特定的检查,比如检测引脚的切换率,如果超过某个特定的范围,那么我们就认为它存在危险,然后要么降低切换率或产生能被监控处理的错误条件等,要么重新确定时序。可能你不想用I2C协议发出特定的字节序列或数据到外部节点上,所以它们要能够聪明进行互斥和安全监控。

   

8. 我发现这很有意思,因为你所构建的就像是微内核操作系统,并与这些管理程序架构捆绑在一起,这使得它灵活性很好,从某种方式上来说这相当于微内核的想法重现生机,你能谈谈这个问题吗?

从某种方式来说,是的,Erlang在我们眼中,并不只是一种编程语言,我们将它视为系统语言,你是对的,它和微内核的架构有些相似。另外我不得不说的是,在嵌入式系统中,一般需要一个实时操作系统,因为它能够为你提供某种任务结构和通讯命令等。但是当设计RTOS(实时操作系统)的人转投Linux阵营的时候,这些理念却没有体现在Linux系统中,我的意思是,你当然可以使用操作系统的线程等等,但是你必须用某种语言编写并将它们捆绑在一起。我觉得有趣的是,在RTOS领域和Erlang领域中,有个差不多或完全一样的映射,任务相当于Erlang的进程,而消息都是内建在系统中的,你无需再去创建自由的消息架构等东西,目前我们在Erlang中用到的模型真的很棒,因为我们正在研究的映射硬件中断并创建终端服务路由等内容,都需要并发运行。

目前比较有些比较明显的状况,算是问题吧,就是同步机制等内容需要你自行实现,但其实这些都非常简单。所以问题的答案就是,是的,我们几乎将Erlang作为一个迷你操作系统在使用着,而且,它还是用于构成这些复杂设备的系统语言。

   

9. 你提到Raspberry Pi这个词,你都在Raspberry Pi上做了些什么呢,你这是打算让小屁孩用Erlang做开发吗?

为什么不呢?Raspberry Pi是个令人兴奋的平台,说它令人兴奋有很多原因,我认为关键是将玩微型电脑的喜悦带回了我们的生活。它是个非常廉价而且非常普及的平台,还有个伟大的开发社区,他们促进了嵌入式Linux领域及其计算、编程的发展。我们所看到的是,它在儿童、年轻人中非常流行,并为未来潜在的黑客、程序员和架构师等打下了基础,因此,我们致力于开发一些材料,以使年轻人投入其中,对并发、并行以及使用Erlang进行函数式编程进行探索,为了支持这方面的工作,我们为Raspberry Pi开发了相关材料,包括完成小型实验的演示版硬件。

我们将会与教师们和Raspberry Pi基金会进行沟通,看看能否将这些内容加入课程中,虽然并发和并行是我们正在解决的问题,但是这些问题更关系到我们的未来。当年轻人们继续他们的学业或是讨论工作的时候,如果他们对这些概念和函数时编程很熟悉,那就再好不过了。我们同时在教育和宣传工作中将它作为参考平台,因为就像我所说的,它将成为一个普及的平台,而且有个非常积极的社区在进行着相关工作,大众将会被它所吸引,并享受它所带来的乐趣。

再次重申,我们想为人们展示的是,使用这种有趣的新语言在Pi上进行并发编程相当容易,这种语言或许能在实际的项目中避免你头疼甚至掉头发。我们的博客是http://erlang-embedded.com/,在这你能找到更多这方面的信息。我们非常高兴,因为已完成了Raspberry Pi上的一个难以置信的项目,我们将会看到更多这方面的项目出现,所以希望大家成为社区的成员,支持那些正在开发酷炫应用的人们,我们很高兴你成为其中的一份子。

   

10. 如果我还是淘气包的话,我肯定会爱上Raspberry Pi上的Erlang,这太棒了。

现在已经能够在你的Raspberry Pi上运行Erlang了,我们已经提供编译好的Raspbian包,很快就会发布硬件抽象库,这样你就能够控制所有外围设备,通过Erlang内部的GPIO、PWM、I2C协议以及外围设备进行控制,我们正在尝试建立Erlang或适用于Erlang领域的模型,同样会用这些外围设备。就像我刚刚说的,我们将中断映射为Erlang进程消息或实例的Erlang消息,这样你就不用轮询中断引脚或类似的东西了,当中断条件发生时,将会收到返回的消息,然后就能够使用中断服务路由(Interrupt Service Routine)进行处理了。

我们已经在这方面工作了一段时间,目前快完成了,我们很乐意看到有人用它创建出又酷又有趣的应用。但需要说明的是,这不是为了炫酷,如果你想加入黑客社区,显然就需要这样的东西,但是同时,我们深信它们对商业应用非常有帮助,也同样适合处理现代片上系统设备的复杂问题。有时候我会听到有人说:“你写了一些能使LED闪烁的功能代码”,是的,但是我们所讨论的内容完全适用于处理更多更复杂的挑战。一旦你能使LED闪烁,之后你就能应对这样的挑战:多个传感器、不同的总线、同样的处理架构、明显不同的功能——这是因为你能够设计系统的架构,因为你知道了进程如何工作,消息如何传递等等。

上面这些只是举了些有意思的小案例,让大家了解Erlang的能力,希望大家能够采用并应用到实际的商业应用中去。

Werner:我想我们有足够的理由去期待它,不论是为您还是您的孩子,希望每一位读者都能购买一部Raspberry Pi、4或者5,另外,十分感谢您接受采访! Omer:也谢谢你。

你可能感兴趣的:(Erlang的Actor模型在嵌入式系统中的应用及运行在Raspberry Pi上的Erlang)