AVR單片機(jī)C語言編譯器_第1頁
AVR單片機(jī)C語言編譯器_第2頁
AVR單片機(jī)C語言編譯器_第3頁
AVR單片機(jī)C語言編譯器_第4頁
AVR單片機(jī)C語言編譯器_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、AVR單片機(jī)C語言編譯器Win-AVR是流行的GNU編譯器在AVR平臺上的移植。安裝完畢后會(huì)在桌面上出現(xiàn)一下七個(gè)快捷方式,它們的作用如下:Programmers Notepad源文件的編輯軟件,可提供應(yīng)用程序接口AVR InsightGDB Debug的前端工具,用于仿真調(diào)試TKInfoGNU超文本格式的圖形瀏覽器,用于瀏覽各種說明文檔Avr-libc ManualAVR-GCC編譯器的C語言函數(shù)庫GNU Manuals OnlineGNU在線幫助手冊MFileMakefile編輯軟件READMEWinAVR的readme文件Ø IDE (Integrated Development

2、 Environment)集成開發(fā)環(huán)境Ø ICE (In Circuit Emulator) 在線仿真器Ø JTAG (Joint Test Action Group) 聯(lián)合測試行為組織Ø *.hex 文件用來向單片機(jī)下載的16進(jìn)制文件Ø *.cof文件用來利用AVRstudio進(jìn)行在線仿真和調(diào)試的文件l AVR COFF(AVR Studio 3.x)l AVR “Extended” COFF(AVR Studio 4.07+)*.hex和*.cof這兩個(gè)文件不能由AVR-GCC本身生成,需要其他輔助工具來完成這一步,這個(gè)工具叫avr-objcopy。

3、Makefile文件就是一個(gè)描述性質(zhì)的文件,告知make各文件之間的依賴關(guān)系,不需要擴(kuò)展名。一般在MFile這個(gè)程序中生成對應(yīng)的makefile文件,然后將它復(fù)制到PN源文件的文件夾下,就可以進(jìn)行make all的命令來實(shí)現(xiàn)對源文件的編譯了。一般而言,makefile文件只需要修改一下幾個(gè)地方。Main file name (不要帶擴(kuò)展名)和MCU type 以及Default make target,然后點(diǎn)file-save as保存到要編譯的文件的文件夾下。C語言小總結(jié)Ø C語言的標(biāo)識符是區(qū)分大小寫的,標(biāo)識符必須以字母或者下劃線開頭,下劃線開頭的標(biāo)識符一般是編譯器定義的。

4、6; 一般而言,如果不是需要使用負(fù)整數(shù),盡量使用無符號數(shù)整數(shù)來表示,這樣可以減少系統(tǒng)處理符號的工作,從而提高程序的執(zhí)行效率。Ø 凡是耳目運(yùn)算符,都可以和賦值符一起組成復(fù)合賦值符,C語言中規(guī)定可使用的10中復(fù)合賦值運(yùn)算符:+=;-=;*=;/=;%=;<<=;>>=;&=;=;|=Ø 逗號運(yùn)算符是C語言的一種特殊的運(yùn)算符,其作用是將兩個(gè)表達(dá)式連接起來,C語言對兩個(gè)表達(dá)式分別計(jì)算,并將后一個(gè)表達(dá)式的值作為逗號表達(dá)式的值。運(yùn)算優(yōu)先級最低。例如:a=3*6,4*8;其結(jié)果為a=32;Ø C語言規(guī)定了六種關(guān)系運(yùn)算符:<<=;>

5、;>=;=;!=其中前四個(gè)的優(yōu)先級比較高,后兩個(gè)的優(yōu)先級比較低。Ø C語言規(guī)定的位運(yùn)算共有一下幾種: & 按位與 | 按位或 按位異或 (XOR) 10=1 11=0 取反 << 左移 >> 右移位翻轉(zhuǎn):令其和一個(gè)相應(yīng)位為1,其他位位0的常量做異或運(yùn)算。位置一:令其和一個(gè)相應(yīng)位為1,其他為為0的常量做或運(yùn)算。PORTA|=(1<<7)位置零:令其和一個(gè)相應(yīng)位為0,其他位為1的常量做與運(yùn)算。PORTA&=(1<<7)Ø 一般的變量和數(shù)組均存儲(chǔ)在系統(tǒng)的RAM中,AVR-GCC還支持存儲(chǔ)在ROM的數(shù)組和字符串,

