找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10193|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

[推薦]AVR 單片機(jī)與GCC 編程 教程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:3395 發(fā)表于 2008-7-17 13:56 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
第一章 AVR 單片機(jī)GCC 程序設(shè)計


WINAVR 是一個ATMEL AVR 系列單片機(jī)的開發(fā)工具集,它包含GNU C 和C++編譯器GCC。


1.1 一個簡單的例子


為了先有一個感性的認(rèn)識,我們首先看一下如下一段程序和它的編譯、鏈接過程。


文件demo1.c :


#include
int main( void )
{
unsigned char i, j, k,led=0;
DDRB=0xff;
while (1)
{
if(led)
PORTB|=0X01;
else
PORTB&=0XFE;
led=!led;
//延時
for (i=0; i<255; i++)
for(j=0; j<255;j++)
k++;
}
}


這是一個使接在PB0 口的LED 發(fā)光管閃爍的程序。有了源程序文件demo1.c,我們就可以編譯它了。通過點(diǎn)擊菜單開始->運(yùn)行
在彈出的對話框中輸入 “ command ” ,來打開控制臺窗口,并在命令行輸入:avr-gcc –mmcu=at90s2313 –c demo1.c


如圖1-1 所示。


必需告訴編譯器 程序的mcu 類型,這是我們通過命令行選項-mmcu 來指定的,我們指定的器件為at90s2313。-c 選項告訴編
譯器編譯完成后不鏈接。





圖1-1 控制臺窗口


編譯完成后在工作目錄新生成了一個文件:demo1.o ,它是我們的目標(biāo)文件,我們再使用鏈接器將它鏈接成可在器件上執(zhí)行的二進(jìn)制代碼。
在命令行輸入:avr-gcc –mmcu=at90s2313 –O demo1.elf demo1.o


之后我們會在工作目錄看見鏈接器生成的demo1.elf。gcc 的鏈接后生成的文件為ELF 格式,在命令行我們通常用.elf 指定其擴(kuò)展名。
ELF 格式文件除了包含不同存儲器的二進(jìn)制格式內(nèi)容外還包含一些調(diào)試信息,所以我們還要借助一個有用工具 avr-objcopy 來提取單片機(jī)
存儲器內(nèi)容。命令行輸入:avr-objcopy -j .text -j .data -O ihex demo1.elf demo1.hex


gcc 把不同類型的數(shù)據(jù)分到不同的段落,相關(guān)程序存儲器的段有 .text 和 .data ,我們用選項 –j 指定了要提取的段。選項 –O 用來指
定輸出格式,這里我們指定為ihex (intel HEX file)。


到此我們得到了最終可以寫入單片機(jī)90S2313 FLASH 存儲器的demo1.hex 文件。用編程器將demo1.hex 內(nèi)空寫入到單片機(jī),便可
看到接在PB0 口的LED 不斷的閃爍。以上對一次編譯過程的描述只是為了說明gcc 編譯一個C 源程序的步驟,在實(shí)際的應(yīng)用中我們很少用這種
方式編譯每一個源程序和每一個更新后的程序。而是借助一個叫make 的項目管理工具來進(jìn)行編譯操作。Make 由下一節(jié)介紹。


1.2 用MAKEFILE 管理項目


在我看來,通常一個編譯器(泛指高級語言編譯器、匯編器、鏈接器等等)、項目管理器和文本編輯器構(gòu)成一個完整的編程環(huán)境。


WINAVR 沒有像Keil uVision 那樣的集成IDE,所以我們需要寫一個叫做makefile 的文件來管理程序的編譯鏈接。makefile 是個腳本文件
,一個標(biāo)準(zhǔn)的(應(yīng)該說經(jīng)典的)可執(zhí)行文件make.exe 負(fù)責(zé)解析它并根據(jù)腳本內(nèi)容來調(diào)用編譯器、鏈接器或其它的工具。


1.2.1 make 的使用


make 能夠自動記憶各源文件間的依賴關(guān)系,避免重復(fù)編譯。
Make 指令用法是:
Make [-f filename] [names]
方括號表示括號里邊的內(nèi)容可以省略。其中filename 代表make 所使用的項目描述文件,如果此項省略,則從當(dāng)前目錄下按下列順序?qū)ふ夷J(rèn)
的項目描述文件


