一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

模塊化原理和方法 模塊化的方法和注意事項(xiàng)

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 2023-07-25 16:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

當(dāng)項(xiàng)目小組做一個(gè)相對(duì)較復(fù)雜的工程時(shí),意味著你不再獨(dú)自單干。而是和小組成員分工合作,這就要求小組成員各自負(fù)責(zé)一部分工程。比如你可能只是負(fù)責(zé)通訊或者顯示這一塊。

這個(gè)時(shí)候,你就應(yīng)該將自己的這一塊程序?qū)懗梢粋€(gè)模塊,單獨(dú)調(diào)試,留出接口供其它模塊調(diào)用。

最后,小組成員都將自己負(fù)責(zé)的模塊寫完并調(diào)試無誤后,由項(xiàng)目組長(zhǎng)進(jìn)行組合調(diào)試。

像這些場(chǎng)合就要求程序必須模塊化。模塊化的好處是很多的,不僅僅是便于分工,它還有助于程序的調(diào)試,有利于程序結(jié)構(gòu)的劃分,還能增加程序的可讀性和可移植性。

初學(xué)者往往搞不懂如何模塊化編程,其實(shí)它是簡(jiǎn)單易學(xué),而且又是組織良好程序結(jié)構(gòu)行之有效的方法之一。

本文將先大概講一下模塊化的方法和注意事項(xiàng),最后將以初學(xué)者使用最廣的keil c編譯器為例,給出模塊化編程的詳細(xì)步驟。

模塊化程序設(shè)計(jì)應(yīng)該理解以下概述:

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

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

1af6b2a0-2ac2-11ee-a368-dac502259ad0.png ????注:此處只寫出這兩個(gè)函數(shù),第一個(gè)延時(shí)函數(shù)的作用范圍是模塊內(nèi),第二個(gè),它是其它模塊需要的。為了簡(jiǎn)化,此處并沒有寫出函數(shù)體. ??? .h文件中給出模塊的接口.在上面的例子中, 向LCD寫入字符函數(shù):wr_lcd (uchar dat_comm,uchar content)就是一個(gè)接口函數(shù),因?yàn)槠渌K會(huì)調(diào)用它,那么.h文件中就必須將這個(gè)函數(shù)聲明為外部函數(shù)(使用extrun關(guān)鍵字修飾),另一個(gè)延時(shí)函數(shù):void delay (uint us)只是在本模塊中使用(本地函數(shù),用static關(guān)鍵字修飾),因此它是不需要放到.h文件中的。 ??? .h文件格式如下: 1b12391c-2ac2-11ee-a368-dac502259ad0.png ????這里注意三點(diǎn):

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

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

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

模塊的應(yīng)用:假如需要在LCD菜單模塊lcd_menu.c中使用液晶驅(qū)動(dòng)模塊lcd_device.c中的函數(shù)void wr_lcd (uchar dat_comm,uchar content),只需在LCD菜單模塊的lcd_menu.c文件中加入液晶驅(qū)動(dòng)模塊的頭文件lcd_device.h即可。 1b31db0a-2ac2-11ee-a368-dac502259ad0.png

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