6、該字符串使用PROGMEM關(guān)鍵字進(jìn)行聲明。如:Const char str PROGMEM =”hello” ; / 聲明了一個(gè)存儲(chǔ)在ROM中的字符串Ø 字符串是不能在程序中用賦值符直接賦值的,但可以借助循環(huán)語句,一個(gè)變量一個(gè)變量的進(jìn)行拷貝,如下:char a5=”hello” ;char b5;b=a; /*這樣的操作是非法的*/for(i=0;i<5;i+)bi=ai; /利用循環(huán)語句一個(gè)變量一個(gè)變量的拷貝Ø 函數(shù)的聲明用于函數(shù)的定義部分在函數(shù)實(shí)際調(diào)用之后,聲明的格式如下(必須加分號):函數(shù)返回值類型 函數(shù)名稱(類型名 形式參數(shù)1,類型名 形式參數(shù)2,);例如:i

7、nt add(int var1,int var2);Ø 指針變量存儲(chǔ)的是地址數(shù)據(jù),因此通過指針操作,程序可以對內(nèi)存等系統(tǒng)中編址的設(shè)備進(jìn)行控制,尤其是對經(jīng)常要對外部設(shè)備進(jìn)行操作的單片機(jī)系統(tǒng)就顯得非常重要。C語言里,字符串相當(dāng)于一個(gè)字符型數(shù)組,作為一個(gè)數(shù)組,當(dāng)然能夠和指針建立聯(lián)系,因此,字符串也能夠用指針變量實(shí)現(xiàn)。例如: char string1 =”GNU” ; Char *string2=”GNU” ;事實(shí)上,二者的聲明在本質(zhì)上是一樣的,在第二行的聲明中,C語言同樣要為string2開辟一個(gè)4個(gè)變量的存儲(chǔ)區(qū)域。但是用指針方式操作字符串更加靈活,這是因?yàn)橹灰o字符串開辟了足夠的空間,字

8、符串指針就可以在需要的時(shí)候賦值。例如: char string1 =”GNU” ; char string24; char string34; string24=”GNU”; /錯(cuò)誤,不能給數(shù)組賦值一個(gè)字符串 string3=”GNU”; /正確,按照指針方式賦值函數(shù)指針:函數(shù)生成代碼時(shí)也具有地址,因此也可以定義函數(shù)指針,定義形式如下: 函數(shù)返回值數(shù)據(jù)類型 (*函數(shù)指針標(biāo)識符)();函數(shù)指針的引用形式為: (*函數(shù)指針標(biāo)識符)(實(shí)參列表)例如:int test(int status); /聲明一個(gè)函數(shù)int main(void) int (*p) ( ); /聲明一個(gè)函數(shù)指針p=test; /

9、令p指向test函數(shù)(*p)(0x0098); /調(diào)用指針指向的函數(shù)return 0;指針數(shù)組:如果一個(gè)數(shù)組里面的元素是指針,則該數(shù)組就是指針數(shù)組,其聲明形式為: 數(shù)據(jù)類型 *數(shù)組名常量表達(dá)式 例如: int *array10; /聲明了含有10各整型指針的指針數(shù)組指針數(shù)組可以用來存儲(chǔ)字符串,在字符串之間的長度相差很大時(shí)可以使用最小的內(nèi)存。如果使用二維字符數(shù)組進(jìn)行存儲(chǔ),則數(shù)組的寬度必須與最長的字符串相同。例如: char *string =“hello”,” it is a dog”,” this”; /存儲(chǔ)了三個(gè)字符串Ø C與與語言可以構(gòu)造以下四種數(shù)據(jù)類型:l 結(jié)構(gòu)體:將一些變量組

