新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 看了看ICCAVR的庫(kù)文件,談幾點(diǎn)感想

看了看ICCAVR的庫(kù)文件,談幾點(diǎn)感想

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
一直以來(lái)在論壇常見(jiàn)到網(wǎng)友們說(shuō)什么包含庫(kù)文件后是不是就不用自已寫(xiě)器件的驅(qū)動(dòng)程序了?(比如說(shuō)LCD的,延時(shí)函數(shù),SPI,UART,E2PROM等等),編了這么久的程序,也一直是“悶”著頭寫(xiě)程序,只知道BIT指令等等是在macros.h中定義的,PA等等端口的地址也是在iomXXv.h中定義的,也沒(méi)細(xì)想過(guò)什么,知其然即可,呵呵,不求甚解。。。

本文引用地址:http://m.butianyuan.cn/article/201611/317061.htm

今天看到此帖: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 data)//串口單字節(jié)發(fā)送函數(shù)

{

while(!(UCSRA&BIT(UDRE)));

//將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù)

UDR=data;

}

以下是對(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
#define __iom16v_h

…………

…內(nèi)容…

…………
#endif
這樣有一個(gè)好處就是不重復(fù)定義。

因此在我們編程時(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
#define _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é)束
#define _delay_c

#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)指證!



關(guān)鍵詞: ICCAVR庫(kù)文

評(píng)論


技術(shù)專區(qū)

關(guān)閉