《AVR單片機C語言編譯器》由會員分享,可線上閱讀,更多相關《AVR單片機C語言編譯器(12頁珍藏版)》請在人人文庫網上搜尋。
1、AVR單片機C語言編譯器Win-AVR是流行的GNU編譯器在AVR平台上的移植。安裝完畢後會 在桌面上顯現一下七個快捷方式,它們的作用如下:Programmers Notepad源檔案的編輯軟體,可提供應用程式接口AVR In sightGDB Debug的前端工具,用于仿真調試TKI nfoGNU超文本格式的圖形掃瞄器,用于掃瞄各種講明文檔Avr-libc Ma nualAVR-GCC編譯器的C語言函數庫GNU Manu als On li neGNU線上關心手冊MFileMakefile編輯軟體READMEWinAVR 的 readme檔案IDE (In tegrated Developm。
2、e nt En vir onment)內建開發環境ICE ( In Circuit Emulator)線上仿真器JTAG (Joint Test Action Group)聯合測試行為組織*hex檔案用來向單片機下載下傳的16進制檔案*cof檔案用來利用AVRstudio進行線上仿真和調試的檔案AVR COFF( AVR Studio 3.x)AVR “ Extendec” COFF( AVR Studio 4.07+)*.hex和*.cof這兩個檔案不能由AVR-GCC本身生成,需要其他輔助工 具來完成這一步,那個工具叫 avr-objcopy。Makefile檔案确實是一個描述性質的檔案, 告。
3、知make各檔案之間的依 靠關系,不需要擴充名。一樣在MFile那個程式中生成對應的 makefile檔案,然後将它複制到P N源檔案的檔案夾下,就能夠進行 make all的指令來實作對源檔案的編譯 了。一樣而言,makefile檔案隻需要修改一下幾個地點。Main file name(不要帶擴充名)和 MCU type以及Default make target,然後點file- s ave as儲存到要編譯的檔案的檔案夾下。C 語言小總結C 語言的辨別符是區分大小寫的,辨別符必須以字母或者下劃線開頭, 下劃線開頭的辨別符一樣是編譯器定義的。一樣而言,如果不是需要使用負整數,盡量使用無符号數。
4、整數來表示, 如此能夠減少系統處理符号的工作,進而提升程式的執行效率。凡是耳目運算符,都能夠和指派符一起組成複合指派符, C 語言中規 定可使用的10中複合指派運算符:+=;-=;*=;/=;%=;=;&二;八=;|= 逗号運算符是 C 語言的一種專門的運算符,其作用是将兩個表達式連 接起來, C 語言對兩個表達式分别運算,并将後一個表達式的值作為逗号 表達式的值。運算優先級最低。例如: a=3*6,4*8; 其結果為 a=32;C 語言規定了六種關系運算符: ;=;=;!= 其中前四個的優先級比 較高,後兩個的優先級比較低。C 語言規定的位運算共有一下幾種:按位與按位或按位異或 (XOR) 。
5、取反 左移 右移1八0=11八1=0位翻轉:令其和一個相應位為 位置一:令其和一個相應位為1,1,其他位位其他為為0 的常量做異或運算。0 的常量做或運算。 PORTA|=(1sex=M ;student31.sex=M;student32.score=95.5;共同體:共同體的所有成員都占有相同的空間,共同體占用的空間的 大小等于共同體内占用空間最大的變量所占用的空間。共同體類型聲明形 式如下:union 共同體名資料類型 成員名 1;資料類型 成員名 2;資料類型 成員名 n;共同體的變量聲明形式為: union 共同體名 共同體變量名 共同體變量引用的形式為: 共同體變量 .名成員;注意。
6、共同體的資料是儲備在一個儲備空間的,是以共同體變量所儲備 的值等于最後一次對共同體變量所賦的值。不能對共同體變量名指派,也不能在定義共同體變量時對其初始化, 對共同體的操作必須指明其成員。不能把共同體變量作為函數的參數和返 回值。例如:union length_unionUnit16_t word;Unit8_t byte2;length;/定義了一個共同體,有兩個成員,一個是16 位的無符号整數,另外一個是一個包含兩個無符号 8 位整數的數組,二者共用儲備空間。在上例中,如果按照length_union.word來操作時,則作為一個16位無 符号整數,如果作為 length_union.by。
7、teO和 length_union.byte1操作,則訪 咨詢的是該儲備空間的低位位元組和高位位元組。枚舉類型如果變量隻有幾個可能的取值,則能夠用枚舉類型表示該變量。枚舉 類型定義形式為:enum 枚舉類型辨別符 枚舉清單 ; 枚舉變量的定義為: enum 枚舉類型 枚舉變量名; 例如: enum color red,green,blue;C 語言将枚舉類型中的枚舉元素定義為常量,是以枚舉元素是有值的,C語言自動按照值的順序定義值為 0, 1, 2,,枚舉元素的值能夠改變 enum colorred=5,green,blue; /red 代表 5,後面的未定值依次加一 例如:enum colorr。
8、ed,green,blue;enum color crt;crt=red;crt=2;crt=(enum color)2;量,強制轉換。/錯誤将枚舉元素中的值為2的元素指派給crt變枚舉變量的指派必須用枚舉元素,如果直截了當用整數指派是不行的, 必須采納強制轉換。使用者自定義類型使用者能夠對已存在的 C 語言類型名重新進行定義,進而友善使用,用 戶定義類型一樣為: typedef 類型名 辨別符使用這些自定義類型是,必須包含 inttypes.h 頭檔案。例如:#include typedef signed char int8_t/ 八位有符号數(無分号)typedef unsigned char。
9、 uint8_t/ 八位無符号數預處理C 語言的預處理功能要緊有一下三方面:宏定義檔案包含條件編譯宏定義 宏定義的作用是用指定的辨別符代表一個字元串,宏能夠參數,也能 夠不帶參數,不帶參數的宏定義的一樣形式為: #define 辨別符 字元串帶參數的宏定義聲明形式為: #define 宏名(參數表) 字元串 例如:define S(a,b) a*b/定義了一個帶參數的宏int main(void)int i;i=S(5,6);/該語句與 i=5*6 完全一樣return 0;檔案包含檔案包含的作用是将一個檔案的内容包括到另一個檔案之中,檔案包 含的形式為:#include “檔案名”#incl。
10、ude 第一種第一在目前檔案的所在名目中查找包含的檔案,如果找不到再 到系統指定的包含檔案的名目去查找,第二種則直截了當在系統指定的包 含名目中去查找,一樣為了保險起見,盡量使用雙引号形式的in elude指令條件編譯 條件編譯能夠按照使用者定義的不同條件,選擇使用不同的語句,這在 編寫可移植的程式時專門有用。條件編譯有以下幾種形式:第一種#ifdef 辨別符程式段 1#else程式段 2#endif該語句的作用是, 如果在此語句前用 “#define 辨別符”定義了辨別符, 則隻在程式中包含程式段 1,否則隻包含程式段 2.第二種#ifndef 辨別符程式段 1#else程式段 2#endif。
11、該語句的作用是,如果在此語句前沒有用“ #define 辨別符”定義了标 識符,則隻在程式中包含程式段 1,否則隻包含程式段 2第三種#if 表達式程式段 1#else程式段 2#endif 該語句的作用是,如果表達式的值為真,則值在程式中包含程式段1,否則,若表達式的值為 0,則隻在程式中包含程式段 2.AVR-LIBC 的中斷處理函數 關于不同的編譯器有不同的方法進行中斷,這是因為 C 語言的目标确 實是與處理器的細節無關,是以每個編譯器的作者都不得不使用自己的方 法為編譯器添加對中斷的支援。在 AVR-LIBC 的環境中,中斷向量表差不多預先固定指向具有特定名 字的函數,這些函數用來執行。
12、中斷操作。使用這些專門名字的函數可在相 應中斷發生時被調用。AVR-LIBC 中,對中斷處理函數進行了封裝,通過使用兩個參數的宏 I NTERRUPT ()和SIGNAL (),程式可正确的處理不同的中斷操作。#include “ avr/signal.h”INTERRUPT ( SIG_ADC )/使用者代碼或者為#include “ avr/signal.h”SIGNAL (SIG_ADC )/使用者代碼全局中斷标志操作函數:#define sei() _asm_ _volatile_(“ sei” :) 使用中斷處理函數,必須加入下面的包含語句:#include sei();/設定全局中斷标。
13、志位承諾全局中斷#define cli() _asm_ _volatile_(“cli ” :) 使用中斷處理函數,必須加入下面的包含語句:#include cli();/清晰全局中斷标志位來禁止全局中斷上面的兩個函數實際上隻生成一條彙編指令,可不能增加使用者程式的 負擔。使用算術運算函數avr-libc 提供了算術運算函數,使用數學的數學運算函數請在程式的頭 部加入包含語句:#include “ math.h”為了使用數學運算函數,需要連結庫libm.a,通常該庫是不連結到使用者 的程式中的, 為了連結庫, 請在自己的 GCC 編譯選項的結尾加入 -lm 選項 即用PN打開makefile檔案的。
14、第130行,MATH_LIB二 lm專門功能寄存器的操作方式: 在單片機系統中,經常要對寄存器或者外圍裝置進行操作,這些操作 差不多上通過一組專門功能寄存器的操作實作的。AVR 單片機中,提供了兩種方法完成操作。一種是獨立的 I/O 位址空 間,通過專門的 I/O 操作指令, 能夠利用專門的 I/O 指令操作部分或全部的 I/O 空間。另外一種是 I/O 位址也被映射到單片機的記憶體空間中,是以也能 夠用通常的記憶體操作指令完成I/O的操縱,I/O位址加上0x20的偏移量确 實是 I/O 映射到記憶體空間中的位址。 AVR 單片機支援這兩種操作,一樣使 用後者,而且這些操作差不多封裝好,不需要程式設計者。
15、幹預。是以,程式設計者 能夠使用專門函數如outb ()操作I/O。#include outb(PORTA,0x33);或者直截了當向記憶體中映射的位址寫資料 PORTA=0x33;編譯器會選擇合适的指令生成操作代碼訪咨詢 I/O 端口,與程式設計人員書 寫的代碼無關。是以,即使程式設計者使用記憶體映射的方式書寫 C代碼,例如: PORTA|=0x44,編譯器也會在優化時自動使用直截了當 I/O位址訪咨詢的 方式生成彙編代碼,同時盡量可能使用位操作方式(如 sbi 指令)。使用記憶體映射方式操作專門功能寄存器,能夠使C程式更友善地移植到其他AVR的C編譯器中,同時也能夠部分提升程式的可讀性。在不優化大的情形下,編譯器按照表達式的形式生成記憶體映像方式的 代碼,然而在打開編譯器優化的選項後,編譯器會按照操作的内容自動使 用更快的 in/out 指令生成代碼。