近年来,消费、医疗、农业、工业以及其他领域对物联网(IoT)连接的需求不断增长,产品开发咨询公司42 Technology表示,制造商希望为最终用户带来与众不同的产品,因此想利用物联网连接来添加功能,或为基于服务的产品生成新的数据流。
IoT连接中的硬件包括电池供电的便携式小型设备,其中很多都采用Arm Cortex-M系列嵌入式处理器,例如Nordic Semiconductor的nRF9160 SiP核心采用了M33处理器。
到目前为止,开发人员仅能够使用C++或C++语言对这类Cortex-M器件进行编程。现在42 Technology提出了第三种选择,即Rust编程语言,为开发人员带来许多有用的新功能。
充分利用资源
Rust编程语言必须在高性能和能有效使用资源的平台和环境下使用,它还引入了一些功能来帮助开发人员提高效率并生成更安全的代码。例如,Rust提供了称为Cargo的软件包管理器,就像Python的pip或Node的npm一样,可以让开发人员从中央存储库中提取开源软件包,在其项目中轻松使用。
Rust的另一项独特功能是“借阅检查器”,它是编译器的一部分。在编译期间,该工具能够检查代码,以确保两段代码不会同时访问同一数据(这是未定义的行为)。换句话说,如果一个函数被调用了,开发人员需要指定这次调用是临时(专有的或作为共享借入)“借入”该数值,或取得该数值的所有权。
这款语言具有安全性、高速度和高生产力。根据42 Technology报道,微软、Dropbox、Facebook、谷歌、Cloudflare等公司都已成功将Rust语言应用于新项目,包括用于云基础架构,谷歌还将其用于下一代移动操作系统Fuchsia中。
在Rust嵌入式工作组的大力推动下,Rust已经发展到“1.0”版本,可支持许多嵌入式平台,越来越多的企业也利用同样的技术优势来支持小尺寸低功耗系统,例如Nordic的nRF52和nRF53系列短距无线SoC,以及nRF9160低功耗蜂窝物联网SiP。
Rust的套接字
nRF9160开发人员可以直接或通过Zephyr使用Nordic Socket API,这个API严格遵循标准Berkeley套接字API(有如在Linux和Windows中使用)。但它也有一些缺点,例如套接字和套接字家族都使用“int”类型,如果开发人员将它们混淆,编译器将不能工作。另外,开发人员必须记住在套接字中调用“nrf_close”,因为如果变量超出范围,套接字将出现泄漏,从而在运行时难以调试。
为了使Rust开发人员能够很好地利用这一功能强大且经过良好测试的程序库,同时帮助他们避免意想不到的错误,42 Technology针对Nordic套接字库开发了Rust包装器。Rust包装器使用高级别并且分类严谨的对象,例如“TcpSocket”和“AtSocket”,它们在超出范围时会自动关闭,并允许开发人员发送格式化数据(图1)。
图1:针对Nordic套接字库建立的Rust包装器使用分类严谨的对象,例如“TcpSocket”和“AtSocket”,当它们超出范围时会自动关闭,并允许开发人员发送格式化数据。
这种方法非常有效,42 Technology表示可以使用Cloudflare的新Rust语言QUIC库进行开发,直接在nRF9160上运行世界上首个QUIC(即将发布的HTTP/3标准的一部分)示例。
Rust + Zephyr
Rust的另一个优点是可以与Zephyr RTOS混合使用。Rust库可以编译为标准的C静态库,从而与所有开发人员现有的C和C++项目关联。某些项目甚至只需一次替换一个函数,就可以从C语言转换为Rust语言。例如,使用SVG库,其中的库具有相同的API但在内部运行得更快、更安全。
Rust编程语言旨在提高性能、安全性和开发人员生产力,适合不同规模的项目——从超大规模云基础设施到最小的Cortex-M微控制器。此外,由于它可以编译为标准目标码文件,因此开发人员可以充分利用其所有优点,同时仍然将其集成到现有的C和C++项目中。