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

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

3天內不再提示

模塊化原理和方法 模塊化的方法和注意事項

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 2023-07-25 16:43 ? 次閱讀

引言

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

這個(gè)時(shí)候,你就應該將自己的這一塊程序寫(xiě)成一個(gè)模塊,單獨調試,留出接口供其它模塊調用。

最后,小組成員都將自己負責的模塊寫(xiě)完并調試無(wú)誤后,由項目組長(cháng)進(jìn)行組合調試。

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

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

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

模塊化程序設計應該理解以下概述:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

硬件驅動(dòng)模塊,一種特定硬件對應一個(gè)模塊;

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

責任編輯:彭菁

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

    關(guān)注

    88

    文章

    3458

    瀏覽量

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

    關(guān)注

    0

    文章

    312

    瀏覽量

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

    關(guān)注

    1

    文章

    1586

    瀏覽量

    48782
收藏 人收藏

    評論

    相關(guān)推薦

    模塊化編程

    大俠們,求教模塊化編程的問(wèn)題啊,,,怎么添加多個(gè)C文件,如何寫(xiě)自己的頭文件???
    發(fā)表于 11-08 10:50

    模塊化編程

    大家一起來(lái)講解看,,,到底何為模塊化編程???
    發(fā)表于 08-07 21:56

    模塊化編程

    模塊化編程,很好的學(xué)習資料
    發(fā)表于 08-16 16:59

    模塊化程序

    現在大家寫(xiě)程序都是模塊化嗎,就是不同的模塊放在不同的文件夾里。比如所有的h文件放一起,所有的h文件聲明一起,主程序只有一小段就行,很好的,就是剛開(kāi)始學(xué)習模塊化程序時(shí)要熟悉。
    發(fā)表于 11-12 15:15

    精粹的c語(yǔ)言,模塊化的c編程方法

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

    單片機的C語(yǔ)言模塊化編程

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

    c語(yǔ)言 模塊化編程

    c語(yǔ)言中關(guān)于模塊化編程。目前我只學(xué)到了功能函數的模塊化,現在我想弄清楚,初始變量能不能也模塊化?詳細問(wèn)題是這樣的: 在main()函數之前,有個(gè)初始化了的數組變量Led7Code[ ] ,我希望把
    發(fā)表于 08-20 09:43

    貼片機模塊化設計概述

      模塊化的設計理念源于柔性設計思想,其目的是通過(guò)模塊化設計使貼片機設備及其功能部件在生產(chǎn)中具有更高適應性和高效性。從概念上講,貼片機的模塊化設計,是指將貼片機的功能部件(如貼片頭、進(jìn)料裝置和吸嘴站
    發(fā)表于 09-06 16:40

    怎么在ISE中進(jìn)行模塊化設計?

    你好: 我想在ISE中進(jìn)行模塊化設計,但是在TCL腳本方法中,還有其他方法可以進(jìn)行模塊化設計嗎?以上來(lái)自于谷歌翻譯以下為原文hello:I want to do modular des
    發(fā)表于 10-10 11:46

    嵌入式系統模塊化設計有什么方法?

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

    到底什么是模塊化編程?

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

    什么是模塊化編程

    1什么是模塊化模塊化編程就是把我們的一整個(gè)項目,分成很多模塊(比如一個(gè)學(xué)生成績(jì)查詢(xún)可以分為,登陸,查詢(xún),修改保存,退出等模塊)而一個(gè)程序工程包含多個(gè)源文件(.c 文件和 .h 文件),
    發(fā)表于 12-06 08:02

    什么是模塊化編程?模塊化編程的注意事項

    單片機零基礎入門(mén)(8-4)模塊化編程---LED1602調試工具一、回顧二、什么是模塊化編程?1、傳統方式編程:2、模塊化編程3、模塊化編程框圖3、
    發(fā)表于 02-23 07:14

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

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

    模塊化方法注意事項

    這一條概括了模塊化的實(shí)現方法和實(shí)質(zhì):將一個(gè)功能模塊的代碼單獨編寫(xiě)成一個(gè).c文件,然后把該模塊的接口函數放在.h文件中.舉例:假如你用到液晶顯示,那么你可能會(huì )寫(xiě)一個(gè)液晶驅動(dòng)
    的頭像 發(fā)表于 09-20 10:37 ?2984次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看