10、合在一起,作為一個(gè)整體進(jìn)行使用,用于表達(dá)某種邏輯關(guān)系l 共同體:幾種不同的數(shù)據(jù)類型共用一片地址l 枚舉類型:規(guī)定變量的取值只有有限的情況,不能取其他值l 用戶自定義類型:用戶對已有的類型賦予新的類型標(biāo)識符Ø 結(jié)構(gòu)體:struct 結(jié)構(gòu)體名 數(shù)據(jù)類型 成員1; 數(shù)據(jù)類型 成員2; 數(shù)據(jù)類型 成員n;機(jī)構(gòu)體變量名;例如: struct student char name20; char sex; float score;struct student student1,student2,student310;*student4;student1.score=95.5;*(student1.

11、name)=”xiaoli” /給結(jié)構(gòu)體變量的成員賦值student1.sex=M;student4=&student2;student4->sex=M;student31.sex=M;student32.score=95.5;Ø 共同體:共同體的所有成員都占有相同的空間,共同體占用的空間的大小等于共同體內(nèi)占用空間最大的變量所占用的空間。共同體類型聲明形式如下:union 共同體名 數(shù)據(jù)類型 成員名1; 數(shù)據(jù)類型 成員名2; 數(shù)據(jù)類型 成員名n;共同體的變量聲明形式為:union 共同體名 共同體變量名共同體變量引用的形式為: 共同體變量.名成員;注意共同體的數(shù)據(jù)是存儲(chǔ)

12、在一個(gè)存儲(chǔ)空間的,因此共同體變量所存儲(chǔ)的值等于最后一次對共同體變量所賦的值。不能對共同體變量名賦值,也不能在定義共同體變量時(shí)對其初始化,對共同體的操作必須指明其成員。不能把共同體變量作為函數(shù)的參數(shù)和返回值。例如:union length_union Unit16_t word; Unit8_t byte2;length; /定義了一個(gè)共同體,有兩個(gè)成員,一個(gè)是16位的無符號整數(shù),另外一個(gè)是一個(gè)包含兩個(gè)無符號8位整數(shù)的數(shù)組,二者共用存儲(chǔ)空間。在上例中,如果按照length_union.word來操作時(shí),則作為一個(gè)16位無符號整數(shù),如果作為length_union.byte0和length_uni

13、on.byte1操作,則訪問的是該存儲(chǔ)空間的低位字節(jié)和高位字節(jié)。Ø 枚舉類型如果變量只有幾個(gè)可能的取值,則可以用枚舉類型表示該變量。枚舉類型定義形式為:enum 枚舉類型標(biāo)識符 枚舉列表;枚舉變量的定義為:enum 枚舉類型 枚舉變量名;例如: enum color red,green,blue;C語言將枚舉類型中的枚舉元素定義為常量,因此枚舉元素是有值的,C語言自動(dòng)按照值的順序定義值為0,1,2,枚舉元素的值可以改變enum colorred=5,green,blue; /red代表5,后面的未定值依次加一例如:enum colorred,green,blue;enum color

14、 crt;crt=red;crt=2; /錯(cuò)誤crt=(enum color)2; /將枚舉元素中的值為2的元素賦值給crt變量,強(qiáng)制轉(zhuǎn)換。枚舉變量的賦值必須用枚舉元素,如果直接用整數(shù)賦值是不行的,必須采用強(qiáng)制轉(zhuǎn)換。Ø 用戶自定義類型用戶可以對已存在的C語言類型名重新進(jìn)行定義,從而方便使用,用戶定義類型一般為: typedef 類型名 標(biāo)識符使用這些自定義類型是,必須包含inttypes.h頭文件。例如: #include <inttypes.h>typedef signed char int8_t /八位有符號數(shù) (無分號)typedef unsigned char u

