




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、模塊化編程基礎田欣興當你在一個項目小組中與人共同開發一個相對較復雜的項目時,意味著你不再單干,你需要與項目小組中的其他成員分工合作,一起完成這個項目。這就要求小組成員各自負責一部分項目。比如:你在項目小組中負責通信模塊,其他人負責其他模塊,這就需要你將通信這一模塊寫成一個模塊,單獨調試,留出接口供其他模塊的調用。最后由項目組長整合所有模塊。像這些場合就要求將程序模塊化。模塊化的好處有很多,不僅僅是便于分工,它還有助于程序的調試,有利于程序結構的劃分,還增加了程序的可讀性和可移植性。程序模塊即一個“.c”文件和一個“.h”文件的結合,頭文件(.h)中對于該模塊接口進行聲明。舉例說明:假如你用的液
2、晶顯示,那么你可能寫一個液晶驅動模塊,用來實現字符、漢字或者圖像的顯示,命名為lcd12864.c,該模塊的.c文件大體可以寫成:/*/ 模塊名稱(Module Name):LCD12864驅動模塊/ 創建日期(Create Date):2012年12月23日/ 模塊功能(Function ):驅動LCD12864進行顯示/ 修改日期(Modify Date):/ 其他說明(Others ):/*#includelcd12864.h/定義變量unsigned char busy;/定義函數/*/ 函數名稱(Function Name):Lcd_delay_ms/ 創建日期(Create Dat
3、e ):2012年12月/ 函數功能(Function ):毫秒級延時/ 輸入參數(Input ):uint t(065535)/ 輸出參數(Output ):無/ 返回信息(Return ):無/*Static void Lcd_delay_ms(uint t)2 / 10/程序部分/*/ 函數名稱(Function Name):Lcd_Write/ 創建日期(Create Date ):2012年12月/ 函數功能(Function ):向12864模塊寫入指令或數據/ 輸入參數(Input ):uchar type;0:數據,1:命令uchar data;發送的數據/ 輸出參數(Outp
4、ut ):無/ 返回信息(Return ):無/*Void Lcd_Write(uchar type; uchar dara)/程序部分/結束注:此處只寫出兩個函數,一個只在模塊內部調用,一個在外部調用。.h文件中給出模塊的接口。在.c文件中,第二個函數就是一個接口函數,因為其他的模塊會調用它,那么在.h文件中必須將這個函數聲明成外部函數(使用extrun關鍵字修飾),而第一個函數只在本模塊中使用(本地函數,用static關鍵字修飾),因此它是不需要放到.h文件中的。Lcd12864.h文件大體可以寫成:/*/ 模塊名稱(Module Name):LCD12864驅動模塊/ 創建日期(Crea
5、te Date):2012年12月23日/ 模塊功能(Function ):驅動LCD12864進行顯示/ 修改日期(Modify Date):/ 其他說明(Others ):/*#ifndef _LCD12864_H_#define _LCD12864_H_/聲明全局變量/聲明接口函數#endif/結束注:1、在keil中即使不使用extern關鍵字,軟件也不會報錯,并且程序運行良好,但其他編譯器不能保證。 2、.c中的函數只有在其他模塊中使用時,才會出現在.h文件中。 3、注意在聲明函數時在最后要添加分號。當在main.c文件中使用lcd12864.c中的函數時,只需在main.c中添加一
6、條“#includelcd12864.h/包含液晶驅動程序頭文件”即可使用lcd12864.h中聲明的所有函數和變量。(二)、某模塊提供給其他模塊調用的外部函數及其數據需在.h文件中冠以extern關鍵字聲明。全局變量的使用:常規的做法是在.h文件中外部數據冠以extern關鍵字聲明。比如:全局變量year,若某個模塊也使用這個變量,只需在使用的.c文件中包含該變量的頭文件即可。另一種做法:這個方法只需在頭文件中定義一次。方法為:在定義所有全局變量的.h文件中做如下定義:#ifndef xxx_GLOBALS#define xxx_EXT#else#define xxx_EXT extern#
7、endif.h文件中每個全局變量都加了xxx_EXT的前綴。Xxx代表模塊的名字。該模塊的.c文件中有以下定義:#define xxx_GLOBALS#includeincludes.h當編譯器處理.c文件時,它強制xxx_EXT為空,(因為xxx_GLOBALS已經定義)。所以編譯器會給每個全局變量分配內存空間,而當編譯器處理其他.c文件時,xxx_GLOBALS沒有定義,xxx_EXT被定義為extern,這樣用戶就可以調用外部全局變量舉例說明:參考uC/OS_II.H#ifndef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#en
8、difOS_EXT INT32U OSIdleCtr;OS_EXT INT32U OSIdleCtrRun;OS_EXT INT32U OSIdleCtrMax;同時在uCOS_II.H中有以下定義:#define OS_GLOBALS#includeincludes.h當編譯器在處理uCOS_II.C時,它就會使得頭文件變成如下所示:INT32U OSIdleCtr;INT32U OSIdleCtrRun;INT32U OSIdleCtrMax;這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.c文件時,由于沒有定義OS_GLOBALS,所以OS_EXT被定義為extern。ext
9、ern INT32U OSIdleCtr;extern INT32U OSIdleCtrRun;extern INT32U OSIdleCtrMax; 在這種情況下,不產生內存分配,而任何.c文件都可以使用這些變量。這樣的就只需在.h文件中定義一次就可以了。(三)、模塊內部的函數和全局變量需在.c文件開頭冠以static關鍵字聲明;Static 是一個相當重要的關鍵字,他能對函數和變量做一些約束,而且可以傳遞一些信息。其約束為:被static聲明的函數只用于本模塊,其信息為:其他模塊無法調用static聲明的函數Static的作用:1、在函數體,一個被聲明為靜態的變量在這一函數被調用的過程中維
10、持其值不變;2、在模塊內,但在函數體外,一個被聲明為靜態的變量可以被模塊內的任意函數調用,但不能被其他模塊調用,它是一個本地的全局變量。3、在模塊內,一個被聲明為靜態的函數,只可被這一模塊內的其他函數調用。永遠不要在.h文件中定義變量。/*Module1.h*/Int a=5;/*Module2.c*/#includemodule1.h/*Module3.c*/#includemodule1.h以上程序的運行結果是:在模塊1.模塊2和模塊3中,都定義了,整形變量a,a在不同的模塊中對應不同的地址單元。正確做法是:/*Module1.h*/Extern int a=5;/*Module1.c*/
11、Int a=5;/*Module2.c*/#includemodule1.h/*Module3.c*/#includemodule1.h這樣在模塊1、2、3中操作A的話,對應的是同一內存單元。一個嵌入式系統通常包括2類模塊:1、硬件驅動模塊,一種特定硬件對應一個模塊;2、軟件功能模塊,其模塊劃分應滿足低耦合,高內聚的要求。參考文獻:1、 E.W.Dijkstra.Go To Statement Consider Harmful2、 D.L.Parnas.Information Distribution Aspects of Design Merhodology3、 O-J.Dahl and C.A.R hoar.Hierarchical Program Structures4、 J.H.Morris.Protection in Programming Languages5、 N.Wirth.Program Development by Stepwise Refinement6、 B.Liskov.A Design Methodology for Reliable Soft
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《網絡主播培養與直播銷售實戰(AIGC版)》課件 第4章 主播素質培養
- 企業形象設計現狀分析
- 中暑急救處理措施
- 普外科中醫特色護理查房
- 疫情下的大學生心理健康教育
- 學校健康素養課件
- 胸腔閉式引流的觀察和護理
- 酶缺乏疾病的病理機制與診療進展
- 認識平面圖形教學設計
- 會員折扣合同范本
- 反射療法師理論考試復習題及答案
- 2023版中職教材-心理健康與職業生涯-第11課-主動學習-高效學習-課件
- 2024年重慶市高考思想政治試卷真題(含答案解析)
- 2024春期國開電大本科《外國文學》在線形考(形考任務一至四)試題及答案
- 陽光雨棚制作安裝合同范本
- 福建小鳳鮮禽業有限公司100萬羽蛋雞養殖基地項目環境影響報告書
- CJT 489-2016 塑料化糞池 標準
- 2024中考語文語言運用考點備考試題精練 (含答案)
- 苗木供應質量保證措施方案
- 2022-2023學年廣東省廣州市番禺區教科版(廣州)四年級下冊期末測試英語題卷(無答案)
- 【蔚來新能源汽車營銷策略探究9200字(論文)】
評論
0/150
提交評論