色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

          本文引用地址:http://cafeforensic.com/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")

          還有幾條關(guān)于看門狗喂狗的和開總中斷關(guān)總中斷的:

          #define WDR() asm("wdr") //喂狗

          #define SEI()asm("sei") //開總中斷

          #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

          也就是說編譯時(shí)PA7是7,1<

          聽了上面解釋你就明白這個(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)題外話,是看到這些頭文件開頭都有的兩句話有感說一說一些編程技巧,關(guān)于條件編譯的吧.

          以iom16v.h為例:

          開始有這樣兩句話:

          #ifndef __iom16v_h
          #define __iom16v_h

          …………

          …內(nèi)容…

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

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

          假如說吧:

          我們要用到LCD1602的功能函數(shù),而在這個(gè)LCD文件(取名為LCD1602.c)時(shí)又要用到延時(shí)函數(shù)(取名為delay.c),在主函數(shù)中我們也要用到delay.c,但你就會(huì)發(fā)現(xiàn),如果在主函數(shù)中加入#include "LCD1602.c"后,再包含#include "delay.c"就會(huì)編譯出錯(cuò),說你重復(fù)定義`delay文件中的函數(shù)。因此我們可以這樣:

          在LCD1602.c中包含"delay.c"時(shí)這樣寫:

          #ifndef _delay_c
          #define _delay_c

          #include "delay.c"

          #endif

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

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

          #ifndef _delay_c//如果沒有定義過_delay_c才對(duì)下面的語句進(jìn)行編譯,范圍到#endif結(jié)束
          #define _delay_c

          #include "delay.c"

          #endif

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

          以上僅為個(gè)人觀點(diǎn),不足與不妥及錯(cuò)誤之處敬請(qǐng)廣大網(wǎng)友批評(píng)指證!



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

          評(píng)論


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

          關(guān)閉