<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          還有幾條關于看門狗喂狗的和開總中斷關總中斷的:

          #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寄存器及寄存器內(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
          #define __iom16v_h

          …………

          …內(nèi)容…

          …………
          #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結(jié)束
          #define _delay_c

          #include "delay.c"

          #endif

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

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



          關鍵詞: ICCAVR庫文

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();