最近打算自己定制一個Arduino的板子,改改Arduino的燒寫機制。好在bootloader都是有源代碼的,說干就干,改寫前當然要試試這個源碼能不能編譯,可是到了bootloader目錄就茫然了。。。。。竟然用的是makefile,可是作為一名程序猿當然不能退縮了。。。
1、找到bootloader源碼
bootloader的源碼都在\arduino-1.6.9\hardware\arduino\avr\bootloaders文件夾下,不同的單片機芯片或者arduino板有不同的文件夾,就拿最廉價的atmega8下手吧,正好我也有很多usbasp的pcb可以改改。進入到atmega8目錄,可以看到下邊有幾個文件,毫無疑問.c文件就是源碼了,暫時不修改源碼,只是嘗試編譯一下,所以這次先不講解.c文件,還有兩個.hex的文件,這是實現編譯好的hex文件,當新做的arduino板連接到ide燒寫bootloader時,就是用的這里的hex,這個hex也沒啥好說的。最后一個文件就是makefile了,makefile一般只有牛x的程序員才會編寫,我一般都是照葫蘆畫瓢,但是為了折騰,還是得上。。。。
2、尋找make.exe
雖然沒有寫過makefile,至少見過makefile,之前沒有讀過多少書,編譯程序次數多了多少也看出來一些門道。每次編譯總是需要輸入make命令,用ide編譯的時候隱約可以看到開始前命令行中有make的影子。所以我如果要編譯要先找找make.exe在哪里。於是在arduino的目錄中搜索,但是很失望沒有。。。。於是挨着翻看了一下arduino的目錄,細心的我發現之前的arduino版本都帶有winavr,貌似最新版沒有了。於是找了個老版本看了看,果不其然老版本中有make.exe,於是趕緊下載一個winavr裝上(裝在任何目錄都可以),終於看到了久違的make.exe。
3、初次嘗試編譯
既然有了make.exe,那開始編譯吧,首先進入atmega8目錄,調用make.exe命令(注意winavr安裝的路徑不同,命令不同,請根據自己安裝的目錄調整),我調用的命令如下:
c:\winavr-20081205\utils\bin\make.exe
想法總是美好的,可是現實總是殘酷的。。。。當然編譯bootloader報錯了。。。錯了。。。了。。。
4、修改makefile
不管怎么樣,還是擦干淚水繼續奮斗呀,其實仔細看看那個錯誤信息,似乎也很明確。。。。找不到指定的文件,看看上邊的命令/bin/avr-gcc,貌似還真沒有這個文件,/分明是linux的路徑,我這里可是windows,打開makefile看看,
很快就找到原因所在了。。。
仔細看不難看出avr-gcc的路徑是通過DIRAVRBIN來定義的,而DIRAVRBIN又是通過DIRAVR這個變量來獲取的,並且文件中這個變量被注釋了。。。。如下是修改前的代碼
1 #DIRAVR = /usr/local/avr 2 DIRAVRBIN = $(DIRAVR)/bin 3 DIRAVRUTILS = $(DIRAVR)/utils/bin 4 DIRINC = $(DIRAVR)/include 5 DIRLIB = $(DIRAVR)/avr/lib
既然看出問題所在了,那就修改一下就好了,通過搜索可以找到avr-gcc所在的目錄,並且可以確定出avr-gcc所在的目錄相對於makefile所在的目錄的相對路徑是:..\..\..\..\tools\avr\bin,所以makefile修改后如下:
1 DIRAVR = ..\..\..\..\tools\avr 2 DIRAVRBIN = $(DIRAVR)/bin 3 DIRAVRUTILS = $(DIRAVR)/utils/bin 4 DIRINC = $(DIRAVR)/include 5 DIRLIB = $(DIRAVR)/avr/lib
再次運行c:\winavr-20081205\utils\bin\make.exe hex終於看到了新的hex文件。。。。