15、int8_t /八位無符號數(shù)Ø 預(yù)處理C語言的預(yù)處理功能主要有一下三方面:l 宏定義l 文件包含l 條件編譯Ø 宏定義宏定義的作用是用指定的標(biāo)識符代表一個(gè)字符串,宏可以參數(shù),也可以不帶參數(shù),不帶參數(shù)的宏定義的一般形式為: #define 標(biāo)識符 字符串帶參數(shù)的宏定義聲明形式為: #define 宏名(參數(shù)表) 字符串例如:define S(a,b) a*b /定義了一個(gè)帶參數(shù)的宏int main(void)int i; i=S(5,6); /該語句與i=5*6完全一樣 return 0;Ø 文件包含文件包含的作用是將一個(gè)文件的內(nèi)容包括到另一個(gè)文件之中,文件包含的形

16、式為:#include “文件名” #include <文件名>第一種首先在當(dāng)前文件的所在目錄中尋找包含的文件,如果找不到再到系統(tǒng)指定的包含文件的目錄去尋找,第二種則直接在系統(tǒng)指定的包含目錄中去尋找,一般為了保險(xiǎn)起見,盡量使用雙引號形式的include指令。Ø 條件編譯條件編譯可以根據(jù)用戶定義的不同條件,選擇使用不同的語句,這在編寫可移植的程序時(shí)特別有用。條件編譯有以下幾種形式:l 第一種#ifdef 標(biāo)識符 程序段 1#else 程序段 2#endif該語句的作用是,如果在此語句前用“#define標(biāo)識符”定義了標(biāo)識符,則只在程序中包含程序段1,否則只包含程序段2.l

17、第二種#ifndef 標(biāo)識符 程序段1#else 程序段2#endif該語句的作用是,如果在此語句前沒有用“#define 標(biāo)識符”定義了標(biāo)識符,則只在程序中包含程序段1,否則只包含程序段2l 第三種#if 表達(dá)式 程序段1#else 程序段2#endif該語句的作用是,如果表達(dá)式的值為真,則值在程序中包含程序段1,否則,若表達(dá)式的值為0,則只在程序中包含程序段2.Ø AVR-LIBC的中斷處理函數(shù)對于不同的編譯器有不同的方法處理中斷,這是因?yàn)镃語言的目標(biāo)就是與處理器的細(xì)節(jié)無關(guān),因此每個(gè)編譯器的作者都不得不使用自己的方法為編譯器添加對中斷的支持。在AVR-LIBC的環(huán)境中,中斷向量表

18、已經(jīng)預(yù)先固定指向具有特定名字的函數(shù),這些函數(shù)用來執(zhí)行中斷操作。使用這些特殊名字的函數(shù)可在相應(yīng)中斷發(fā)生時(shí)被調(diào)用。AVR-LIBC中,對中斷處理函數(shù)進(jìn)行了封裝,通過使用兩個(gè)參數(shù)的宏INTERRUPT()和SIGNAL(),程序可正確的處理不同的中斷操作。#include “avr/signal.h”INTERRUPT(SIG_ADC)/用戶代碼或者為#include “avr/signal.h”SIGNAL(SIG_ADC)/用戶代碼Ø 全局中斷標(biāo)志操作函數(shù):#define sei() _asm_ _volatile_(“sei” :)使用中斷處理函數(shù),必須加入下面的包含語句:#incl

19、ude <avr/interrupt.h>sei(); /設(shè)置全局中斷標(biāo)志位允許全局中斷#define cli() _asm_ _volatile_(“cli” :)使用中斷處理函數(shù),必須加入下面的包含語句:#include <avr/interrupt.h>cli(); /清楚全局中斷標(biāo)志位來禁止全局中斷上面的兩個(gè)函數(shù)實(shí)際上只生成一條匯編指令,不會(huì)增加用戶程序的負(fù)擔(dān)。Ø 使用算術(shù)運(yùn)算函數(shù)avr-libc提供了算術(shù)運(yùn)算函數(shù),使用數(shù)學(xué)的數(shù)學(xué)運(yùn)算函數(shù)請?jiān)诔绦虻念^部加入包含語句:#include “math.h”為了使用數(shù)學(xué)運(yùn)算函數(shù),需要鏈接庫libm.a,通常該庫是不鏈接到用戶的程序中的,為了鏈接庫,請?jiān)谧约旱腉CC編譯選項(xiàng)的結(jié)尾加入-lm選項(xiàng)。即用PN打開makefile文件的第130行,MATH

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論