在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

模塊化的方法和注意事項

Q4MP_gh_c472c21 ? 來源:技術讓夢想更偉大 ? 2020-09-20 10:37 ? 次閱讀

引言

我們在一個項目小組做一個相對較復雜的工程時,意味著你不再獨自單干。而是和小組成員分工合作,這就要求小組成員各自負責一部分工程。比如你可能只是負責通訊或者顯示這一塊。

這個時候,你就應該將自己的這一塊程序寫成一個模塊,單獨調試,留出接口供其它模塊調用。最后,小組成員都將自己負責的模塊寫完并調試無誤后,由項目組長進行組合調試。像這些場合就要求程序必須模塊化。模塊化的好處是很多的,不僅僅是便于分工,它還有助于程序的調試,有利于程序結構的劃分,還能增加程序的可讀性和可移植性。

要說的話

初學者往往搞不懂如何模塊化編程,其實它是簡單易學,而且又是組織良好程序結構行之有效的方法之一。 本文將先大概講一下模塊化的方法和注意事項,最后將以初學者使用最廣的keil c編譯器為例,給出模塊化編程的詳細步驟。 模塊化程序設計應該理解以下概述:

模塊即是一個.c 文件和一個.h 文件的結合,頭文件(.h)中是對于該模塊接口的聲明;

這一條概括了模塊化的實現(xiàn)方法和實質:將一個功能模塊的代碼單獨編寫成一個.c文件,然后把該模塊的接口函數(shù)放在.h文件中.舉例:假如你用到液晶顯示,那么你可能會寫一個液晶驅動模塊,以實現(xiàn)字符、漢字和圖像的現(xiàn)實,命名為: led_device.c,該模塊的.c文件大體可以寫成:

#include … … //定義變量 unsigned char value;//全局變量 … //定義函數(shù) //這是本模塊第一個函數(shù),起到延時作用,只供本模塊的函數(shù)調用,所以用到static關鍵字修飾 /********************延時子程序************************/ static void delay (uint us) //delay time {} //這是本模塊的第二個函數(shù),要在其他模塊中調用 /*********************寫字符程序************************** ** 功能:向LCD寫入字符 ** 參數(shù):dat_comm 為1寫入的是數(shù)據(jù),為0寫入的是指令 content 為寫入的數(shù)字或指令 ******************************************************/ void wr_lcd (uchar dat_comm,uchar content) {} …… …… /***************************** END Files***********************************/ 注:此處只寫出這兩個函數(shù),第一個延時函數(shù)的作用范圍是模塊內,第二個,它是其它模塊需要的。為了簡化,此處并沒有寫出函數(shù)體. .h文件中給出模塊的接口.在上面的例子中, 向LCD寫入字符函數(shù):wr_lcd (uchar dat_comm,uchar content)就是一個接口函數(shù),因為其它模塊會調用它,那么.h文件中就必須將這個函數(shù)聲明為外部函數(shù)(使用extrun關鍵字修飾),另一個延時函數(shù):void delay (uint us)只是在本模塊中使用(本地函數(shù),用static關鍵字修飾),因此它是不需要放到.h文件中的。 .h文件格式如下://聲明全局變量 extern unsigned char value; //聲明接口函數(shù) extern void wr_lcd (uchar dat_comm,uchar content); //向LCD寫入字符 …… /***************************** END Files***********************************/ 這里注意三點:

在keil 編譯器中,extern這個關鍵字即使不聲明,編譯器也不會報錯,且程序運行良好,但不保證使用其它編譯器也如此。強烈建議加上,養(yǎng)成良好的編程規(guī)范。

.c文件中的函數(shù)只有其它模塊使用時才會出現(xiàn)在.h文件中,像本地延時函數(shù)static void delay (uint us)即使出現(xiàn)在.h文件中也是在做無用功,因為其它模塊根本不去調用它,實際上也調用不了它(static關鍵字的限制作用)。

注意本句最后一定要加分號”;”,相信有不少同學遇到過這個奇怪的編譯器報錯: error C132: 'xxxx': not in formal parameter list,這個錯誤其實是.h的函數(shù)聲明的最后少了分號的緣故。

