看了看ICCAVR的庫(kù)文件,談幾點(diǎn)感想
今天看到此帖:avr.com/bbs/dispbbs.asp?boardid=2&Id=30" rel="nofollow">[下載]ICCAVR庫(kù)函數(shù)源程序 突然想去看看,于是到ICC的安裝目錄下,到include文件夾中看了看,感覺(jué)有些收獲,故發(fā)此帖。
打開(kāi)macros.h看到了一些宏定義:
BIT指令的來(lái)歷:
#ifndef BIT
#define BIT(x)(1 << (x))
#endif
flash的來(lái)歷:
#define flashconst/* IAR compatibility */
一直不明白在ICC中asm("nop"); _NOP(); NOP(); 是不是一樣的,前者容易理解,是在C中嵌入?yún)R編,可為什么后兩者都能編譯通過(guò)呢?看看在macros.h中的兩條宏定義你就明白了:
#define NOP()asm("nop")
#define _NOP()asm("nop")
還有幾條關(guān)于看門(mén)狗喂狗的和開(kāi)總中斷關(guān)總中斷的:
#define WDR() asm("wdr") //喂狗
#define SEI()asm("sei") //開(kāi)總中斷
#define CLI()asm("cli") //關(guān)總中斷
#define _WDR() asm("wdr")
#define _SEI()asm("sei")
#define _CLI()asm("cli")
明白了一些東西嗎?
看看iom16v.h文件,你就可以明白PORTA|=(1< #define PA7 7 也就是說(shuō)編譯時(shí)PA7是7,1< 聽(tīng)了上面解釋你就明白這個(gè)什么意思了吧: void usart_send(unsigned char da { while(!(UCSRA&BIT(UDRE))); //將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) UDR=da } 以下是對(duì)USARA寄存器及寄存器內(nèi)各個(gè)位的定義: #define UCSRA(*(volatile unsigned char *)0x2B) #define RXC 7 #define TXC 6 #define UDRE 5 #define FE 4 #define DOR 3 #define OVR 3 /*This definition differs from the databook*/ #define PE 2 #define U2X 1 #define MPCM 0 #define UDR(*(volatile unsigned char *)0x2C) 明白了嗎? 談一點(diǎn)題外話,是看到這些頭文件開(kāi)頭都有的兩句話有感說(shuō)一說(shuō)一些編程技巧,關(guān)于條件編譯的吧. 以iom16v.h為例: 開(kāi)始有這樣兩句話: #ifndef __iom16v_h ………… …內(nèi)容… ………… 因此在我們編程時(shí),可以用這種編程思想: 假如說(shuō)吧: 我們要用到LCD1602的功能函數(shù),而在這個(gè)LCD文件(取名為L(zhǎng)CD1602.c)時(shí)又要用到延時(shí)函數(shù)(取名為delay.c),在主函數(shù)中我們也要用到delay.c,但你就會(huì)發(fā)現(xiàn),如果在主函數(shù)中加入#include "LCD1602.c"后,再包含#include "delay.c"就會(huì)編譯出錯(cuò),說(shuō)你重復(fù)定義`delay文件中的函數(shù)。因此我們可以這樣: 在LCD1602.c中包含"delay.c"時(shí)這樣寫(xiě): #ifndef _delay_c #include "delay.c" #endif 同樣在主函數(shù)中包含延時(shí)時(shí),也按這種方式寫(xiě),就會(huì)避免重復(fù)包含同一個(gè)文件這個(gè)問(wèn)題了。 可能有許多網(wǎng)友不明白條件編譯,解釋一下上面幾句話吧: #ifndef _delay_c//如果沒(méi)有定義過(guò)_delay_c才對(duì)下面的語(yǔ)句進(jìn)行編譯,范圍到#endif結(jié)束 #include "delay.c" #endif 可能有些網(wǎng)友感覺(jué)自已可以運(yùn)籌帷幄這個(gè)問(wèn)題,但你想過(guò)沒(méi),如果你編的程序很大,而且經(jīng)常相互包含文件呢? 以上僅為個(gè)人觀點(diǎn),不足與不妥及錯(cuò)誤之處敬請(qǐng)廣大網(wǎng)友批評(píng)指證!
#define __iom16v_h
#endif
這樣有一個(gè)好處就是不重復(fù)定義。
#define _delay_c
#define _delay_c
評(píng)論