Arduino編譯總結

首先導入到單片機的是二進制文件,之所以要編譯爲HEX文件,是因爲hex文件帶校驗,在傳輸制、存儲過程中有錯誤的話,容易提前發現,而二進制文件就不能,假如在存儲中由於某一位或幾位數受損,那麼下載時照樣按受損的文件導入到單片機。

二進制:bin  八進制:oct  十進制:dec  十六進制:hex

Arduino構建過程總述

爲了生成可在Arduino板子上運行的程序,需要經過以下幾個步驟:

  • 1. Arduino IDE對代碼進行轉換,確保生成正確的C/C++代碼(兩種常用的編程語言)。
  • 2. 通過編譯器(avr-gcc)將上一步生成的可讀代碼,編譯成機器能識別的指令(或稱之爲目標文件)。
  • 3. 通過鏈接器,將上一步產生的目標文件與標準Arduino庫文件(提供基礎函數,如digitalWrite()或Serial.print())共同鏈接,生成一個Intel Hex文件,該文件中的指定內容將寫入到Arduino板上的可編程內存中。
  • 4. 將上一步產生的HEX文件上傳至Arduino板:可以使用USB或串口,通過板上已有的bootloader傳輸到Arduino板,也可以通過其它編程器直接燒寫。

多文件程序

一個Arduino程序可以包含多個文件(IDE中的多個標籤頁,一個標籤頁代表一個文件)。單擊IDE頂部滾動條的右向箭頭即可管理各文件。文件標籤頁的擴展名有4種類型:無擴展名、.c、.cpp或.h(若是其它擴展名,將被轉換爲下劃線)。程序編譯完後,所有無擴展名的文件標籤頁將被合併在一起,生成“主程序文件”。.c或.cpp擴展名的文件將被單獨編譯。爲了打開.h標籤頁,必須#include該文件(使用雙引號""而非尖括號< >)。

主程序文件的處理

在傳給avr-gcc編譯器之前,Arduino IDE將對主程序文件(IDE中所有無擴展名的標籤頁合併結果)進行轉換操作:

1. 在主程序文件的頭部,加入#include "WProgram.h"(0023版本)或#include "Arduino.h"(1.0版本)。該頭文件(位於<ARDUINO>/hardware/cores/<CORE>/)包含Arduino標準核心庫所需的所有聲明。

2. IDE將搜索主程序文件中出現的所有函數定義,爲它們創建聲明(原型)。這些聲明將被插在最前面的的註釋、預處理語句(#include或#define)之後,其它語句之前(包括類型定義)。若在函數中使用了自定義類型,則需要將該類型的定義單獨放入一個頭文件中。當然,這個處理並不完善:含有默認參數值的函數,定義在名字空間或類裏的函數,均不會產生正確的聲明原型。

3. 當前目標板的main.cxx文件中的所有內容,附加在主程序文件之後。

目標板

Arduino IDE支持多種目標板與多種芯片、CPU頻率、bootloader。這些都在板配置文件中定義,相關參數包括:

<BOARD>.name: 顯示在Boards菜單裏的名稱

<BOARD>.build.mcu: 板上的單片機(常用"atmega8"或"atmega168")

<BOARD>.f_cpu: 單片機的時鐘頻率(常用"16000000L"或ATmega168使用內部時鐘時的"8000000L")

<BOARD>.core: hardware/cores/目錄裏的子目錄名稱,用於鏈接時選擇對應的核心庫(常用"arduino")

另外,在preferences.txt中的一項設定也是很有用的:

構建程序時,是否打印調試信息(如"false")。若爲true,則打印構建過程中調用的所有命令的完整信息。

注:Arduino 0004及之後的版本,build.extension不再使用 -- 主程序文件將永遠作爲.cpp文件處理。

 

編譯過程

這裏以使用avr-gcc來編譯程序文件爲例,可以在core不同移植的核心編譯器keil等。

include路徑包括程序文件所在目錄、目標板目錄(<ARDUINO>/hardware/cores/<CORE>)和avr的include目錄(<ARDUINO>/hardware/tools/avr/avr/include/),以及主程序文件引用的頭文件所在的函數庫目錄(位於<ARDUINO>/hardware/libraries)。

當verify一個程序文件時,將在系統臨時目錄(如Mac裏的/tmp)中進行構建。當上傳時,將在程序文件所在目錄(可通過Sketch > Show Sketch Folder菜單進行訪問)的applet/子目錄中構建。

目標板核心的.c與.cpp文件將在同級目錄下被編譯生成.o文件,主程序文件、程序其它.c和.cpp文件及#include包含的函數庫中的.c或.cpp文件同樣處理。

這些.o文件將最終生成一個靜態庫,主程序文件與之鏈接。只有主程序中使用到的庫代碼纔會被寫入到最終的.hex文件中,這樣就減少了絕大多數程序的大小。

.hex文件是編譯的最終文件,然後被上傳到Arduino板。點擊"Verify"按鈕,.hex文件會在/tmp(Mac和Linux系統)或\Documents and Settings\<USER>\Local Settings\Temp(Windows系統)目錄中生成;點擊"upload"按鈕,該文件在程序目錄(通過Sketch > Show Sketch Folder菜單訪問)的applet子目錄中生成。

 

上傳/燒錄過程

生成的程序通過avrdude上傳。

上傳過程也受板配置和主配置文件中的參數影響,板配置包括:

<BOARD>.upload.protocol: avrdude與Arduino板的通信協議(通常是"stk500")

<BOARD>.upload.speed: avrdude上傳程序時使用的速度(波特率)(通常是"19200")

<BOARD>.upload.maximum_size: Arduino板的最大程序大小(與芯片大小及bootloader大小有關)

主配置中影響的參數:

upload.verbose: 上傳程序到板上時,是否顯示調試信息(默認"false")。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章