這句話在上面的例子中已經(jīng)有體現(xiàn),即某模塊提供給其它模塊調(diào)用的外部函數(shù)和全局變量需在.h 中文件中冠以extern 關(guān)鍵字聲明。 下面重點(diǎn)說一下全局變量的使用。使用模塊化編程的一個(gè)難點(diǎn)(相對(duì)于新手)就是全局變量的設(shè)定,初學(xué)者往往很難想通模塊與模塊公用的變量是如何實(shí)現(xiàn)的,常規(guī)的做法就是本句提到的,在.h文件中外部數(shù)據(jù)冠以extern關(guān)鍵字聲明。 比如上例的變量value就是一個(gè)全局變量,若是某個(gè)模塊也使用這個(gè)變量,則和使用外部函數(shù)一樣,只需在使用的模塊.c文件中包含#include“l(fā)cd_device.h”即可。 另一種處理模塊間全局變量的方法來自于嵌入式操作系統(tǒng)uCOS-II,這個(gè)操作系統(tǒng)處理全局變量的方法比較特殊,也比較難以理解,但學(xué)會(huì)之后妙用無窮,這個(gè)方法只需用在頭文件中定義一次。方法為: 在定義所有全局變量(uCOS-II將所有全局變量定義在一個(gè).h文件內(nèi))的.h頭文件中: 1b5cd72e-2ac2-11ee-a368-dac502259ad0.png ??? .H 文件中每個(gè)全局變量都加上了xxx_EXT的前綴。xxx 代表模塊的名字。 ????該模塊的.C文件中有以下定義: 1b6f4544-2ac2-11ee-a368-dac502259ad0.png ????當(dāng)編譯器處理.C文件時(shí),它強(qiáng)制xxx_EXT(在相應(yīng).H文件中可以找到)為空,(因?yàn)閤xx_GLOBALS已經(jīng)定義)。 ????所以編譯器給每個(gè)全局變量分配內(nèi)存空間,而當(dāng)編譯器處理其他.C 文件時(shí),xxx_GLOBAL沒有定義,xxx_EXT 被定義為extern,這樣用戶就可以調(diào)用外部全局變量。為了說明這個(gè)概念,可以參見uC/OS_II.H,其中包括以下定義: 1b862eda-2ac2-11ee-a368-dac502259ad0.png ????同時(shí),uCOS_II.H 中有以下定義: 1b97ef26-2ac2-11ee-a368-dac502259ad0.png ????當(dāng)編譯器處理uCOS_II.C 時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT 被設(shè)置為空。 1ba9cb10-2ac2-11ee-a368-dac502259ad0.png ????這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C 文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒有定義,所以O(shè)S_EXT 被定義為extern。 1bbebe58-2ac2-11ee-a368-dac502259ad0.png ????在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H文件中定義一次就可以了。

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

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

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

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

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

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

永遠(yuǎn)不要在.h 文件中定義變量!

比較一下代碼: 代碼一: 1bd0161c-2ac2-11ee-a368-dac502259ad0.png ????以上程序的結(jié)果是在模塊1、2、3 中都定義了整型變量a,a 在不同的模塊中對(duì)應(yīng)不同的地址元,這個(gè)世界上從來不需要這樣的程序。正確的做法是: ????代碼二: 1be016d4-2ac2-11ee-a368-dac502259ad0.png ????這樣如果模塊1、2、3 操作a 的話,對(duì)應(yīng)的是同一片內(nèi)存單元。 ? ????注:一個(gè)嵌入式系統(tǒng)通常包括兩類(注意是兩類,不是兩個(gè))模塊:

硬件驅(qū)動(dòng)模塊,一種特定硬件對(duì)應(yīng)一個(gè)模塊;

軟件功能模塊,其模塊的劃分應(yīng)滿足低偶合、高內(nèi)聚的要求。

