本文是《[Arduino] Develop Library with Arduino eclipse plugin》的中文版本,并增加一點本土內容。之所以先寫英文的,是因為寫作過程中,需要和插件作者保持溝通,還請各位見諒。
eclipse.baeyens.it 開發中的 Arduino Eclipse 插件,能快速將eclipse打造為Arduino的開發平臺。從目前的經驗看來,開發的部分基本能實現完全的替代。雖然少了串口助手的部分,但平心而論,ADE(Arduino “官方”標準開發環境)的串口助手是很弱的。因為只能傳遞可見字符數據,沒法任意發送0-255的單字節數據。所以這個集成的Serial Monitor還是比較雞肋的。所以用自己喜歡而且順手的就是,并不要緊。使用 Arduino Eclipse 插件,在 eclipse 上進行開發的Arduino程序,同樣能方便地移植到 ADE 上,在開源社區分享,也沒有問題。而開發效率、編譯速度、下載速度,都將大幅提升,爽得一塌糊涂。
在這款插件出現之前,Eclipse 就已經可以用來作 Arduino 的IDE了,但配置過程相當崩潰,有插件就爽了很多,能輕松實現平臺搭建。
本文結合Arduino eclipse Plugin 英文向導 and Arduino playground 的 LibraryTutorial 做一個使用eclipse開發Arduino類庫的分步驟教程。建議先查閱一下這2處的內容,這樣看下文會輕松很多。
1. 安裝 Eclipse 及 Arduino 插件
插件官方安裝向導 ,英文很簡單,E文不太熟悉的朋友,配合字典就能搞定。我的經驗就是,安裝帶有CDT(C/C++ Development Kit)的eclipse就是了。如果之前已經在用 eclipse 進行 Java、Ruby或其它開發的朋友,并不需要重新下載,直接安裝CDT插件就是了,畢竟Arduino用的是C++。使用 Arduino 插件進行開發,并不需要提前安裝 AVR 插件,感覺是已經被Arduino插件集成了,所以安裝配置就更簡單許多。
之前根據網絡上的各類資料,重新編輯過一篇安裝 Eclipse 3.7 Indigo 學習 Java 的blog,里面提到了漢化如何進行,有興趣的朋友不妨去看看,在那個基礎上,安裝CDT,插件,就能直接用來開發Arduino了。那個時候剛剛接觸 eclipse,用起來小心翼翼,現在就放開了許多,都敢碰了,呵呵。
不過一個eclipse里面一下運行太多插件,對速度還是有影響的,為Arduino開發,我另外整理了一個較為“純凈”的eclipse: Eclipse 3.7 Indigo + CDT + Arduino Plugin + Subclipse
Eclipse是綠色軟件,復制一份原始的安裝包就好了。其中 Subclipse 用于版本控制以及在 Google code 進行代碼托管,非常方便。
2. 從一個 Sketch 開始
在安裝及配置好 Arduino Eclipse 插件之后
1) 新建一個工作空間,例如, “H:\workspace\myArduinoLibs”.
2) 新建一個sketch, 例如, “MorseTest”
在項目管理器窗口/工作空間目錄下。會出現2個文件夾。其中一個所選用的Arduino平臺型號命名,作為 Arduino Core,里面大致的內容就是與該板參數相匹配的Arduino核心庫。每次使用一個新的工作空間,這個Arduino Core文件夾都會被新建。但如果再次基礎上,添加一個基于同樣 Arduino 平臺的 Sketch 時,不會重復新建 core 文件夾,它為自動在工作空間內共享(當然,如果不是很有把握,最好也別去改它)。如果后來在同一工作空間下,使用不同的 Arduino 平臺開發,將會新建一個新平臺的Core文件夾。
3) 構建 Core(不過并不必要):點擊 Core 文件夾, “Arduino_UNO”,后點擊工具欄的小錘子圖標。
4) 構建 sketch,點擊 Sketch文件夾, “MorseTest”,后點擊工具欄的小錘子圖標。如果跳過了剛才的第3步,那么此刻編譯器也會先構建 Core,再構建 Sketch。注:構建,Build,Make,就是編譯、鏈接的意思。如果光點擊程序文件,可能構建不出什么東西,還是要選擇工程文件夾,再進行構建。因為一次構建構建的是整個Project.
如果插件安裝正確的話,此處的構建,應該沒什么問題,也就是說編譯、鏈接都應該沒問題,畢竟現在什么代碼都沒輸入進去么。
不過值得注意的是,在使用目前的 Arduino Core 的過程中,可能會出現編譯后帶有警告的情況。這些或許是ADE內部自動隱藏或是降低了警告級別造成的。不必擔心,程序一般情況下依然是可以運行的。相信隨著 Arduino 底層庫的不斷完善,這些警告都會慢慢消失的。在我個人的實踐中,基本都要加上 “extern HardwareSerial Serial;” 這句聲明,才能正常使用串口對象,感覺內建的Serial實例,是以類似全局變量的形式保存, 而在調用的時候,是要聲明一下。但是在ADE中插入這句聲明,也不會影響編譯。所以,就放心地加進去咯。至少從ANSI的標準來看,代碼是規范了不少。
5) 建議此時,可以通過點擊工具欄的“AVR”按鈕,將這個空的 Sketch 下載(中文習慣都是說“下載”,就像“XX下載器”,而英文版本里面偏偏都是用上傳“Upload”,比較無語)到Arduino的板子上,測試連接通訊是否正常。這里,可以理解為和 ADE 一樣,編譯和下載是分開的。但是ADE里面,下載還包含了編譯,而且編譯得很慢。Eclipse里面,這兩個步驟是完全獨立的,所以,一次次點擊“下載”,可能下載的都是老文件,如果忘記重新編譯的話。新手要注意這一點。
6) 將 librayTutorial 里的代碼拷貝至 “MorseTest.cpp”. 頭文件 “MorseTest.h”就不用去動它了,不需要對其進行任何編輯。
// Do not remove the include below #include "MorseTest.h" void dot(); void dash(); int pin = 13; //The setup function is called once at startup of the sketch void setup() { // Add your initialization code here pinMode(pin, OUTPUT); } // The loop function is called in an endless loop void loop() { //Add your repeated code here dot(); dot(); dot(); dash(); dash(); dash(); dot(); dot(); dot(); delay(3000); } void dot() { digitalWrite(pin, HIGH); delay(250); digitalWrite(pin, LOW); delay(250); } void dash() { digitalWrite(pin, HIGH); delay(1000); digitalWrite(pin, LOW); delay(250); }
此處較例程添加了 dot() 和 dash() 的聲明,相信有C/C++編程經驗的朋友都知道是為什么。因為這2個函數,都放置在 loop() 函數后,而Eclipse里面的GNU/GCC編譯器是對于規范要求比較嚴格的,要么放在loop()之前,要么加聲明,否則就是無法編譯通過。ADE則相對寬松一些,感覺怎么寫都行,ADE優化過的編譯器會自動彌補這些問題,讓規則顯得更加寬松。但作為嚴謹的 C/C++ 開發人員來說,遵守嚴謹的規則,對于保證程序正確運行、排錯,是相當重要的,而且一般都比較都已經是習慣了。同樣,在ADE中添加聲明,也同樣不會影響到編譯。
現在就可以開始體驗到 Eclipse 的強悍之處了:
- “Tab” 鍵可以正常反應了,ADE中竟然直接用2個空格替代,真是要吐槽一下。而且 Shift+Tab 也能用了,調整縮進爽很多。
- 各種代碼高亮
- Ctrl+Shift+F 進行自動排版。排版的樣式,可以在 Preferences -> C/C++ -> Formatter 里面自定義,我個人當然是喜歡花括號獨占一行而且對其的樣式~
- Alt+/ 進行自動補齊,默認情況下,按“.”也會有完整的提示框彈出。有VS使用經驗的人,一定非常依賴這個功能,:)
- 實時的錯誤及警告提示,有的時候倒也不必驚慌,或許重新Make一下,就消失了
- Ctrl+左鍵單擊,查看引用,這個是我的最愛,查看Arduino庫變得非常輕松,終于不用幾個文檔翻來倒去了。
這幾條一說,基本都想把ADE扔一邊了吧~ 那還不趕緊試一下~
7) 構建并下載,都沒錯的話,應該可以看到Arduino上Pin13的LED開始發出“三短三長三短”的SOS信號了。
4. 從 POP 面向過程 到 OOP 面向對象
1) 在 Sketch 項目內為 類庫 library 新建一個文件夾,本例中,命名為“Morse”
2) 在這個 類庫文件夾 中新建一個類,
會同時建立2個文件,.h的頭文件,和.cpp的源文件。什么代碼都還沒寫,eclipse 已經把構造函數,析構函數的框架都搭起來了。
3) 在類頭文件“Morse.h”中,包含引用 “Arduino.h”
除非是建一個純C++的類,或者是應用邏輯層的類,否則如果涉及到 Arduino 的底層硬件操作,一般也就是引用“Arduino.h”這個頭文件就好了,對于IO設置,位運算都有現成的函數可用。而且作為一個Arduino的 sketch,不管怎么樣都會包含這個頭文件的,類庫中就包含一下,也不會對最終sketch的文件大小會有什么影響。而且一個“Arduino.h”似 乎就包含了所有可能會用到 Arduino 函數庫,很方便。寫類,自然還是要學習一下C++的編程(學C++和學VC是2個概念)。不過大體上,可以想象成在寫一個沒有setup()和 loop()的sketch。
4) 寫類
如 librayTutorial所示, Morse.h:
#ifndef MORSE_H_ #define MORSE_H_ #include "Arduino.h" class Morse { public: Morse(int pin); virtual ~Morse(); void dot(); void dash(); private: int _pin; }; #endif
Morse.cpp:
|
例程里的代碼,和Eclipse的代碼的主要不同之處,在于在eclipse這邊過了一個虛析構函數。這在C++程序里面是非常常見的,讓類可以繼續得到繼承,是規范的寫法。相信雖然ADE的這個例程沒這個東西,但是也會欣然接受這種讓類定義更加完整的做法。
這樣,一個最簡單的Morse類庫就寫好了。使用面向對象編程新建類,不單單可以用在編寫類庫,更應該用在進行應用類,或者說實現中間層邏輯類的開發,也 同樣適用。這樣,就能把傳統的面向過程的編程,轉變為面向對象的編程。對于玩嵌入式底層開發的朋友來說,可能會感覺這樣損失了執行效率,還增加了程序的大 小。但是對于大多數用Arduino玩應用的朋友來講,我相信還是會舍得這些硬件開銷。仁者見仁智者見智。
5) 調用類
回到Sketch, “MorseTest.cpp”。因為大部分的功能代碼已經轉移(更專業的叫法,就是“封裝”)到類中。所以主代碼就立馬變得整潔美觀了。記得在頭部,對類進行引用,#include “Morse.h”
// Do not remove the include below
#include "MorseTest.h"
#include "Morse.h" // The header of the class just created
Morse morse(13);
//The setup function is called once at startup of the sketch
void setup()
{
// Add your initialization code here
}
// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
morse.dot(); morse.dot(); morse.dot();
morse.dash(); morse.dash(); morse.dash();
morse.dot(); morse.dot(); morse.dot();
delay(3000);
}
6) 構建OOP工程
點擊小錘子圖標進行構建,此時會冒出來很多錯誤……
主要原因是 Sketch 中雖然包含了類庫,但鏈接器并不知道去哪里找它,所以要添加類庫的路徑。
a) 在項目管理器中,右鍵單擊 Sketch 文件夾,”MorseTest”.
b) 點擊 “Properties”.
c) 進入 “C/C++ General -> Path and Symbols”,頁
d) 在 “Includes” 標簽中,在左邊language欄中選擇”GNU C++”, 點擊右側的”Add…”按鈕。
e) 在”Add directory path”對話框中選擇 “Workspace…”
f) 找到類庫的文件夾 “Morse”, 點擊 “OK”.
g) 類庫路徑被添加進來,如下圖所示。點擊“OK”關閉窗口
h) 如果這個框框跳出來,就點“Yes”
i) 重新點擊Sketch文件夾,并構建,現在應該是0錯誤,0警告了。
j) 下載到Arduino板子上,實現的功能,和早先所有程序都堆在一起的而且面向過程的Sketch是一樣的。
5. 在ADE中,使用類庫
1) 將類庫文件夾(“Morse”)復制至ADE所在文件夾的“libraries”文件夾 (“H:\arduino-1.0\libraries\”)內。
2) 打開ADE,就可以在菜單 “Sketch->Import Library…” 中找到Morse類了。(其實ADE還是實現了很多不錯的功能呢)
3) 點擊它 “#include ” 這句話,就會被添加到新的這個Sketch里面。
4) 從eclipse的sketch,MorseTest.cpp, 復制代碼至ADE 除了
#include “MorseTest.h” ADE會自己生成一個類似的文件,或者壓根就不需要吧,反正不用這個東西了。
#include “Morse.h” 因為導入類庫的時候,已經將這個頭文件包含進來了。
5) 編譯并下載,應該是沒有問題。
6) 在ADE的libraries文件夾內的類庫文件夾,“Morse”中,新建一個“examples”文件夾。把剛才復制過來的sketch保存進去,并命名為“SOS”
7) 退出 ADE, 并再次打開。 可以看到 SOS 程序作為 Morse 庫的一個實例,出現在菜單里。也就是說現在Morse類,就像ADE已經集成的這么多類一樣,可以被導入,并且還提供例程。
6. 在 eclipse 中使用類庫
1 sketch = 1 main = 1 project. Main() 函數作為C/C++程序的入口,一個項目中只允許出現一次,否則編譯器無法正確進行編譯。所以,不能在類的項目(“MorseTest”)中,同時出現多個setup()和loop()。
如果要單獨新建一個使用自定義類的Arduino工程(Sketch),最穩妥的方法,還是使用官方指南里面的方法從ADE目錄中導入類。
如果希望為單個類庫,編寫多個示例代碼。我個人的做法,就是將eclipse中的測試代碼,復制到ADE中,以ino格式保存至ADE相應類庫的 examples文件夾內。所以,其實在開發過程中,我的測試文件,”MorseTest.cpp”是不斷變化的,當測試通過后,就被另存為ino格式。 個人的習慣,是不太想為開發測試中的類庫,新建一個又一個的工程,畢竟大多數測試代碼都是比較短小簡單的,所以做個備份,或者存個INO就好。記得每次升 級類庫的時候,也講ADE的libraries的老類庫進行覆蓋。
總結一下,ADE確實做了很多事情,讓編程序看起來變得更加簡單。但是作為代碼編輯器來講,有經驗的程序員可能用起來會比較崩潰,或者說習慣于 VS, eclipse這類高級IDE的程序員用起來,就會感覺相當奔潰。(對于那些用記事本直接玩的孩紙,那還是傷不起……)。而借助 Arduino Eclipse 插件,使用eclipse進行開發,就會是Arduino的開發變得非常輕松、愉快,而且高效。
趕快來試試吧~