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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 單片機(jī)模塊化編程(二)再探

          單片機(jī)模塊化編程(二)再探

          作者:zhuzhaokun1987 時(shí)間:2015-02-02 來源:電子產(chǎn)品世界 收藏

            頭文件的文件內(nèi)部不應(yīng)該包含任何實(shí)質(zhì)性的函數(shù)代碼。我們可以把這個(gè)頭文件理解成為一份說明書,說明的內(nèi)容就是我們的模塊對(duì)外提供的接口函數(shù)或者是接口變量。同時(shí)該文件也包含了一些很重要的宏定義以及一些結(jié)構(gòu)體的信息,離開了這些信息,很可能就無法正常使用接口函數(shù)或者是接口變量。但是總的原則是:不該讓外界知道的信息就不應(yīng)該出現(xiàn)在頭文件里,而外界調(diào)用模塊內(nèi)接口函數(shù)或者是接口變量所必須的信息就一定要出現(xiàn)在頭文件里,否則,外界就無法正確的調(diào)用我們提供的接口功能。因而為了讓外部函數(shù)或者文件調(diào)用我們提供的接口功能,就必須包含我們提供的這個(gè)接口描述文件----即頭文件。同時(shí),我們自身模塊也需要包含這份模塊頭文件(因?yàn)槠浒四K源文件中所需要的宏定義或者是結(jié)構(gòu)體),好比我們平常所用的文件都是一式三份一樣,模塊本身也需要包含這個(gè)頭文件。

          本文引用地址:http://www.ex-cimer.com/article/269322.htm

            下面我們來對(duì).h這個(gè)頭文件進(jìn)行說明,一般來說,頭文件的名字應(yīng)該與源文件的名字保持一致,這樣我們便可以清晰的知道哪個(gè)頭文件是哪個(gè)源文件的描述。

            于是便得到了.c的頭文件.h 其內(nèi)容如下。

            #ifndef __LED_H__

            #define __LED_H__

            extern void LED_init();

            extern void LED_display();

            #endif

            這與我們在源文件中定義函數(shù)時(shí)有點(diǎn)類似。不同的是,在其前面添加了extern 修飾符表明其是一個(gè)外部函數(shù),可以被外部其它模塊進(jìn)行調(diào)用。

            10、下面我們再來看delay.c和其頭文件delay.h

            

           

            

           

            我們發(fā)現(xiàn)了一點(diǎn)一樣的地方和一點(diǎn)異樣的地方(這句話讀的我也是醉了)。

            一樣的是,對(duì)于頭文件來講,整體的框架似乎一點(diǎn)也沒有發(fā)生改變,都是下列形式。

            #ifndef __DELAY_H__

            #define __DELAY_H__

            extern ……

            …… ……

            #endif

            這是頭文件的標(biāo)準(zhǔn)編寫格式,其中__DELAY_H__這個(gè)是頭文件的名字,必須大寫,中間的橫線不能少。一般來說,頭文件的名字應(yīng)該與源文件的名字保持一致,這樣我們便可以清晰的知道哪個(gè)頭文件是哪個(gè)源文件的描述。

            而異樣的是,我們在delay.c這個(gè)文件中,發(fā)現(xiàn)有”mytype.h”這么個(gè)頭文件。那么這個(gè)是神馬,又能做神馬呢?下面我們來做一個(gè)簡單的探討。

            11、工程中的mytype.h是個(gè)什么樣的存在

            大家可能早就注意到了,這個(gè)mytype到底是何方神圣,在分析之前我們先來仔細(xì)的“打量一下”。

            

           

            通過上圖中的一段代碼,我們能夠發(fā)現(xiàn),這好像是對(duì)字符串定義表達(dá)符號(hào)的宏定義,沒錯(cuò),你猜對(duì)了!!細(xì)心的小伙伴又發(fā)現(xiàn)了,我們通常在函數(shù)中的用法跟這并不完全一樣啊,例如我們定義uint和uchar的時(shí)候,在程序中我們是這樣寫的:

            #define uint unsigned int

            #define uchar unsigned char

            那么非常好,這就是兩者不一樣的地方啦。在寫的時(shí)候注意一下就好啦。另外,在對(duì)unsigned int和unsigned char等進(jìn)行宏定義的時(shí)候,我們分別采用了多種字符來對(duì)其進(jìn)行定義,這樣做的好處是,能夠使得mytype.h這個(gè)頭文件能夠很好的適用于不同的芯片和不同編程風(fēng)格的程序員,也能夠起到方便程序進(jìn)行移植的這么一個(gè)目的。由此可見,如果我們將模塊化編程很好的運(yùn)用在項(xiàng)目開發(fā)中,能夠起到避免冗余工作量和一勞永逸的良好效果。

            好了,以上幾段代碼都帶著大家一一分析完畢,現(xiàn)在我們來進(jìn)行一下編譯,看看能不能一切順利。

            12、對(duì)編譯輸出選項(xiàng)進(jìn)行簡單設(shè)置

            

           

            按照?qǐng)D中設(shè)置完成后,點(diǎn)擊“OK”按鈕即可。

            13、點(diǎn)擊編譯按鈕

            

           

            14、打開工程文件夾路徑,我們可以查找到輸出的test.hex文件

            

           

            好了,大功告成了,第一彈宣布結(jié)束。。。

            --------------------------------------我是邪惡的分割線----------------------------------------------

            突然我發(fā)現(xiàn),我的工程文件夾里的文件亂的厲害,看到它們猶如歪瓜裂棗似的躺在工程文件夾里面,我也是醉了。。。作為一個(gè)有著強(qiáng)迫癥和密集恐懼癥的并且又有著完美主義內(nèi)心的我來講,這樣的情況我是要嚴(yán)格杜絕的!!!那么問題又來了(和挖掘機(jī)和藍(lán)翔無關(guān))。(第一彈貌似不能結(jié)束啦,goon吧)那么怎么樣才能讓他們變得乖一點(diǎn)呢?

            敬請(qǐng)關(guān)注《第一彈---單片機(jī)模塊化編程(三)》----還您的文件夾一干凈的“藍(lán)天”

          51單片機(jī)相關(guān)文章:51單片機(jī)教程


          c語言相關(guān)文章:c語言教程


          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理



          上一頁 1 2 下一頁

          關(guān)鍵詞: LED 延時(shí)函數(shù)

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁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); })();