責(zé)任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95261
  • 模塊化
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    22001
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50228
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    模塊化UPS電源設(shè)備的配置

    模塊化UPS電源是重要的電氣設(shè)備,為高效發(fā)揮其功能,從模塊化UPS電源設(shè)備的主要組成部分——主機(jī)柜、強(qiáng)電柜、蓄電池、電池開關(guān)柜、電池架、連接線纜等方面,分析了合理配置模塊化UPS電源的方法
    發(fā)表于 11-01 14:36 ?2117次閱讀

    精粹的c語言,模塊化的c編程方法

    精粹的c語言,模塊化的c編程方法希望本資料能夠有所對(duì)你助力。
    發(fā)表于 10-11 14:50

    單片機(jī)的C語言模塊化編程

    詳細(xì)介紹了主函數(shù)、頭文件等,詳細(xì)介紹了在KEIL軟件下的編程步驟,解讀了單片機(jī)模塊化編程的步驟,以及注意事項(xiàng)。
    發(fā)表于 06-13 16:21

    嵌入式系統(tǒng)模塊化設(shè)計(jì)有什么方法

    嵌入式系統(tǒng)設(shè)計(jì)要求做到可測(cè)性、高效性和靈活性。目前,嵌入式系統(tǒng)物理尺寸越來越小,功能越來越復(fù)雜。為了方便調(diào)試、維護(hù)系統(tǒng),完全可測(cè)顯得極為重要。另一方面,模塊化的設(shè)計(jì)方法越來越引起人們的關(guān)注。模塊化
    發(fā)表于 08-23 07:31

    到底什么是模塊化編程?

    對(duì)于一些接觸單片機(jī)編程不久的小萌新來說,模塊化編程這個(gè)概念剛接觸的時(shí)候可能會(huì)很懵,到底什么是模塊化編程?我以前也不懂,后面根據(jù)網(wǎng)上的說明和自己對(duì)庫(kù)函數(shù)例程的分析,已經(jīng)完全掌握了這門技能。 模塊化編程
    發(fā)表于 12-03 07:39

    什么是模塊化編程?模塊化編程的注意事項(xiàng)

    單片機(jī)零基礎(chǔ)入門(8-4)模塊化編程---LED1602調(diào)試工具一、回顧二、什么是模塊化編程?1、傳統(tǒng)方式編程:2、模塊化編程3、模塊化編程框圖3、
    發(fā)表于 02-23 07:14

    模塊化程序設(shè)計(jì)簡(jiǎn)單解釋

    方法。在單片機(jī)的簡(jiǎn)單解釋:把各個(gè)模塊的代碼放在不同的.c文件里,在.h文件里提供外部可調(diào)用函數(shù)的聲明,其它.c文件想使用其中的代碼時(shí),只需要#include "XXX.h"文件即可。使用模塊化編程可極大的提高代碼的可閱讀性、可維
    發(fā)表于 02-23 06:05

    模塊化Java:動(dòng)態(tài)模塊化

    在前一篇文章《模塊化Java:靜態(tài)模塊化》中,我們討論了如何構(gòu)建Java模 塊并將其作為一個(gè)單獨(dú)的JAR進(jìn)行部署。文中的例子給出了一個(gè)client和一個(gè) server bundle(兩者在同一個(gè)VM中)
    發(fā)表于 12-01 11:54 ?24次下載

    串行RapidIO提升模塊化基站設(shè)計(jì)

    串行RapidIO提升模塊化基站設(shè)計(jì) 蜂窩基站的模塊化設(shè)計(jì)和制造對(duì)組合視頻、語音和數(shù)據(jù)等 3G 移動(dòng)服務(wù),即通常所說的“三重服務(wù)”至關(guān)重要。但是,為什么模塊化設(shè)計(jì)
    發(fā)表于 03-10 13:56 ?1218次閱讀
    串行RapidIO提升<b class='flag-5'>模塊化</b>基站設(shè)計(jì)

    基于模塊化設(shè)計(jì)方法實(shí)現(xiàn)FPGA動(dòng)態(tài)部分重構(gòu)

      動(dòng)態(tài)部分重構(gòu)可以通過兩種方法實(shí)現(xiàn):基于模塊化設(shè)計(jì)方法(Module-Based ParTIal Reconfiguration)和基于差別的設(shè)計(jì)方法(Difference-Base
    發(fā)表于 08-23 10:35 ?904次閱讀
    基于<b class='flag-5'>模塊化</b>設(shè)計(jì)<b class='flag-5'>方法</b>實(shí)現(xiàn)FPGA動(dòng)態(tài)部分重構(gòu)

    012-IIC總線原理和模塊化編程方法

    云龍單片機(jī)—IIC總線原理和模塊化編程方法。
    發(fā)表于 03-17 11:03 ?7次下載

    模塊化程序設(shè)計(jì)

    模塊化程序設(shè)計(jì)思想,單片機(jī)c語言的模塊化設(shè)計(jì),方便移植,將程序封裝備用。
    發(fā)表于 03-22 15:29 ?9次下載

    模塊化方法注意事項(xiàng)

    這一條概括了模塊化的實(shí)現(xiàn)方法和實(shí)質(zhì):將一個(gè)功能模塊的代碼單獨(dú)編寫成一個(gè).c文件,然后把該模塊的接口函數(shù)放在.h文件中.舉例:假如你用到液晶顯示,那么你可能會(huì)寫一個(gè)液晶驅(qū)動(dòng)
    的頭像 發(fā)表于 09-20 10:37 ?3472次閱讀

    什么是模塊化自動(dòng)?

    什么是模塊化自動(dòng)?
    的頭像 發(fā)表于 03-10 16:29 ?3317次閱讀
    什么是<b class='flag-5'>模塊化</b>自動(dòng)<b class='flag-5'>化</b>?

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

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