chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

Q4MP_gh_c472c21 ? 來(lái)源:技術(shù)讓夢(mèng)想更偉大 ? 2020-09-20 10:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

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

這個(gè)時(shí)候,你就應(yīng)該將自己的這一塊程序?qū)懗梢粋€(gè)模塊,單獨(dú)調(diào)試,留出接口供其它模塊調(diào)用。最后,小組成員都將自己負(fù)責(zé)的模塊寫(xiě)完并調(diào)試無(wú)誤后,由項(xiàng)目組長(zhǎng)進(jìn)行組合調(diào)試。像這些場(chǎng)合就要求程序必須模塊化。模塊化的好處是很多的,不僅僅是便于分工,它還有助于程序的調(diào)試,有利于程序結(jié)構(gòu)的劃分,還能增加程序的可讀性和可移植性。

要說(shuō)的話(huà)

初學(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ú)編寫(xiě)成一個(gè).c文件,然后把該模塊的接口函數(shù)放在.h文件中.舉例:假如你用到液晶顯示,那么你可能會(huì)寫(xiě)一個(gè)液晶驅(qū)動(dòng)模塊,以實(shí)現(xiàn)字符、漢字和圖像的現(xiàn)實(shí),命名為: led_device.c,該模塊的.c文件大體可以寫(xiě)成:

#include … … //定義變量 unsigned char value;//全局變量 … //定義函數(shù) //這是本模塊第一個(gè)函數(shù),起到延時(shí)作用,只供本模塊的函數(shù)調(diào)用,所以用到static關(guān)鍵字修飾 /********************延時(shí)子程序************************/ static void delay (uint us) //delay time {} //這是本模塊的第二個(gè)函數(shù),要在其他模塊中調(diào)用 /*********************寫(xiě)字符程序************************** ** 功能:向LCD寫(xiě)入字符 ** 參數(shù):dat_comm 為1寫(xiě)入的是數(shù)據(jù),為0寫(xiě)入的是指令 content 為寫(xiě)入的數(shù)字或指令 ******************************************************/ void wr_lcd (uchar dat_comm,uchar content) {} …… …… /***************************** END Files***********************************/ 注:此處只寫(xiě)出這兩個(gè)函數(shù),第一個(gè)延時(shí)函數(shù)的作用范圍是模塊內(nèi),第二個(gè),它是其它模塊需要的。為了簡(jiǎn)化,此處并沒(méi)有寫(xiě)出函數(shù)體. .h文件中給出模塊的接口.在上面的例子中, 向LCD寫(xiě)入字符函數(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文件格式如下://聲明全局變量 extern unsigned char value; //聲明接口函數(shù) extern void wr_lcd (uchar dat_comm,uchar content); //向LCD寫(xiě)入字符 …… /***************************** END Files***********************************/ 這里注意三點(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文件中也是在做無(wú)用功,因?yàn)槠渌K根本不去調(diào)用它,實(shí)際上也調(diào)用不了它(static關(guān)鍵字的限制作用)。

