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