GNUmakefile.
makefile
Makefile (當(dāng)然在WINDOWS 下不份大小寫文件名,也就無所謂了)
names 指定目標(biāo)名或宏名。若不指定目標(biāo)名,則make 命令總是把在makefile 文件中遇到的第一個目標(biāo)當(dāng)作默認(rèn)目標(biāo)。


1.2.2 Makefile 項目描述文件


一.目標(biāo)


make 命令引入了目標(biāo)(targets)的概念。Makefile 描述文件便是它的第一個目標(biāo),make 命令必須處理至少一個目標(biāo),否則不會得出
任何結(jié)果。正如我們在一個沒有默認(rèn)描述文件的當(dāng)前目錄下敲入make 一樣,make 會輸出以下的結(jié)果:


MAKE: ***No targets specified and no makefile found. Stop.


1.在項目描述文件中定義目標(biāo)


一個目標(biāo)通常從一行的開頭開始,并后跟一個冒號。
最簡單的MAKEFILE
#當(dāng)前目錄 D:\AVRGCC\TEST
all:
@echo hello!
#End makefile
all: 便是第一個目標(biāo)
調(diào)用此描述文件結(jié)果:
D:\AVRGCC\TEST>make
hello!


2.默認(rèn)目標(biāo)(goal)


在上面提到過,如果調(diào)用make 時不指定目標(biāo)名則make 總是假設(shè)在描述文件中遇到的第一個目標(biāo)是默認(rèn)目標(biāo)。以下示例可以非常好的說
明這一問題。


具有三個目標(biāo)的makefile
#當(dāng)前目錄 D\AVRGCC\TEST
one:
@echo one.
Two:
@echo two.
Three:
@echo three.
#End makefile
調(diào)用1:
D:\AVRGCC\TEST>make
one.


由于在命令行沒有指定目標(biāo),make 從makefile 中找到第一個目標(biāo)(one)并執(zhí)行后既退出。
調(diào)用2:
D:\AVRGCC\TEST>make two
two.
由于在命令行明確指定了要執(zhí)行的目標(biāo)(two),make 在makefile 中找到指定的目標(biāo),并執(zhí)行后退出。


調(diào)用3:
D:\AVRGCC\TEST make three one two
three.
one.
two.
命令行指定了三個目標(biāo),make 一一尋找并執(zhí)行。
在makefile 中非默認(rèn)的目標(biāo)稱為可替換的目標(biāo),只有默認(rèn)的目標(biāo)與它們存在直接或間接的依賴關(guān)系時它們才有可能被調(diào)用。


二.依賴關(guān)系


makefile 文件按如下格式指定依賴關(guān)系:
目標(biāo)1[目標(biāo)2 … ] : [ : ][依賴1][依賴2] …
[命令]


如下例


#當(dāng)前目錄 D:\AVRGCC\TEST
one: Two
@echo one.
Two:
@echo two.
#End makefile
執(zhí)行結(jié)果是:
d:\avrgcc\test>make
two.
one.
Make 首先找到第一個目標(biāo)one ,之后發(fā)現(xiàn)目標(biāo)one 依賴目標(biāo)Two 就先執(zhí)行Two 后才執(zhí)行one 中的命令。


三.Makefile 內(nèi)容


makefile 內(nèi)容可分為如下五種類型
①規(guī)則定義
語法:
目標(biāo) : 依賴
命令
...
其中目標(biāo)為一個文件名或以空格分開的多個文件名,可含通配符。
例如:
%.o : %.c
avr-gcc -c $< -o $@
以上規(guī)則定義了任意一個以 .o 結(jié)尾的文件依賴于相同前綴且以 .c 結(jié)尾的文件。并執(zhí)行下邊的命令獲得。
規(guī)則中目標(biāo)和依賴分別為 %.o 和%.c,在目標(biāo)通配符 “%” 代表任意的字符串,而在依賴中代表與目標(biāo)中代表的對應(yīng)字符串。


②隱含規(guī)則


