找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 9127|回復(fù): 1
收起左側(cè)

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

[復(fù)制鏈接]
ID:3395 發(fā)表于 2009-11-19 16:12 | 顯示全部樓層 |閱讀模式
第一章  AVR 單片機(jī)GCC 程序設(shè)計(jì)


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


1.1 一個(gè)簡(jiǎn)單的例子


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


文件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;
//延時(shí)
for (i=0; i<255; i++)
for(j=0; j<255;j++)
k++;
}
}


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


如圖1-1 所示。


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




                圖1-1 控制臺(tái)窗口


編譯完成后在工作目錄新生成了一個(gè)文件:demo1.o ,它是我們的目標(biāo)文件,我們?cè)偈褂面溄悠鲗⑺溄映煽稍谄骷蠄?zhí)行的二進(jìn)制代碼。
在命令行輸入:avr-gcc –mmcu=at90s2313 –O demo1.elf demo1.o


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


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


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


1.2 用MAKEFILE 管理項(xiàng)目


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


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


1.2.1 make 的使用


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


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


1.2.2 Makefile 項(xiàng)目描述文件


一.目標(biāo)


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


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


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


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


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


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


具有三個(gè)目標(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 中找到第一個(gè)目標(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.
命令行指定了三個(gè)目標(biāo),make 一一尋找并執(zhí)行。
在makefile 中非默認(rèn)的目標(biāo)稱為可替換的目標(biāo),只有默認(rèn)的目標(biāo)與它們存在直接或間接的依賴關(guān)系時(shí)它們才有可能被調(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 首先找到第一個(gè)目標(biāo)one ,之后發(fā)現(xiàn)目標(biāo)one 依賴目標(biāo)Two 就先執(zhí)行Two 后才執(zhí)行one 中的命令。
回復(fù)

使用道具 舉報(bào)

ID:91331 發(fā)表于 2016-5-1 09:47 | 顯示全部樓層
下載看看
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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