当谈到嵌入式开发时,您通常首先查看您在硬件级别尝试做什么。例如,如果您需要读取某种传感器并将公式应用于其值,以便您可以在某处显示结果,您可以查看哪些微控制器带有模数转换器 (ADC),并且还可以驱动一个显示器。适合您目的的微控制器越小,它就越便宜。当然,微控制器越小,在可编程性方面就越有限。因此,对于非常小的设备,您可能需要求助于汇编编程,如果您以后决定切换平台,这可能会损害可移植性。一般来说,您应该选择适合您目的的小型但不是最小的平台。您应该考虑未来扩展或增加要求的可能性,因此在硬件级别留出一些空间通常是个好主意。
当您的用例允许使用更大的微控制器时,通常是编程语言 C。通过使用 C 而不是汇编,您可以获得两个关键要素:可移植性和易用性(包括可读性和可维护性)。 C 被设计为“便携式程序集”,因此它几乎是所有小型微控制器(极小的微控制器除外)的理想语言。随着您在规模和功能的阶梯上攀升,有更多的选项:C++、操作系统(FreeRTOS、NuttX 等),甚至是以太网和 WiFi 等高级连接。除了这些选项,更多的编程语言开始变得可用。某些语言由于其语义,无法提前编译为机器代码。这些语言中有 JAVAScript。所以我们需要问自己的第一件事是“JavaScript 引擎能否在我们平台的约束下运行?”正如我们将在下面看到的,答案是肯定的。
与汇编、C 或 C++ 相比,高级语言的最大好处在于它们的安全性。一个不匹配的错误通常会导致 macOS 计算机出现分段错误,但在微控制器中,进行嵌入式开发时,它可能会导致系统级崩溃或死机。调试也受到更多限制,因此任何有助于编写安全代码的东西都会有所帮助,从这个意义上说,高级语言非常有用。
另一个好处与代码在微控制器中的运行方式有关。通常,微控制器从 ROM 中读取机器代码。 ROM通常是通过特殊的程序编写的,因此更改它并不方便。这限制了进行代码更新或在程序版本之间轻松迭代的选项。解释器可以从 RAM 或 ROM 中读取其程序,从而可以在不刷新的情况下进行代码更新。当然,这有其自身的权衡:重新启动后 RAM 会被擦除,因此每次都需要重新加载程序。 RAM 也非常有限,因此程序必须很小。高级语言的表达性在这方面有很大帮助:只需很少的代码行,就可以表达复杂的行为和逻辑。
这些好处适用于大多数高级、解释或 JITted 语言,但 JavaScript 带来了一些自身的好处。对于初学者来说,JavaScript 拥有一个拥有大量库的庞大社区。这些库中的大多数不能在微控制器上运行,因为它们需要系统级支持(来自 Node.js 或浏览器),但其中一些可以,这非常有用。由于语法相似,C 和 C++ 程序员很容易掌握 JavaScript,因此习惯于嵌入式开发人员在阅读 JavaScript 代码库时不会遇到什么麻烦。此外,如果您还记得介绍,我们提到 JavaScript 旨在为常见的自动化任务和快速迭代编写小脚本。微控制器通常用于同一场景!与硬件设备交互的小块逻辑,用于自动化或报告任务。
因此,总而言之,以下是考虑将 JavaScript 或其他流行的解释语言用于微控制器编程的原因:
更高级别的附加安全性:没有一次次碰撞; 更好地处理错误、复杂数据类型和类型转换; 更具表现力。
快速迭代:可以从RAM加载脚本,每次测试都不需要刷机。 远程更新是可能的。
巨大的社区和大量的库(其中大部分需要一些调整才能在嵌入式开发平台上运行):捆绑器和压缩器可用于确保尽可能小的代码;为 C、C++(和 Java)开发人员提供熟悉的语法。