隱含規(guī)則是make 預(yù)先定義的規(guī)則,用選項 –r 可取消所有的隱含規(guī)則。
例如對于C 程序 %.o 可以自動的從 %.c 通過命令
$(CC) -c $(CPPFLAGS) $(CFLAGS)' 生成。


③變量
變量是在makefile 中描述一字符串的的名稱。變量可用在目標(biāo)、依賴、命令和makefile 其它部分中。變量名由除': '、'#'、'='之外的字符組
成,對大小寫敏感。
變量的定義并賦值格式:
變量名 = 變量代表字符串
變量的引用格式:
$(變量名)


例如:


CC = avr-gcc
%.o : %.c
$(CC) -c $< -o $@


④命令
命令部分是由make 傳遞到系統(tǒng)的字符格式的命令行的組合,在目標(biāo)被創(chuàng)建時它們按順序一行一行傳遞到系統(tǒng)并執(zhí)行。
字符 '@'開始的命令 在系統(tǒng)的輸出中不顯示本次的指令行。


⑤注釋
字符 '# ' 開頭的行為注釋行,如果注釋需要換行需在行尾加 ' \ ',除包含其它MAKEFIEL 外在行的任意處可插入注釋。


四.自動變量


在makefile 中有一組預(yù)定義的變量,當(dāng)每一規(guī)則被執(zhí)行時根據(jù)目標(biāo)和依賴重新計算其值,叫作自動變量。


下面列出了常用的幾個自動變量
$@ : 在規(guī)則中代表目標(biāo)名,如果規(guī)則含有多個目標(biāo)名它將列舉所有目標(biāo)。
$% : 僅在目標(biāo)是存檔文件的成員時起作用,代表目標(biāo)。
如目標(biāo)foo.a(bar.o)中$@ 代表foo.a $%代表bar.o
$< : 在規(guī)則中代表第一個依賴文件名
$? : 代表在規(guī)則中所有以空格隔開的依賴文件名,如果依賴是存檔文件的成員則只有成員名被列出。
$^ : 代表在規(guī)則中所有以空格隔開的依賴文件名,如果依賴是存檔文件的成員則只有成員名被列出。
WINAVR 提供一種簡單makefile 生成工具叫mfile,如圖1-2


利用它我們可方便的生成合適的makefile。


Main file name…菜單指定主程序文件,它將決定主源程序文件名及輸出文件名。
Output format 菜單項用于選擇最終生成的可指行代碼格式,根據(jù)編程器支持格式選擇即可。
Optimization leave 指定C 代碼的優(yōu)化級,s 代表按最小代碼量編譯。
C/C++ source file(s) 和Assembler source files(s) 用于在項目中添加其它C、C++、和匯編程序文件。





圖1-2 mfile 生成makefile


通常我們選擇了以上幾項便可編譯了。


1.3 開發(fā)環(huán)境的配置


一.軟件環(huán)境


UltraEdit + WinAVR 打造超級開發(fā)IDE
UltraEdit 是個文本編輯器,它支持C 代碼的高亮顯示、項目管理及外部工具配置等功能。
首先要安裝UltraEdit 和 WinAVR。


(1) UltraEdit 的個性化設(shè)置:
下面是我個人習(xí)慣的設(shè)置
視圖->顏色設(shè)置 光標(biāo)所在行文本 設(shè)置成黑,光標(biāo)所在行背景設(shè)置成白
高級->配置->編輯 制表符寬度值和縮進(jìn)空格婁均設(shè)成4。
高級->配置->備份 保存時備份文件里選擇 不備份。
視圖->查看列表 選中函數(shù)列表


(2) 創(chuàng)建編譯用的文件
先在硬盤上創(chuàng)建一個目錄作為設(shè)計大本營,這里假設(shè)為 d:\devdir
UltraEdit 寫主程序文件保存到此文件夾中 這里設(shè)為demo.c
用mfile 生成一個合適的makefile 保存到d:\devdir
UltraEdit 創(chuàng)建一項目,負(fù)責(zé)管理文件
項目->新建項目 目錄選d:\devdir 輸入項目名稱(這里假設(shè)為prj)
在接下來的文件設(shè)置對話框中的項目文件目錄區(qū)輸入或選擇d:\devdir
選中 相對路徑 復(fù)選按鈕
通過 添加文件 按鈕將剛才的makefile 和demo.c 添加到項目中,之后按關(guān)閉。


