日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

模塊化的方法和注意事項

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2022-07-06 11:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

做一個相對較復雜的工程時,要和小組成員分工合作,比如你可能只負責通訊或者顯示這一塊。就應該將這一塊程序?qū)懗梢粋€模塊,單獨調(diào)試,留出接口供其它模塊調(diào)用。

像這些場合就要求程序必須模塊化。模塊化的好處是很多的,不僅僅是便于分工,它還有助于程序的調(diào)試,有利于程序結(jié)構(gòu)的劃分,還能增加程序的可讀性和可移植性。初學者往往搞不懂如何模塊化編程,其實它是簡單易學,而且又是組織良好程序結(jié)構(gòu)行之有效的方法之一,另外關(guān)于程序架構(gòu)的文章請移步:嵌入式開發(fā)中的程序架構(gòu)。本文講一下模塊化的方法和注意事項,最后將以初學者使用最廣的keil c編譯器為例,給出模塊化編程的詳細步驟。模塊化程序設計應該理解以下概述:

模塊即是一個.c源文件和一個.h頭文件的結(jié)合,頭文件中是對于該模塊接口的聲明。這一條概括了模塊化的實現(xiàn)方法和實質(zhì):

將一個功能模塊的代碼單獨編寫成一個.c文件,然后把該模塊的接口函數(shù)放在.h文件中。

舉例:

假如你用到液晶顯示,那么你可能會寫一個液晶驅(qū)動模塊,以實現(xiàn)字符、漢字和圖像的現(xiàn)實,命名為: led_device.c,該模塊的.c文件大體可以寫成:


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

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

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

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

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


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

某模塊提供給其它模塊調(diào)用的外部函數(shù)及數(shù)據(jù)需在.h 中文件中冠以extern 關(guān)鍵字聲明。這句話在上面的例子中已經(jīng)有體現(xiàn),即某模塊提供給其它模塊調(diào)用的外部函數(shù)和全局變量需在.h 中文件中冠以extern 關(guān)鍵字聲明。

下面重點說一下全局變量的使用。使用模塊化編程的一個難點就是全局變量的設定,初學者往往很難想通模塊與模塊公用的變量是如何實現(xiàn)的,常規(guī)的做法就是本句提到的,在.h文件中外部數(shù)據(jù)冠以extern關(guān)鍵字聲明。比如上例的變量value就是一個全局變量,若是某個模塊也使用這個變量,則和使用外部函數(shù)一樣,只需在使用的模塊.c文件中包含#include“l(fā)cd_device.h”即可。另一種處理模塊間全局變量的方法來自于嵌入式操作系統(tǒng)uCOS-II,這個操作系統(tǒng)處理全局變量的方法比較特殊,也比較難以理解,但學會之后妙用無窮,這個方法只需用在頭文件中定義一次。方法為:在定義所有全局變量(uCOS-II將所有全局變量定義在一個.h文件內(nèi))的.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已經(jīng)定義)。所以編譯器給每個全局變量分配內(nèi)存空間,而當編譯器處理其他.C 文件時,xxx_GLOBAL沒有定義,xxx_EXT 被定義為extern,這樣用戶就可以調(diào)用外部全局變量。為了說明這個概念,可以參見uC/OS_II.H,其中包括以下定義:

#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#endifOS_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;
這樣編譯器就會將這些全局變量分配在內(nèi)存中。當編譯器處理其他.C 文件時,頭文件變成了如下的樣子,因為OS_GLOBAL沒有定義,所以OS_EXT 被定義為extern。

extern INT32U OSIdleCtr;extern INT32U OSIdleCtrRun;extern INT32U OSIdleCtrMax;
在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H文件中定義一次就可以了。

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

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

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

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

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

前兩個都比較容易理解,最后一個作用就是剛剛舉例中提到的延時函數(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 文件 */
以上程序的結(jié)果是在模塊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 的話,對應的是同一片內(nèi)存單元。注:一個嵌入式系統(tǒng)通常包括兩類模塊:

硬件驅(qū)動模塊,一種特定硬件對應一個模塊

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

原文標題:嵌入式開發(fā)中的模塊化編程

文章出處:【微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:彭靜

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

    關(guān)注

    33

    文章

    9604

    瀏覽量

    157686
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1177

    瀏覽量

    50248
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

    關(guān)注

    1

    文章

    1673

    瀏覽量

    51982

原文標題:嵌入式開發(fā)中的模塊化編程

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    TPS63024xEVM - 553評估模塊:特性、使用與注意事項

    就是這樣一款值得關(guān)注的產(chǎn)品,下面我們來詳細了解它的特性、使用方法以及相關(guān)注意事項。 文件下載: TPS630240EVM-553.pdf 一、模塊概述 TPS63024xEVM - 553評估
    的頭像 發(fā)表于 04-26 09:05 ?309次閱讀

    LMZ20502 SIMPLE SWITCHER? 評估板:特性、使用與注意事項

    的 LMZ20501/02 納米模塊就是這樣的優(yōu)秀產(chǎn)品。本文將圍繞 LMZ20502 SIMPLE SWITCHER? 評估板展開,詳細介紹其特性、設置操作、性能表現(xiàn)以及相關(guān)注意事項。 文件下載
    的頭像 發(fā)表于 04-21 14:15 ?115次閱讀

    LM10692評估模塊:功能、使用與注意事項

    LM10692評估模塊:功能、使用與注意事項 在電子設計與開發(fā)的領(lǐng)域中,評估模塊是驗證和測試芯片性能的重要工具。今天,我們聚焦于TI的LM10692評估模塊,深入探討其功能、使用
    的頭像 發(fā)表于 04-19 13:40 ?130次閱讀

    預端接光配線架的安裝與維護注意事項有哪些?

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

    請問CW32F030的硬件注意事項有哪些?

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

    請問IAP功能升級流程中有哪些注意事項?

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

    驅(qū)動板PCB布線的注意事項

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

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

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

    CW32F030在使用中的注意事項有哪些?

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

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

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

    emWin AppWizard 開發(fā)注意事項有哪些?

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

    智多晶PLL使用注意事項

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

    美國Odyssey奧德賽電池充電注意事項全解析

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

    IGBT器件的防靜電注意事項

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

    手機喇叭氣密性檢測儀的注意事項

    使用手機喇叭氣密性檢測儀的注意事項包括以下幾點:一、使用前注意事項仔細閱讀手機喇叭氣密性檢測儀的使用說明書,了解設備的操作方法注意事項。檢查氣密性檢測儀的各部件是否完好,包括壓力表、
    的頭像 發(fā)表于 05-15 13:38 ?930次閱讀
    手機喇叭氣密性檢測儀的<b class='flag-5'>注意事項</b>
    望都县| 格尔木市| 桂东县| 昌黎县| 商都县| 襄垣县| 凉山| 东兰县| 余江县| 镇宁| 墨江| 清徐县| 大方县| 南乐县| 博乐市| 凤凰县| 泽州县| 焦作市| 威信县| 浙江省| 合川市| 绥德县| 靖州| 栖霞市| 白水县| 伊春市| 临澧县| 彰化县| 鄯善县| 吉木萨尔县| 改则县| 曲松县| 兴安县| 常德市| 铜陵市| 星子县| 白水县| 北宁市| 渝北区| 天镇县| 龙岩市|