新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 看了看ICCAVR的庫文件,談幾點感想

看了看ICCAVR的庫文件,談幾點感想

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

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

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

{

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

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

UDR=data;

}

以下是對USARA寄存器及寄存器內各個位的定義:

#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
#define __iom16v_h

…………

…內容…

…………
#endif
這樣有一個好處就是不重復定義。

因此在我們編程時,可以用這種編程思想:

假如說吧:

我們要用到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
#define _delay_c

#include "delay.c"

#endif

同樣在主函數(shù)中包含延時時,也按這種方式寫,就會避免重復包含同一個文件這個問題了。

可能有許多網(wǎng)友不明白條件編譯,解釋一下上面幾句話吧:

#ifndef _delay_c//如果沒有定義過_delay_c才對下面的語句進行編譯,范圍到#endif結束
#define _delay_c

#include "delay.c"

#endif

可能有些網(wǎng)友感覺自已可以運籌帷幄這個問題,但你想過沒,如果你編的程序很大,而且經(jīng)常相互包含文件呢?

以上僅為個人觀點,不足與不妥及錯誤之處敬請廣大網(wǎng)友批評指證!



關鍵詞: ICCAVR庫文

評論


技術專區(qū)

關閉