注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

Carmanah 用 Python 照亮未来

引言

这是一个关于 Python 优雅的设计如何以意想不到的方式使该语言变得有用的故事。

Carmanah Technologies Inc. (http://www.carmanah.com/) 的构想源于太平洋中部。创始人 David Green 当时正驾驶他的船从斐济驶往不列颠哥伦比亚省维多利亚,他的航行灯电池电量不足,突然灵光一闪。

这个大洋中部的想法最终催生了世界上第一个自给自足、完全自主的船舶航行灯。白天,每个设备都利用太阳能为其集成电池充电。晚上,灯光则依靠储存的电量运行。Carmanah 的系统采用持久耐用、高效的 LED 取代了传统灯泡。总而言之,这是一款异常坚固的设备,可以抵御恶劣天气,无需维护。

有时,失落的 Carmanah 灯会随洋流漂流数千英里,但后来被找回时仍能正常工作。这种可靠性使它们在水道管理机构、水手和各国海岸警卫队中声名鹊起。

源于恶劣海洋环境的技术已在许多其他领域证明有用,如今 Carmanah 是太阳能 LED 照明领域的全球领导者。该公司生产一系列用于各种不同用途的灯具,包括交通、道路、铁路、工业标志和机场照明以及最初的海洋应用。这些灯具销往世界各地,并且必须经常承受极端条件(公海、沙漠气候、遥远的北方、城市破坏者等)。Carmanah 的灯具甚至成为国家电视台一部纪录片的主题。

Closeup of one crosswalk traffic beacon.

Carmanah 人行横道交通信号灯特写,这是 Python 在其中发挥重要作用的近期产品。杆顶部的外壳朝向太阳,以更好地暴露其正面的太阳能电池板。无线连接到街道另一侧类似单元的天线在外壳的左侧可见。 放大

电照明已变得如此普遍,它似乎是一个简单的想法。然而,一个自主、自给自足的灯具实际上是一个复杂的事物。可用太阳辐射量随天气、季节、地球上的位置以及太阳能电池板的方向而变化。必须仔细管理电池充电状态,以确保长寿命和正确运行。必须监测可用电量,并可能在夜间进行配给。

根据应用,灯光可能还需要可编程以发出国际公认的闪光代码、响应用户输入等。在更复杂的情况下,需要无线网络以允许灯光相互通信,或与中央基站通信。

要制造这些灯具,需要大量的机械、电气、电子和光学设计。与现代复杂设备一样,运行在微控制器上的嵌入式软件程序操作每个单元,使其栩栩如生。就像《2001:太空漫游》中的微型巨石一样,每个灯具都自我维护,随时准备在需要时执行其功能。

实用计算的未来

当前的实用计算机应用主要由 PC 主导。然而,就像之前的巨型机一样,PC 将在计算机技术的使用和部署中失去其中心地位。嵌入式系统——作为其他设备一部分的计算机——将在未来最普遍。

巨型机如今远未过时,PC 也将同样保持重要性。然而,大多数计算机将被整合到其他东西中,而不是独立存在。这个过程已经开始。汽车采用多个嵌入式系统,其中一些系统相互通信。嵌入式系统还操作许多家用电器。此类系统在工业中也同样非常重要,它们构成了许多仪器和工具的关键要素。

未来嵌入式系统扩展的催化剂是网络技术的快速发展。随着硬件变得更便宜、更小、更快、更高效地利用电力,嵌入式设备网络将激增和增长。此类设备——相互协作——将控制家庭、办公室和工业设施。这个新的计算世界正在进行准备,剑桥-麻省理工学院的《普及计算》倡议(参见http://oxygen.lcs.mit.edu/)就证明了这一点。该倡议也曾被 BBC 报道(参见http://news.bbc.co.uk/1/hi/technology/3583479.stm)。

普及计算的出现将使每个系统都必须非常低维护。当每个用户需要数百个设备时,定期维护它们根本不可行。当然,完全自给自足、自行管理电力的系统将是理想的,因为如果需要大规模进行,更换电池或连接电线是一项严峻的挑战。因此,微型巨石变成了蜂群。

Python 的重要性

大规模部署嵌入式系统需要廉价组件。小尺寸、高可靠性和低功耗等因素也非常重要。为了实现这些目标,开发了专用处理器芯片,称为微控制器。现代微控制器将 CPU、内存和外设(如 UART)集成在单个芯片上,是令人惊叹的设备。然而,这些特性伴随着高昂的代价。典型的微控制器只有几百字节的 RAM,几 K 的 ROM(用于存储程序),其处理能力比传统的桌面微处理器低几个数量级。这几乎不是运行 Python 的环境!

虽然有一些项目致力于将 Python 适配到嵌入式应用中,但它们需要微控制器上的大量资源,并且仍处于早期阶段。然而,令人惊讶的是,事实证明,标准 Python 在嵌入式系统的整个生命周期中都具有巨大的价值。这是因为嵌入式设备资源高度受限的特性使得它们在许多任务上都依赖于标准 PC——无论是在开发期间还是部署期间。

例如,嵌入式软件在传统的桌面系统上编译,然后将生成的对象代码加载到目标微控制器上。另一个例子是在现场对设备进行故障排除,这通常需要额外的硬件来运行诊断工具。普通笔记本电脑是这种应用非常有吸引力的平台,因为它们易于获得且标准化程度相对较高。

因此,任何嵌入式软件开发工作的主要部分是编写必要的支持代码,以在标准 PC 上运行。有相当多的语言可用于此任务,但 Python 的优势众多。Python 很容易被来自各种编程背景(如 Java、C 或 Visual Basic)的人学习。熟悉 Python 后,开发进展非常快——可能比任何其他语言都快。同时,Python 有助于创建高度可读、紧凑且结构良好的代码。

Python 特有的功能组合也帮助嵌入式开发人员在 PC 编程时更有效率。虽然这些开发人员非常熟悉 C 语言(到目前为止,C 语言是嵌入式系统最流行的高级语言),但为标准桌面或服务器编写的 C 程序与为微控制器编写的程序在风格上截然不同。

Python 程序的紧凑性尤为重要,因为嵌入式开发人员出于必要性,已经学会用非常少量的代码表达他们的设计。Python 的自动化内存管理也有帮助,因为许多嵌入式开发人员对动态内存分配经验不足——这种技术在大多数嵌入式环境中并不实用。此外,Python 的面向对象功能简单、强大但又不强制。这使得嵌入式开发人员(他们通常对 OOP 不太熟悉)可以在工作中逐渐采用面向对象范式。

随着嵌入式系统复杂性的增长,使用 Python 增强传统技术的好处变得越来越重要。在 Carmanah,Python 的采用(始于人行横道交通信号灯,这是一种包含无线网络的复杂设备)已扩展到嵌入式系统生命周期的几个关键领域。

一个 Python 程序控制着软件构建过程,允许将不同产品的固件从大量共享组件中组合起来。构建系统简单但比 makefile 灵活得多,并且更容易定制、配置和扩展。与编译器供应商提供的构建工具不同,基于 Python 的构建系统可以与不同的编译器配合使用。

Python 还用于压力测试和单元测试——这是开发中特别重要的一个方面,尤其是在嵌入式系统中,因为设备一旦投入使用就很难升级。Python 的其他用途,例如用于控制面板和代码生成,也在考虑之中。

Python 在 Carmanah 的一个非常激动人心的应用是作为设备模拟器。模拟器可以充当嵌入式网络中的一个节点,同时通过屏幕上的动画图像显示内部系统状态。在嵌入式项目早期阶段,当实际硬件很少可用时,模拟器非常有价值。通过取代缺失的设备,模拟器甚至可以在硬件设计完成之前继续进行软件开发。

Prototype of Carmanah's crosswalk traffic beacon attached to a device simulator written in Python.

这是 Python 在嵌入式开发中实用性的一个示例。Carmanah 人行横道交通信号灯的原型与运行在普通 PC 上的基于 Python 的模拟器进行交互。模拟器有效地完成了系统,因为在人行横道安装中需要两个交通信号灯(街道两侧各一个)。除了显著加速开发之外,基于 Python 的模拟器还可以轻松地制作动画图纸,如图所示。这使得系统演示能够比否则更早地进行有意义的演示。 放大

在 Carmanah,Python 不仅被经验丰富的工程师使用,也被学生实习生使用。即使是编程经验很少的实习生,也能用 Python 完成很多工作,而且所需的监督也比其他语言少。

结论

在 Carmanah,创造自给自足、自主设备的激动人心的工作仍在继续。随着微型巨石蜂群变为现实,嵌入式软件的重要性和复杂性也随之增长。通过使此类软件的开发、测试、控制和部署变得更加容易,Python 确实正在照亮计算的未来。

关于作者

George Belotsky 是一位软件架构师,在高性能互联网服务器以及硬实时和嵌入式系统方面做了大量工作。他的技术兴趣包括 C++、Python 和 Linux。George Belotsky 撰写了多篇文章(参见 http://www.oreillynet.com/pub/au/1204 ),包括关于 Python 和网络 I/O 的系列文章。他还是 Flightdeck-UI 开源项目( http://openlight.com/fdui/ )的作者。您可以通过电子邮件 questions at openlight.com 与他联系。

Thomas Major 是 Carmanah 的产品开发经理,他是一名电气工程师,拥有在 Visteon 和 Philips Electronics 积累的丰富产品设计经验。他的兴趣始于模拟电路设计,后来涵盖了数字、软件和嵌入式设计。