編譯完成后在工作目錄新生成了一個文件:demo1.o ,它是我們的目標文件,我們再使用鏈接器將它鏈接成可在器件上執行的二進制代碼。
在命令行輸入:avr-gcc –m
mcu=at90s2313 –O demo1.elf demo1.o
之后我們會在工作目錄看見鏈接器生成的demo1.elf。gcc 的鏈接后生成的文件為ELF 格式,在命令行我們通常用.elf 指定其擴展名。
ELF 格式文件除了包含不同存儲器的二進制格式內容外還包含一些調試信息,所以我們還要借助一個有用工具 avr-objcopy 來提取單片機程
序存儲器內容。命令行輸入:avr-objcopy -j .text -j .data -O ihex demo1.elf demo1.hex
gcc 把不同類型的數據分到不同的段落,相關程序存儲器的段有 .text 和 .data ,我們用選項 –j 指定了要提取的段。選項 –O 用來指
定輸出格式,這里我們指定為ihex (intel HEX file)。
到此我們得到了最終可以寫入單片機90S2313 FLASH 存儲器的demo1.hex 文件。用編程器將demo1.hex 內空寫入到單片機,便可
看到接在PB0 口的LED 不斷的閃爍。以上對一次編譯過程的描述只是為了說明gcc 編譯一個C 源程序的步驟,在實際的應用中我們很少用這種
方式編譯每一個源程序和每一個更新后的程序。而是借助一個叫make 的項目管理工具來進行編譯操作。Make 由下一節介紹。
1.2 用MAKEFILE 管理項目
在我看來,通常一個編譯器(泛指高級語言編譯器、匯編器、鏈接器等等)、項目管理器和文本編輯器構成一個完整的編程環境。
WINAVR 沒有像Keil uVision 那樣的集成IDE,所以我們需要寫一個叫做makefile 的文件來管理程序的編譯鏈接。makefile 是個腳本文件
,一個標準的(應該說經典的)可執行文件make.exe 負責解析它并根據腳本內容來調用編譯器、鏈接器或其它的工具。
1.2.1 make 的使用
make 能夠自動記憶各源文件間的依賴關系,避免重復編譯。
Make 指令用法是:
Make [-f filename] [names]
方括號表示括號里邊的內容可以省略。其中filename 代表make 所使用的項目描述文件,如果此項省略,則從當前目錄下按下列順序尋找默認
的項目描述文件
GNUmakefile.
makefile
Makefile (當然在WINDOWS 下不份大小寫文件名,也就無所謂了)
names 指定目標名或宏名。若不指定目標名,則make 命令總是把在makefile 文件中遇到的第一個目標當作默認目標。
1.2.2 Makefile 項目描述文件
一.目標
make 命令引入了目標(targets)的概念。Makefile 描述文件便是它的第一個目標,make 命令必須處理至少一個目標,否則不會得出
任何結果。正如我們在一個沒有默認描述文件的當前目錄下敲入make 一樣,make 會輸出以下的結果:
MAKE: ***No targets specified and no makefile found. Stop.
1.在項目描述文件中定義目標
一個目標通常從一行的開頭開始,并后跟一個冒號。
最簡單的MAKEFILE
#當前目錄 D:\AVRGCC\TEST
all:
@echo hello!
#End makefile
all: 便是第一個目標
調用此描述文件結果:
D:\AVRGCC\TEST>make
hello!
2.默認目標(goal)
在上面提到過,如果調用make 時不指定目標名則make 總是假設在描述文件中遇到的第一個目標是默認目標。以下示例可以非常好的說
明這一問題。
具有三個目標的makefile
#當前目錄 D\AVRGCC\TEST
one:
@echo one.
Two:
@echo two.
Three:
@echo three.
#End makefile
調用1:
D:\AVRGCC\TEST>make
one.
由于在命令行沒有指定目標,make 從makefile 中找到第一個目標(one)并執行后既退出。
調用2:
D:\AVRGCC\TEST>make two
two.
由于在命令行明確指定了要執行的目標(two),make 在makefile 中找到指定的目標,并執行后退出。
調用3:
D:\AVRGCC\TEST make three one two
three.
one.
two.
命令行指定了三個目標,make 一一尋找并執行。
在makefile 中非默認的目標稱為可替換的目標,只有默認的目標與它們存在直接或間接的依賴關系時它們才有可能被調用。
二.依賴關系
makefile 文件按如下格式指定依賴關系:
目標1[目標2 … ] : [ : ][依賴1][依賴2] …
[命令]
如下例
#當前目錄 D:\AVRGCC\TEST
one: Two
@echo one.
Two:
@echo two.
#End makefile
執行結果是:
d:\avrgcc\test>make
two.
one.
Make 首先找到第一個目標one ,之后發現目標one 依賴目標Two 就先執行Two 后才執行one 中的命令。
三.Makefile 內容
makefile 內容可分為如下五種類型
①規則定義
語法:
目標 : 依賴
命令
...
其中目標為一個文件名或以空格分開的多個文件名,可含通配符。
例如:
%.o : %.c
avr-gcc -c $< -o $@
以上規則定義了任意一個以 .o 結尾的文件依賴于相同前綴且以 .c 結尾的文件。并執行下邊的命令獲得。
規則中目標和依賴分別為 %.o 和%.c,在目標通配符 “%” 代表任意的字符串,而在依賴中代表與目標中代表的對應字符串。
②隱含規則
隱含規則是make 預先定義的規則,用選項 –r 可取消所有的隱含規則。
例如對于C 程序 %.o 可以自動的從 %.c 通過命令
$(CC) -c $(CPPFLAGS) $(CFLAGS)' 生成。
③變量
變量是在makefile 中描述一字符串的的名稱。變量可用在目標、依賴、命令和makefile 其它部分中。變量名由除': '、'#'、'='之外的字符組
成,對大小寫敏感。
變量的定義并賦值格式:
變量名 = 變量代表字符串
變量的引用格式:
$(變量名)
例如:
CC = avr-gcc
%.o : %.c
$(CC) -c $< -o $@
④命令
命令部分是由make 傳遞到系統的字符格式的命令行的組合,在目標被創建時它們按順序一行一行傳遞到系統并執行。
字符 '@'開始的命令 在系統的輸出中不顯示本次的指令行。
⑤注釋
字符 '# ' 開頭的行為注釋行,如果注釋需要換行需在行尾加 ' \ ',除包含其它MAKEFIEL 外在行的任意處可插入注釋。
四.自動變量
在makefile 中有一組預定義的變量,當每一規則被執行時根據目標和依賴重新計算其值,叫作自動變量。
下面列出了常用的幾個自動變量
$@ : 在規則中代表目標名,如果規則含有多個目標名它將列舉所有目標。
$% : 僅在目標是存檔文件的成員時起作用,代表目標。
如目標foo.a(bar.o)中$@ 代表foo.a $%代表bar.o
$< : 在規則中代表第一個依賴文件名
$? : 代表在規則中所有以空格隔開的依賴文件名,如果依賴是存檔文件的成員則只有成員名被列出。
$^ : 代表在規則中所有以空格隔開的依賴文件名,如果依賴是存檔文件的成員則只有成員名被列出。
WINAVR 提供一種簡單makefile 生成工具叫mfile,如圖1-2
利用它我們可方便的生成合適的makefile。
Main file name…菜單指定主程序文件,它將決定主源程序文件名及輸出文件名。
Output format 菜單項用于選擇最終生成的可指行代碼格式,根據編程器支持格式選擇即可。
Optimization leave 指定C 代碼的優化級,s 代表按最小代碼量編譯。
C/C++ source file(s) 和Assembler source files(s) 用于在項目中添加其它C、C++、和匯編程序文件。
通常我們選擇了以上幾項便可編譯了。
1.3 開發環境的配置
一.軟件環境
UltraEdit + WinAVR 打造超級開發IDE
UltraEdit 是個文本編輯器,它支持C 代碼的高亮顯示、項目管理及外部工具配置等功能。
首先要安裝UltraEdit 和 WinAVR。
(1) UltraEdit 的個性化設置:
下面是我個人習慣的設置
視圖->顏色設置 光標所在行文本 設置成黑,光標所在行背景設置成白
高級->配置->編輯 制表符寬度值和縮進空格婁均設成4。
高級->配置->備份 保存時備份文件里選擇 不備份。
視圖->查看列表 選中函數列表
(2) 創建編譯用的文件
先在硬盤上創建一個目錄作為設計大本營,這里假設為 d:\devdir
UltraEdit 寫主程序文件保存到此文件夾中 這里設為demo.c
用mfile 生成一個合適的makefile 保存到d:\devdir
UltraEdit 創建一項目,負責管理文件
項目->新建項目 目錄選d:\devdir 輸入項目名稱(這里假設為prj)
在接下來的文件設置對話框中的項目文件目錄區輸入或選擇d:\devdir
選中 相對路徑 復選按鈕
通過 添加文件 按鈕將剛才的makefile 和demo.c 添加到項目中,之后按關閉。
(3)在UltraEdit 中make 我的項目
高級 -> 工具配置
在命令行區輸入 make
在工作目錄區輸入 d:\devdir
在菜單項目名稱區輸入一個任意的菜單名稱
選中 輸出到列表框 和 捕獲輸出兩個選擇按鈕后單擊 插入按鈕 確定。
至此你就可以在UltraEdit 內就可以make 你的程序了?
如果不愿意每次編譯時找菜單可用快捷鍵 Ctrl+shift+0。
記得要在你的項目里添加源程序時,除了在UltraEdit 項目->文件設置里添加外還要在
makefile 的SRC 變量后列出來才可編譯哦?
到此 我們的超級無敵AVR 編程環境打造完成 ,如圖1-3。
二.硬件環境
SI-Prog + PonyProg 實現最廉價的下載實驗器 AVR 系列單項機提供對程序存儲器(FLASH)和數據存儲器(EEPROM)的串行編程
功能(ISP),使它的程序燒寫變得方便。AVR 系列器件內部FLASH 存儲器的編程次數通常可達到10000 次以上,所以使用多次燒寫的方式
調試程序時不必擔心器件的損壞。
ISP 功能占用三個I/O 端口(MOSI 、MISO、 SCK)與外部編程邏輯通信,編程邏輯按指定時序將程序數據串行方式發送到器件,器件內
的ISP 功能模塊負責將數據寫入到FLASH 或EEPROM。
在實際應用中通常利用PC 機的并行口或串行口加一個下載適配器(下載線)實現一個編程硬件,AVR 的下載線有很多種,這里向大家推薦
SI-Prog,SI-Prog 具有制作方便(只需幾個分立元件)、接線少(通過PC 9 針串行口編程),支持軟件成熟(PonyProg)等特點。 si-prog
的完整電路可到http://www.LancOS.com 下載。圖1-4
為簡化后的電路原理圖。
PonyPorg 是個串行器件編程軟件,支持AVR 在內的多種器件的串行編程。該軟件可到http://www.LanOS.com 下載。