注意本句最后一定要加分號(hào)”;”,相信有不少同學(xué)遇到過(guò)這個(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即可.

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

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

這句話(huà)在上面的例子中已經(jīng)有體現(xiàn),即某模塊提供給其它模塊調(diào)用的外部函數(shù)和全局變量需在.h 中文件中冠以extern 關(guān)鍵字聲明,下面重點(diǎn)說(shuō)一下全局變量的使用。使用模塊化編程的一個(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”即可。 另一種處理模塊間全局變量的方法來(lái)自于嵌入式操作系統(tǒng)uCOS-II,這個(gè)操作系統(tǒng)處理全局變量的方法比較特殊,也比較難以理解,但學(xué)會(huì)之后妙用無(wú)窮,這個(gè)方法只需用在頭文件中定義一次。方法為: 在定義所有全局變量(uCOS-II將所有全局變量定義在一個(gè).h文件內(nèi))的.h頭文件中:

#ifdef xxx_GLOBALS #define xxx_EXT #else #define xxx_EXT extern #endif .H 文件中每個(gè)全局變量都加上了xxx_EXT的前綴。xxx 代表模塊的名字。 該模塊的.C文件中有以下定義:#define xxx_GLOBALS #include "includes.h" 當(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沒(méi)有定義,xxx_EXT 被定義為extern,這樣用戶(hù)就可以調(diào)用外部全局變量。為了說(shuō)明這個(gè)概念,可以參見(jiàn)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; 同時(shí),uCOS_II.H 中有以下定義:#define OS_GLOBALS #include “includes.h” 當(dāng)編譯器處理uCOS_II.C 時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT 被設(shè)置為空。INT32U OSIdleCtr; INT32U OSIdleCtrRun; INT32U OSIdleCtrMax; 這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C 文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒(méi)有定義,所以O(shè)S_EXT 被定義為extern。extern INT32U OSIdleCtr; extern INT32U OSIdleCtrRun; extern INT32U OSIdleCtrMax; 在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H文件中定義一次就可以了。

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

這句話(huà)主要講述了關(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ì)說(shuō)一下這個(gè)關(guān)鍵字的作用,在C 語(yǔ)言中,關(guān)鍵字static 有三個(gè)明顯的作用:

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

在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪(fǎng)問(wèn),但不能被模塊外其它函數(shù)訪(fǎng)問(wèn)。它是一個(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 文件中定義變量!

比較一下代碼: 代碼一:

/*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 文件 */ 以上程序的結(jié)果是在模塊1、2、3 中都定義了整型變量a,a 在不同的模塊中對(duì)應(yīng)不同的地址元,這個(gè)世界上從來(lái)不需要這樣的程序。正確的做法是: 代碼二:/*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 的話(huà),對(duì)應(yīng)的是同一片內(nèi)存單元。 注: 一個(gè)嵌入式系統(tǒng)通常包括兩類(lèi)(注意是兩類(lèi),不是兩個(gè))模塊:

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

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

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

    關(guān)注

    0

    文章

    356

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51616

原文標(biāo)題:模塊化編程到底有多重要?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    預(yù)端接光配線(xiàn)架的安裝與維護(hù)注意事項(xiàng)有哪些?

    預(yù)端接光配線(xiàn)架憑借其模塊化、高密度和即插即用的特性,廣泛應(yīng)用于數(shù)據(jù)中心、企業(yè)園區(qū)等場(chǎng)景。為確保其性能穩(wěn)定、延長(zhǎng)使用壽命,安裝與維護(hù)需嚴(yán)格遵循規(guī)范。以下是具體注意事項(xiàng): 一、安裝注意事項(xiàng) 1.
    的頭像 發(fā)表于 12-30 10:26 ?229次閱讀

    請(qǐng)問(wèn)CW32F030的硬件注意事項(xiàng)有哪些?

    CW32F030的硬件注意事項(xiàng)有哪些
    發(fā)表于 12-25 08:20

    請(qǐng)問(wèn)IAP功能升級(jí)流程中有哪些注意事項(xiàng)?

    IAP 功能升級(jí)流程中有哪些注意事項(xiàng)?
    發(fā)表于 12-23 07:55

    迅為RK3588開(kāi)發(fā)板Android系統(tǒng)燒寫(xiě)及注意事項(xiàng)

    迅為RK3588開(kāi)發(fā)板Android系統(tǒng)燒寫(xiě)及注意事項(xiàng)
    的頭像 發(fā)表于 12-03 15:17 ?7174次閱讀
    迅為RK3588開(kāi)發(fā)板Android系統(tǒng)燒寫(xiě)及<b class='flag-5'>注意事項(xiàng)</b>

    驅(qū)動(dòng)板PCB布線(xiàn)的注意事項(xiàng)

    PCB Layout 注意事項(xiàng) 1)布局注意事項(xiàng): ●● 整體布局遵循功率回路與小信號(hào)控制回路分開(kāi)布局原則,功率部分和控制部分的 GND 分開(kāi)回流到輸入 GND。 ●● 芯片的放置方向優(yōu)先考慮驅(qū)動(dòng)
    發(fā)表于 12-02 07:40

    Enclustra瑞蘇盈科產(chǎn)品使用注意事項(xiàng)

    我們準(zhǔn)備了關(guān)于瑞蘇盈科產(chǎn)品使用的注意事項(xiàng),旨在幫助客戶(hù)更快,更好的使用瑞蘇盈科的產(chǎn)品,實(shí)現(xiàn)以最小的成本提供理想的解決方案,幫助客戶(hù)打造獨(dú)樹(shù)一幟的產(chǎn)品并減少上市時(shí)間。瑞蘇盈科核心板使用注意事項(xiàng):電子
    的頭像 發(fā)表于 11-28 10:28 ?534次閱讀
    Enclustra瑞蘇盈科產(chǎn)品使用<b class='flag-5'>注意事項(xiàng)</b>

    CW32F030在使用中的注意事項(xiàng)有哪些?

    CW32F030在使用中的注意事項(xiàng)有哪些?
    發(fā)表于 11-18 06:20

    信號(hào)調(diào)理設(shè)備的接地和環(huán)境適配有哪些注意事項(xiàng)?

    “接地規(guī)范” 和 “環(huán)境適配” 兩大模塊拆解,每點(diǎn)均結(jié)合實(shí)操場(chǎng)景說(shuō)明: 一、接地注意事項(xiàng):核心是 “單點(diǎn)接地 + 隔離干擾” 接地的核心目標(biāo)是 “統(tǒng)一電位、消除地環(huán)路干擾”,避免電網(wǎng)電磁干擾(如變頻器、高壓設(shè)備)通過(guò)地線(xiàn)串
    的頭像 發(fā)表于 11-14 16:15 ?3602次閱讀
    信號(hào)調(diào)理設(shè)備的接地和環(huán)境適配有哪些<b class='flag-5'>注意事項(xiàng)</b>?

    emWin AppWizard 開(kāi)發(fā)注意事項(xiàng)有哪些?

    emWin AppWizard 開(kāi)發(fā)注意事項(xiàng)
    發(fā)表于 09-04 06:18

    智多晶PLL使用注意事項(xiàng)

    在FPGA設(shè)計(jì)中,PLL(鎖相環(huán))模塊作為核心時(shí)鐘管理單元,通過(guò)靈活的倍頻、分頻和相位調(diào)整功能,為系統(tǒng)提供多路高精度時(shí)鐘信號(hào)。它不僅解決了時(shí)序同步問(wèn)題,還能有效消除時(shí)鐘偏移,提升系統(tǒng)穩(wěn)定性。本文將深入探討智多晶PLL在實(shí)際應(yīng)用中的關(guān)鍵注意事項(xiàng),幫助工程師規(guī)避常見(jiàn)設(shè)計(jì)風(fēng)險(xiǎn)。
    的頭像 發(fā)表于 06-13 16:37 ?1577次閱讀
    智多晶PLL使用<b class='flag-5'>注意事項(xiàng)</b>

    美國(guó)Odyssey奧德賽電池充電注意事項(xiàng)全解析

    Odyssey奧德賽電池充電注意事項(xiàng)全解析 奧德賽電池作為高性能的深循環(huán)鉛酸電池,廣泛應(yīng)用于汽車(chē)啟動(dòng)、摩托車(chē)、船舶以及備用電源系統(tǒng)中。正確的充電方法不僅能夠延長(zhǎng)電池壽命,還能保障其性能穩(wěn)定發(fā)揮
    的頭像 發(fā)表于 05-19 16:31 ?1098次閱讀
    美國(guó)Odyssey奧德賽電池充電<b class='flag-5'>注意事項(xiàng)</b>全解析

    IGBT器件的防靜電注意事項(xiàng)

    IGBT作為功率半導(dǎo)體器件,對(duì)靜電極為敏感。我將從其靜電敏感性原理入手,詳細(xì)闡述使用過(guò)程中防靜電的具體注意事項(xiàng)與防護(hù)措施,確保其安全穩(wěn)定運(yùn)行。
    的頭像 發(fā)表于 05-15 14:55 ?1830次閱讀

    手機(jī)喇叭氣密性檢測(cè)儀的注意事項(xiàng)

    使用手機(jī)喇叭氣密性檢測(cè)儀的注意事項(xiàng)包括以下幾點(diǎn):一、使用前注意事項(xiàng)仔細(xì)閱讀手機(jī)喇叭氣密性檢測(cè)儀的使用說(shuō)明書(shū),了解設(shè)備的操作方法注意事項(xiàng)。檢查氣密性檢測(cè)儀的各部件是否完好,包括壓力表、
    的頭像 發(fā)表于 05-15 13:38 ?747次閱讀
    手機(jī)喇叭氣密性檢測(cè)儀的<b class='flag-5'>注意事項(xiàng)</b>

    LCR測(cè)試儀的使用方法注意事項(xiàng)

    LCR測(cè)試儀的使用方法、操作注意事項(xiàng)及常見(jiàn)故障處理,幫助讀者高效、安全地掌握這一儀器的使用技巧。 ? 二、LCR測(cè)試儀的基本使用方法 1. 準(zhǔn)備階段 (1)設(shè)備檢查:確保測(cè)試儀電源線(xiàn)、連接線(xiàn)完好,電源開(kāi)關(guān)關(guān)閉。檢查測(cè)試夾具或探針
    的頭像 發(fā)表于 04-29 10:36 ?1.3w次閱讀
    LCR測(cè)試儀的使用<b class='flag-5'>方法</b>與<b class='flag-5'>注意事項(xiàng)</b>

    掃描電鏡的日常維護(hù)有哪些注意事項(xiàng)

    掃描電鏡日常維護(hù)的注意事項(xiàng)
    的頭像 發(fā)表于 03-24 11:38 ?1176次閱讀
    掃描電鏡的日常維護(hù)有哪些<b class='flag-5'>注意事項(xiàng)</b>?