模塊的應用:假如需要在LCD菜單模塊lcd_menu.c中使用液晶驅動模塊lcd_device.c中的函數(shù)void wr_lcd (uchar dat_comm,uchar content),只需在LCD菜單模塊的lcd_menu.c文件中加入液晶驅動模塊的頭文件lcd_device.h即可.

#include“l(fā)cd_device.h //包含液晶驅動程序頭文件,之后就可以在該.c文件中調用//lcd_device.h中的全局函數(shù),使用液晶驅動程序里的全局//變量(如果有的話)。 … //調用向LCD寫入字符函數(shù) wr_lcd (0x01,0x30); … //對全局變量賦值 value=0xff; …

某模塊提供給其它模塊調用的外部函數(shù)及數(shù)據(jù)需在.h 中文件中冠以extern 關鍵字聲明;

這句話在上面的例子中已經有體現(xiàn),即某模塊提供給其它模塊調用的外部函數(shù)和全局變量需在.h 中文件中冠以extern 關鍵字聲明,下面重點說一下全局變量的使用。使用模塊化編程的一個難點(相對于新手)就是全局變量的設定,初學者往往很難想通模塊與模塊公用的變量是如何實現(xiàn)的,常規(guī)的做法就是本句提到的,在.h文件中外部數(shù)據(jù)冠以extern關鍵字聲明。 比如上例的變量value就是一個全局變量,若是某個模塊也使用這個變量,則和使用外部函數(shù)一樣,只需在使用的模塊.c文件中包含#include“l(fā)cd_device.h”即可。 另一種處理模塊間全局變量的方法來自于嵌入式操作系統(tǒng)uCOS-II,這個操作系統(tǒng)處理全局變量的方法比較特殊,也比較難以理解,但學會之后妙用無窮,這個方法只需用在頭文件中定義一次。方法為: 在定義所有全局變量(uCOS-II將所有全局變量定義在一個.h文件內)的.h頭文件中:

#ifdef xxx_GLOBALS #define xxx_EXT #else #define xxx_EXT extern #endif .H 文件中每個全局變量都加上了xxx_EXT的前綴。xxx 代表模塊的名字。 該模塊的.C文件中有以下定義:#define xxx_GLOBALS #include "includes.h" 當編譯器處理.C文件時,它強制xxx_EXT(在相應.H文件中可以找到)為空,(因為xxx_GLOBALS已經定義)。 所以編譯器給每個全局變量分配內存空間,而當編譯器處理其他.C 文件時,xxx_GLOBAL沒有定義,xxx_EXT 被定義為extern,這樣用戶就可以調用外部全局變量。為了說明這個概念,可以參見uC/OS_II.H,其中包括以下定義: #ifdef OS_GLOBALS #define OS_EXT #else #define OS_EXT extern #endif OS_EXT INT32U OSIdleCtr; OS_EXT INT32U OSIdleCtrRun; OS_EXT INT32U OSIdleCtrMax; 同時,uCOS_II.H 中有以下定義:#define OS_GLOBALS #include “includes.h” 當編譯器處理uCOS_II.C 時,它使得頭文件變成如下所示,因為OS_EXT 被設置為空。INT32U OSIdleCtr; INT32U OSIdleCtrRun; INT32U OSIdleCtrMax; 這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.C 文件時,頭文件變成了如下的樣子,因為OS_GLOBAL沒有定義,所以OS_EXT 被定義為extern。extern INT32U OSIdleCtr; extern INT32U OSIdleCtrRun; extern INT32U OSIdleCtrMax; 在這種情況下,不產生內存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H文件中定義一次就可以了。

模塊內的函數(shù)和全局變量需在.c 文件開頭冠以static 關鍵字聲明;

這句話主要講述了關鍵字static的作用。Static是一個相當重要的關鍵字,他能對函數(shù)和變量做一些約束,而且可以傳遞一些信息。 比如上例在LCD驅動模塊.c文件中定義的延時函數(shù)static void delay (uint us),這個函數(shù)冠以static修飾,一方面是限定了函數(shù)的作用范圍只是在本模塊中起作用,另一方面也給人傳達這樣的信息:該函數(shù)不會被其他模塊調用。 下面詳細說一下這個關鍵字的作用,在C 語言中,關鍵字static 有三個明顯的作用:

在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調用過程中維持其值不變。

