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