(3)在UltraEdit 中make 我的項目
高級 -> 工具配置
在命令行區(qū)輸入 make
在工作目錄區(qū)輸入 d:\devdir
在菜單項目名稱區(qū)輸入一個任意的菜單名稱
選中 輸出到列表框 和 捕獲輸出兩個選擇按鈕后單擊 插入按鈕 確定。
至此你就可以在UltraEdit 內(nèi)就可以make 你的程序了?
如果不愿意每次編譯時找菜單可用快捷鍵 Ctrl+shift+0。
記得要在你的項目里添加源程序時,除了在UltraEdit 項目->文件設(shè)置里添加外還要在
makefile 的SRC 變量后列出來才可編譯哦?
到此 我們的超級無敵AVR 編程環(huán)境打造完成 ,如圖1-3。





圖 1-3 配置后的UltraEdit 外觀


二.硬件環(huán)境


SI-Prog + PonyProg 實(shí)現(xiàn)最廉價的下載實(shí)驗器 AVR 系列單項機(jī)提供對程序存儲器(FLASH)和數(shù)據(jù)存儲器EEPROM)的串行編程
功能(ISP),使它的程序燒寫變得方便。AVR 系列器件內(nèi)部FLASH 存儲器的編程次數(shù)通常可達(dá)到10000 次以上,所以使用多次燒寫的方式
調(diào)試程序時不必?fù)?dān)心器件的損壞。


ISP 功能占用三個I/O 端口(MOSI 、MISO、 SCK)與外部編程邏輯通信,編程邏輯按指定時序?qū)⒊绦驍?shù)據(jù)串行方式發(fā)送到器件,器件內(nèi)
的ISP 功能模塊負(fù)責(zé)將數(shù)據(jù)寫入到FLASH 或EEPROM。


在實(shí)際應(yīng)用中通常利用PC 機(jī)的并行口或串行口加一個下載適配器(下載線)實(shí)現(xiàn)一個編程硬件,AVR 的下載線有很多種,這里向大家推薦
SI-Prog,SI-Prog 具有制作方便(只需幾個分立元件)、接線少(通過PC 9 針串行口編程),支持軟件成熟(PonyProg)等特點(diǎn)。 si-prog
的完整電路可到http://www.LancOS.com 下載。圖1-4


為簡化后的電路原理圖。
PonyPorg 是個串行器件編程軟件,支持AVR 在內(nèi)的多種器件的串行編程。該軟件可到http://www.LanOS.com 下載。





圖1-4 SI-Prog 電路原理圖


有了一臺安裝有PonyPorg 的PC 機(jī)和SI-Prog ,就可以將程序?qū)懭氲綄?shí)際器件來驗證了,想一想此方案的成本和一個AVR 芯片能燒寫的次數(shù)
,是不是覺得很值?


讀到這里您對AVR 單片機(jī)的開發(fā)和WINAVR 編程應(yīng)該有了一個基本的認(rèn)識,也應(yīng)當(dāng)做好了開發(fā)或?qū)W習(xí)前軟硬件的準(zhǔn)備工作。從下一章開始
我將進(jìn)一步解析AVR 的GCC 程序設(shè)計。









AVR 單片機(jī)與GCC 編程----之二
http://bbs.huazhoucn.com/Temp/Temp3333_1.html
AVR 單片機(jī)與GCC 編程----之三
http://bbs.huazhoucn.com/Temp/Temp3334_1.html
AVR 單片機(jī)與GCC 編程----之四
http://bbs.huazhoucn.com/Temp/Temp3335_1.html
AVR 單片機(jī)與GCC 編程----之五
http://bbs.huazhoucn.com/Temp/Temp3336_1.html
AVR 單片機(jī)與GCC 編程----之六
http://bbs.huazhoucn.com/Temp/Temp3337_1.html
AVR 單片機(jī)與GCC 編程----之七
http://bbs.huazhoucn.com/Temp/Temp3338_1.html
AVR 單片機(jī)與GCC 編程----之八
http://bbs.huazhoucn.com/Temp/Temp3339_1.html

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表