在模塊內(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。

在模塊內,一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內的其它函數(shù)調用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內使用。

前兩個都比較容易理解,最后一個作用就是剛剛舉例中提到的延時函數(shù)(static void delay (uint us)),本地化函數(shù)是有相當好的作用的。

永遠不要在.h 文件中定義變量!

比較一下代碼: 代碼一:

/*module1.h*/ int a = 5; /* 在模塊1 的.h 文件中定義int a */ /*module1 .c*/ #include "module1.h" /* 在模塊1 中包含模塊1 的.h 文件 */ /*module2 .c*/ #include "module1.h" /* 在模塊2 中包含模塊1 的.h 文件 */ /*module3 .c*/ #include "module1.h" /* 在模塊3 中包含模塊1 的.h 文件 */ 以上程序的結果是在模塊1、2、3 中都定義了整型變量a,a 在不同的模塊中對應不同的地址元,這個世界上從來不需要這樣的程序。正確的做法是: 代碼二:/*module1.h*/ extern int a; /* 在模塊1 的.h 文件中聲明int a */ /*module1 .c*/ #include "module1.h" /* 在模塊1 中包含模塊1 的.h 文件 */ int a = 5; /* 在模塊1 的.c 文件中定義int a */ /*module2 .c*/ #include "module1.h" /* 在模塊2 中包含模塊1 的.h 文件 */ /*module3 .c*/ #include "module1.h" /* 在模塊3 中包含模塊1 的.h 文件 */ 這樣如果模塊1、2、3 操作a 的話,對應的是同一片內存單元。 注: 一個嵌入式系統(tǒng)通常包括兩類(注意是兩類,不是兩個)模塊:

硬件驅動模塊,一種特定硬件對應一個模塊;

軟件功能模塊,其模塊的劃分應滿足低偶合、高內聚的要求。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4344

    瀏覽量

    62824
  • 模塊化
    +關注

    關注

    0

    文章

    332

    瀏覽量

    21397
  • 編譯器
    +關注

    關注

    1

    文章

    1640

    瀏覽量

    49209

原文標題:模塊化編程到底有多重要?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    模塊化插座接線方法有哪些

    擴展或改變插座的功能。以下是一些模塊化插座接線方法的概述,以及一些安全和安裝的注意事項。 1. 基本接線方法 模塊化插座的基本接線
    的頭像 發(fā)表于 10-18 09:50 ?696次閱讀

    毫伏表的使用方法注意事項

    毫伏表是一種用于測量電壓的電子儀器,特別擅長于測量毫伏級以下的微小電壓,包括微伏交流電壓。這種儀器在電子學和電氣工程中有著廣泛的應用,是電子電路初學者必備的測量設備之一。毫伏表的使用方法注意事項如下:
    的頭像 發(fā)表于 10-03 16:21 ?1116次閱讀

    繞線電感定制的注意事項

    電子發(fā)燒友網站提供《繞線電感定制的注意事項.docx》資料免費下載
    發(fā)表于 09-20 11:24 ?0次下載

    對電源模塊進行焊接的注意事項

    電子發(fā)燒友網站提供《對電源模塊進行焊接的注意事項.pdf》資料免費下載
    發(fā)表于 09-20 11:07 ?0次下載
    對電源<b class='flag-5'>模塊</b>進行焊接的<b class='flag-5'>注意事項</b>

    光纖收發(fā)器的使用方法注意事項

    光纖收發(fā)器作為光纖通信系統(tǒng)中的關鍵設備,其正確的使用方法注意事項對于確保網絡傳輸?shù)姆€(wěn)定性和可靠性至關重要。光纖收發(fā)器作為光纖通信系統(tǒng)中的關鍵設備,其正確的使用方法注意事項對于確保網
    的頭像 發(fā)表于 08-26 15:20 ?1104次閱讀

    現(xiàn)場總線的使用方法注意事項

    的穩(wěn)定可靠運行,正確的使用方法注意事項至關重要。本文將詳細介紹現(xiàn)場總線的使用方法注意事項,以供讀者參考。
    的頭像 發(fā)表于 06-06 11:49 ?844次閱讀

    MPPT控制器的安裝方法注意事項

    的正常運行和延長其使用壽命,正確的安裝方法注意事項至關重要。本文將對MPPT控制器的安裝方法注意事項進行詳細闡述。
    的頭像 發(fā)表于 06-03 18:09 ?1958次閱讀

    鉗形電流表的使用方法注意事項

    鉗形電流表,作為電氣測量和測試的重要工具,其使用方法注意事項對于保障測量結果的準確性和操作人員的安全至關重要。本文將從鉗形電流表的使用方法注意事項兩個方面進行詳細闡述,以期為讀者提
    的頭像 發(fā)表于 05-14 16:14 ?3626次閱讀

    電阻測試儀的使用方法注意事項

    注意事項仍然是確保測試準確度和設備安全的關鍵。本文將對電阻測試儀的使用方法注意事項進行詳細闡述,以期為使用者提供參考。
    的頭像 發(fā)表于 05-11 16:27 ?4062次閱讀

    數(shù)字萬用表的使用方法注意事項

    數(shù)字萬用表的使用方法注意事項
    的頭像 發(fā)表于 05-07 16:50 ?857次閱讀

    FMD LINK 使用注意事項

    電子發(fā)燒友網站提供《FMD LINK 使用注意事項.pdf》資料免費下載
    發(fā)表于 05-06 10:11 ?0次下載

    DC電源模塊的使用注意事項和安全規(guī)范

    BOSHIDA DC電源模塊的使用注意事項和安全規(guī)范 DC電源模塊在電子設備的設計和實驗中起到了至關重要的作用。然而,為了確保安全和可靠性,使用DC電源模塊時需要
    的頭像 發(fā)表于 04-03 14:09 ?533次閱讀
    DC電源<b class='flag-5'>模塊</b>的使用<b class='flag-5'>注意事項</b>和安全規(guī)范

    模塊使用可能遇到的問題以及注意事項

    模塊使用中常見問題及注意事項:兼容性問題、溫度問題、插拔操作問題、故障診斷問題。
    的頭像 發(fā)表于 03-11 15:32 ?968次閱讀

    藍白可調電阻焊接方法 藍白可調電阻焊接注意事項

    藍白可調電阻焊接方法 藍白可調電阻焊接注意事項? 藍白可調電阻焊接是電路中常用的元件之一,它具有阻值可以手動調節(jié)的特點。在不同電路設計中,藍白可調電阻廣泛應用于模擬電路的增益調節(jié)、音量控制、亮度控制
    的頭像 發(fā)表于 03-06 15:23 ?1502次閱讀

    鋰電池充電方法的介紹以及注意事項

    鋰電池是目前最常見和使用最廣泛的電池之一,具有高能量密度、輕巧、無記憶效應等優(yōu)點。充電是鋰電池的一項重要操作,正確的充電方法注意事項能夠有效延長鋰電池的壽命,保持其性能穩(wěn)定。下面將詳細介紹鋰電池
    的頭像 發(fā)表于 01-22 17:42 ?1.2w次閱讀
    主站蜘蛛池模板: 黄色免费毛片| 久久青草精品一区二区三区| 在线天堂中文字幕| 成人a网| 最新天堂| 午夜色福利| 日韩电影中文字幕| 久久婷婷国产综合精品| 国产偷窥女洗浴在线观看亚洲| 国产 麻豆 欧美亚洲综合久久| 在线国产播放| 免费看片你懂的| 色老头久久久久| 四虎成人欧美精品在永久在线| 日本黄色大片免费观看| 久久青草国产精品一区| 丁香婷婷六月天| 天天射日日操| 午夜小片| seba51久久精品| 午夜毛片视频高清不卡免费| 免费一级特黄3大片视频| 综合7799亚洲伊人爱爱网| 亚洲国产一区二区三区在线观看| 永久免费人成网ww555kkk手机| 免费看黄资源大全高清| 成人人免费夜夜视频观看| 中文字幕xxx| 亚洲香蕉影院| 欧美日韩在线成人免费| 国产精品嫩草影院午夜| 天天干天天干天天| 神马午夜98| 福利体验区| 国产在线麻豆自在拍91精品| 四虎免费永久观看| 国产一区二区高清在线| 天堂网www天堂在线网| 57pao成人永久免费视频| 亚洲成a人片在线观看尤物| 美女视频永久黄网站免费观看国产 |