當(dāng)談到嵌入式開發(fā)時(shí),您通常首先查看您在硬件級(jí)別嘗試做什么。例如,如果您需要讀取某種傳感器并將公式應(yīng)用于其值,以便您可以在某處顯示結(jié)果,您可以查看哪些微控制器帶有模數(shù)轉(zhuǎn)換器 (ADC),并且還可以驅(qū)動(dòng)一個(gè)顯示器。適合您目的的微控制器越小,它就越便宜。當(dāng)然,微控制器越小,在可編程性方面就越有限。因此,對(duì)于非常小的設(shè)備,您可能需要求助于匯編編程,如果您以后決定切換平臺(tái),這可能會(huì)損害可移植性。一般來說,您應(yīng)該選擇適合您目的的小型但不是最小的平臺(tái)。您應(yīng)該考慮未來擴(kuò)展或增加要求的可能性,因此在硬件級(jí)別留出一些空間通常是個(gè)好主意。
當(dāng)您的用例允許使用更大的微控制器時(shí),通常是編程語言 C。通過使用 C 而不是匯編,您可以獲得兩個(gè)關(guān)鍵要素:可移植性和易用性(包括可讀性和可維護(hù)性)。 C 被設(shè)計(jì)為“便攜式程序集”,因此它幾乎是所有小型微控制器(極小的微控制器除外)的理想語言。隨著您在規(guī)模和功能的階梯上攀升,有更多的選項(xiàng):C++、操作系統(tǒng)(FreeRTOS、NuttX 等),甚至是以太網(wǎng)和 WiFi 等高級(jí)連接。除了這些選項(xiàng),更多的編程語言開始變得可用。某些語言由于其語義,無法提前編譯為機(jī)器代碼。這些語言中有 JavaScript。所以我們需要問自己的第一件事是“JavaScript 引擎能否在我們平臺(tái)的約束下運(yùn)行?”正如我們將在下面看到的,答案是肯定的。
與匯編、C 或 C++ 相比,高級(jí)語言的最大好處在于它們的安全性。一個(gè)不匹配的錯(cuò)誤通常會(huì)導(dǎo)致 macOS 計(jì)算機(jī)出現(xiàn)分段錯(cuò)誤,但在微控制器中,進(jìn)行嵌入式開發(fā)時(shí),它可能會(huì)導(dǎo)致系統(tǒng)級(jí)崩潰或死機(jī)。調(diào)試也受到更多限制,因此任何有助于編寫安全代碼的東西都會(huì)有所幫助,從這個(gè)意義上說,高級(jí)語言非常有用。
另一個(gè)好處與代碼在微控制器中的運(yùn)行方式有關(guān)。通常,微控制器從 ROM 中讀取機(jī)器代碼。 ROM通常是通過特殊的程序編寫的,因此更改它并不方便。這限制了進(jìn)行代碼更新或在程序版本之間輕松迭代的選項(xiàng)。解釋器可以從 RAM 或 ROM 中讀取其程序,從而可以在不刷新的情況下進(jìn)行代碼更新。當(dāng)然,這有其自身的權(quán)衡:重新啟動(dòng)后 RAM 會(huì)被擦除,因此每次都需要重新加載程序。 RAM 也非常有限,因此程序必須很小。高級(jí)語言的表達(dá)性在這方面有很大幫助:只需很少的代碼行,就可以表達(dá)復(fù)雜的行為和邏輯。
這些好處適用于大多數(shù)高級(jí)、解釋或 JITted 語言,但 JavaScript 帶來了一些自身的好處。對(duì)于初學(xué)者來說,JavaScript 擁有一個(gè)擁有大量庫的龐大社區(qū)。這些庫中的大多數(shù)不能在微控制器上運(yùn)行,因?yàn)樗鼈冃枰到y(tǒng)級(jí)支持(來自 Node.js 或?yàn)g覽器),但其中一些可以,這非常有用。由于語法相似,C 和 C++ 程序員很容易掌握 JavaScript,因此習(xí)慣于嵌入式開發(fā)人員在閱讀 JavaScript 代碼庫時(shí)不會(huì)遇到什么麻煩。此外,如果您還記得介紹,我們提到 JavaScript 旨在為常見的自動(dòng)化任務(wù)和快速迭代編寫小腳本。微控制器通常用于同一場景!與硬件設(shè)備交互的小塊邏輯,用于自動(dòng)化或報(bào)告任務(wù)。
因此,總而言之,以下是考慮將 JavaScript 或其他流行的解釋語言用于微控制器編程的原因:
更高級(jí)別的附加安全性:沒有一次次碰撞; 更好地處理錯(cuò)誤、復(fù)雜數(shù)據(jù)類型和類型轉(zhuǎn)換; 更具表現(xiàn)力。
快速迭代:可以從RAM加載腳本,每次測試都不需要刷機(jī)。 遠(yuǎn)程更新是可能的。
巨大的社區(qū)和大量的庫(其中大部分需要一些調(diào)整才能在嵌入式開發(fā)平臺(tái)上運(yùn)行):捆綁器和壓縮器可用于確保盡可能小的代碼;為 C、C++(和 Java)開發(fā)人員提供熟悉的語法。