單片機小白學(xué)步(16) 單片機/計算機系統概述:模塊化思想
思想篇對后面的具體知識學(xué)習進(jìn)行整體的框架介紹,解釋一些基礎名詞,以及對學(xué)習思想方法進(jìn)行總結。思想篇的內容,對于后面的學(xué)習有很大的指導作用,尤其是模塊化思想將會(huì )貫穿整個(gè)學(xué)習篇的知識體系。思想篇并不僅限于接下來(lái)的幾篇文章,還會(huì )在學(xué)習篇中通過(guò)話(huà)題的形式穿插講解。
本文引用地址:http://dyxdggzs.com/article/201611/318517.htm閱讀建議:如果還沒(méi)有涉及到實(shí)踐,閱讀時(shí)不一定能對思想方法有深刻的認識,看的時(shí)候有個(gè)大致的認識就可以了。在具體實(shí)踐的時(shí)候,可以根據需要再回來(lái)看一看。
==================================
為了讓大家更好的理解單片機,從本文開(kāi)始,會(huì )先對單片機/計算機系統進(jìn)行一個(gè)整體的介紹。讓大家對單片機的學(xué)習和單片機系統的設計有個(gè)比較準確的把握,更好的分清后面各種知識點(diǎn)之間的聯(lián)系,以及它們之間的輕重主次,學(xué)習起來(lái)更加得心應手。
在這幾篇里,會(huì )涉及到大量新的名詞術(shù)語(yǔ),而這些也正是很多初學(xué)者遇到的巨大的困難。我會(huì )用通俗的語(yǔ)言對它們進(jìn)行介紹,不需要理解的很透徹,只要有一個(gè)大致的認識就可以了。同時(shí),也會(huì )涉及單片機和計算機系統的各種設計思想,以及學(xué)習時(shí)的思路技巧等。
因為單片機和計算機本質(zhì)上沒(méi)有太大的區別,所以這里介紹的內容絕不是僅僅局限于51單片機,也不只是單片機,而是包含計算機在內的各種微機系統。廢話(huà)不多說(shuō),下面進(jìn)入正題。
模塊化思想
模塊化是一個(gè)很重要的思想,它的應用不僅僅局限在單片機等技術(shù)方面,還體現在我們的身體構造,體現在人類(lèi)社會(huì )生產(chǎn)生活中的方方面面。何為模塊化思想呢?按照我的理解,模塊化思想有幾個(gè)特點(diǎn),下面一一道來(lái)。
1、分工合作與專(zhuān)一
對生物學(xué)有基本認識的人都知道,包括人在內的很多動(dòng)物是由多種器官構成的,例如大腦負責思考,心臟負責輸送血液等。每個(gè)器官或組織負責幾項功能,各個(gè)器官之間協(xié)調工作,共同構成一個(gè)復雜的整體。
在人類(lèi)社會(huì )中,分工合作的現象也是很常見(jiàn)的。生活中需要吃飯穿衣,在比較落后的年代,可能有一些自給自足的經(jīng)濟形式,自己勞動(dòng)滿(mǎn)足最基本的生活需求。而在現代社會(huì ),人的需求越來(lái)越多,不可能全部靠自己生產(chǎn)。每個(gè)人都專(zhuān)注于自己的特長(cháng),例如農民負責種植糧食,服裝工人負責制造衣服,養殖戶(hù)負責養殖,程序員負責編寫(xiě)程序等。各種人分工合作,最后互相交換勞動(dòng)成果。當一個(gè)人長(cháng)期專(zhuān)注于一件事,而不用擔心自己其他的需求時(shí),這個(gè)人能把這件事做得更好,總體上來(lái)看,社會(huì )的生產(chǎn)力也就大大提高了。
2、模塊抽象
如果對電腦的基本組成有所了解,可以知道電腦由CPU、內存、硬盤(pán)、主板、顯示器等幾部分組成。如果想在電腦中存儲更多的電影,可以考慮更換更大的硬盤(pán)。我們只需要知道硬盤(pán)是電腦中負責存儲的部件,而不關(guān)注硬盤(pán)內部的構造。因為每個(gè)模塊都是高度抽象的,內部原理可能很復雜,但是對外部而言,它只是一個(gè)能完成特定功能的黑盒子。這樣抽象的好處,就是在更換硬盤(pán)時(shí),只需要從外部對硬盤(pán)有一個(gè)抽象的認識,就能輕松解決問(wèn)題,剩下的就只是花錢(qián)購買(mǎi)硬盤(pán)了。
3、分層
如果讓你管理一個(gè)龐大的公司,你會(huì )怎么管理?分層管理將會(huì )是一個(gè)很好的選擇。
你可以根據實(shí)際情況將公司分為幾個(gè)部門(mén),研發(fā)部、營(yíng)銷(xiāo)部、財務(wù)部、人事后勤部等。每個(gè)部門(mén)指派幾個(gè)負責人進(jìn)行管理,每個(gè)部門(mén)負責指定的工作。而具體到研發(fā)部,管理人員為了便于管理,又可能將其分為軟件部、硬件部等;而到了軟件部,又會(huì )有不同的團隊,移動(dòng)客戶(hù)端開(kāi)發(fā)、服務(wù)器端開(kāi)發(fā)等等。這樣一層一層進(jìn)行分下來(lái),每個(gè)人各司其職,也體現了分工合作的特點(diǎn)。
如果你是公司的老總,當發(fā)現這個(gè)月公司的軟件產(chǎn)品開(kāi)發(fā)進(jìn)度非常慢時(shí),可能會(huì )直接叫來(lái)研發(fā)部的總管大發(fā)雷霆:“公司的XX軟件開(kāi)發(fā)太慢了,你看人家公司的同類(lèi)產(chǎn)品早就發(fā)布出去了。這件事你得盡快給我搞定,要不然就走人!”然后指令一層一層的下達到了最下層的員工,最底層的程序猿們就又要加班加點(diǎn)拼命的干活了。研發(fā)進(jìn)度慢或許只是因為有幾個(gè)程序員最近有事請假了,但是在這個(gè)過(guò)程中,你不需要過(guò)多關(guān)注底層的細節,你也沒(méi)有太多精力去關(guān)注,而只是把整個(gè)研發(fā)部當做一個(gè)抽象的整體去對待,這也體現了模塊抽象的特點(diǎn)。
模塊化設計的方法原則
前面說(shuō)了模塊化思想的特點(diǎn),模塊化思想應用很廣泛,而根據這種思想設計系統,就是模塊化設計了。不只是單片機系統,計算機軟硬件系統也可以充分利用模塊化設計。這里先說(shuō)一說(shuō)模塊化設計的方法思路。
對于初學(xué)者,對此只需要先有個(gè)大概的認識,沒(méi)有實(shí)際設計過(guò),對這些思想也不容易有所感觸;后來(lái)需要設計實(shí)際系統時(shí),有需要回來(lái)再看看這篇就好了。
1、自頂向下,逐步求精;邏輯設計與物理實(shí)現分離;自底向上
當要設計一個(gè)比較復雜的系統時(shí),常常會(huì )先畫(huà)框圖,每個(gè)框表示一個(gè)抽象的功能模塊。通過(guò)框圖可以設計這些模塊之間的邏輯關(guān)系,然后再細化去設計每個(gè)模塊。而這樣一個(gè)模塊可能也比較復雜,這時(shí)又會(huì )將其拆分為更小的模塊。這樣一步一步的拆分模塊,直到最后技術(shù)細節實(shí)現。這就是自頂向下的設計方法,將一個(gè)復雜問(wèn)題進(jìn)行分解,逐步求精。而框圖的設計則是模塊之間的邏輯設計,邏輯設計與每個(gè)模塊的具體物理實(shí)現可以完全分離。
和自頂向下的設計方法相比,還有一種恰恰相反的思路:自底向上。先設計出一些核心模塊,然后再逐步進(jìn)行擴展和完善。完全的自底向上的方法只適合設計小型的系統。在實(shí)際應用中,往往是結合這兩種方法進(jìn)行設計。
2、模塊獨立,減小耦合度
模塊化設計中很重要的一個(gè)思想是模塊獨立,減小模塊之間的耦合度。也就是說(shuō),每個(gè)模塊負責完成自己的功能,不同的模塊之間關(guān)聯(lián)要盡可能小,以免互相影響。
想給電腦換一個(gè)更大的硬盤(pán)時(shí),一般不用考慮內存等其他模塊會(huì )不會(huì )受到影響,要不然實(shí)在是太麻煩了。因為電腦的模塊化設計非常規范,模塊之間的關(guān)聯(lián)很小。
減小耦合度這種看似簡(jiǎn)單的問(wèn)題,實(shí)際上在設計的時(shí)候卻相當麻煩,為了減小耦合度,需要使用很多技術(shù)來(lái)完成,后面會(huì )在實(shí)際操作中進(jìn)行介紹。
3、模塊標準化,可代換
有同學(xué)覺(jué)得自己的電腦反應太慢,網(wǎng)上一查,原來(lái)電腦慢很大可能是因為機械硬盤(pán)的速度太慢。相比硬盤(pán),CPU和內存要快很多,所以就如木桶效應,電腦被最慢的硬盤(pán)給拖慢了速度。于是就給電腦換上了固態(tài)硬盤(pán),頓時(shí)速度快了很多。
固態(tài)硬盤(pán)和機械硬盤(pán)的內部結構是完全不一樣的。機械硬盤(pán)是依靠磁性盤(pán)片存儲數據的,讀寫(xiě)時(shí)需要機械結構帶動(dòng)盤(pán)片轉動(dòng),機械轉動(dòng)速度不能太快(2.5寸機械硬盤(pán)以7200轉每分鐘的速度旋轉,盤(pán)片邊緣的速度能達到86km/h),太快了盤(pán)片可能會(huì )直接破裂,或者發(fā)熱量巨大,所以讀寫(xiě)速度遠遠沒(méi)有電子器件快。而固態(tài)硬盤(pán)使用的就是電子芯片來(lái)實(shí)現數據存儲,所以速度非???。
兩種硬盤(pán)雖然原理和性能差距都很大,但是卻能很輕松的安裝在同一臺電腦上,只要保證一些參數匹配,例如都是2.5寸的。這是因為現有的不同硬盤(pán)設計的都是標準化的,硬盤(pán)的尺寸、接口等都有標準規范,所以能很輕松的代換。
4、模塊通用性,適用于多種產(chǎn)品
幾年以前的手機等數碼產(chǎn)品,不同品牌、不同設備分別由不同的人和公司設計,充電的接口各不相同,充電器也都是每個(gè)數碼產(chǎn)品專(zhuān)門(mén)配備一套,出門(mén)旅行帶的數碼產(chǎn)品一多,僅僅是大大小小的各種充電器就夠讓人煩了。而且充電器壞了只能重新買(mǎi)配套的充電器。這樣的設計浪費了很多資源,也給人們的生活帶來(lái)了很大的不便。
而近幾年,MP3、MP4、手機等數碼產(chǎn)品的充電器接口慢慢被統一起來(lái),很多設備都可以使用通用的USB充電頭和數據線(xiàn)進(jìn)行充電。對于用戶(hù)來(lái)說(shuō)方便多了;對于設備制造商來(lái)說(shuō),也不是很有必要單獨設計充電器,直接用標準充電器就可以了;還節約了資源,例如有些數碼設備充電器是可以選配的,有充電器就不用再進(jìn)行購買(mǎi)了。通用的充電頭和手機充電接口設計,使得一個(gè)充電器可以用于多種產(chǎn)品。
通用性和前面一點(diǎn)標準化,兩者其實(shí)都可以理解成,設計一個(gè)模塊或系統,都要遵循一定的標準化規范。一個(gè)標準化的模塊,可以應用于不同的系統(通用充電器給多種設備充電);而符合統一標準的多個(gè)同類(lèi)模塊,可以用于同一個(gè)系統(機械硬盤(pán)和固態(tài)硬盤(pán)都能裝進(jìn)電腦)。
模塊化設計的優(yōu)缺點(diǎn)
前面通過(guò)舉例,已經(jīng)明確的體現了模塊化設計的很多優(yōu)點(diǎn),這里對其特點(diǎn)進(jìn)行一個(gè)總結。
1、便于分工合作
對于一個(gè)實(shí)際產(chǎn)品,很多時(shí)候不是一個(gè)人開(kāi)發(fā)的,而是很多人共同開(kāi)發(fā)。這里的原因有很多,可能是因為時(shí)間比較緊,例如公司之間的競爭,誰(shuí)最先開(kāi)發(fā)并發(fā)布新的產(chǎn)品,就最有可能搶占市場(chǎng);可能是因為系統太龐大,一個(gè)人一輩子也做不完,例如操作系統的代碼量往往能達到幾百萬(wàn)行;分工合作還會(huì )提高整體效率,前面已經(jīng)說(shuō)過(guò)了。
多個(gè)人開(kāi)發(fā)同一個(gè)系統,模塊化開(kāi)發(fā)是最好的選擇。一些人專(zhuān)注于一個(gè)領(lǐng)域,例如安卓程序、平面設計、服務(wù)器等,每個(gè)人負責開(kāi)發(fā)和他的專(zhuān)注領(lǐng)域匹配的小模塊,而另外一些知識面比較廣、經(jīng)驗豐富的人,負責模塊之間的邏輯組合,最后將整個(gè)系統整合到一起。這個(gè)過(guò)程也可能會(huì )有分層,系統分成大的模塊,再拆分成小的模塊,逐層分解并實(shí)現。
2、提高開(kāi)發(fā)效率
一方面,分工合作的方式能提高效率;另一方面,運用已經(jīng)實(shí)現好的模塊,像積木一樣搭建新的系統,更是讓效率大大提高。
模塊的開(kāi)發(fā),可能是很多人分別完成的,也可能是同一個(gè)人在不同時(shí)期完成的,還有可能是從別人那免費獲得或購買(mǎi)的。
具體到單片機的學(xué)習,其實(shí)一開(kāi)始我們就在使用別人的模塊。單片機、各種元件都是別人生產(chǎn)好的,運用這些模塊,我們很快的搭建了自己的開(kāi)發(fā)板。
同樣的道理,在后面的詳細學(xué)習過(guò)程中,我希望大家每次學(xué)完一個(gè)技術(shù)知識,就自己實(shí)現一個(gè)程序模塊,例如數碼管的驅動(dòng)程序(雖然現在你可能還不理解這是什么)。到整個(gè)知識都快學(xué)完了,就有了一套自己的程序庫,也就是全套的模塊程序。
時(shí)間久了,或許你就有點(diǎn)記不清數碼管驅動(dòng)當初是怎么寫(xiě)的了。但是沒(méi)關(guān)系,只要你寫(xiě)好了自己的程序模塊,并且給出了規范的使用說(shuō)明,需要時(shí)直接照著(zhù)說(shuō)明去用就可以了,而不需要再去復習一遍前面的知識。所以在后面開(kāi)發(fā)自己的單片機系統時(shí),直接用自己開(kāi)發(fā)好的模塊,就能極大的提高開(kāi)發(fā)效率。
而在后面具體技術(shù)的學(xué)習中,我也會(huì )詳細的分析,如何才能盡可能好的實(shí)現每一個(gè)模塊,用到哪些技術(shù)知識,幫助大家一起搭建自己的程序庫。
3、能開(kāi)發(fā)出復雜系統
分工合作,使得人們能開(kāi)發(fā)出一個(gè)人有生之年根本完成不了的、很龐大的系統。
而對于個(gè)人開(kāi)發(fā)系統來(lái)說(shuō),如果你花幾個(gè)月寫(xiě)一個(gè)比較龐大的程序,寫(xiě)到后面可能就忘記了前面的程序是怎么寫(xiě)的,這樣可能會(huì )影響程序的繼續編寫(xiě)。這時(shí)你可能需要回過(guò)頭來(lái)再看以前的程序,但程序畢竟不是自然語(yǔ)言,看起來(lái)還是比較費勁的,很可能后來(lái)你自己也很難看懂了,至少是需要很多時(shí)間才能看懂。等你終于看懂了前面的東西,發(fā)現后面的代碼又忘了。
而模塊化的設計方法,你可以在一個(gè)小的時(shí)間段里,設計一個(gè)小的模塊,并把它做的足夠好,然后對整個(gè)模塊編寫(xiě)一個(gè)自己能看懂的使用說(shuō)明。以后要用這個(gè)模塊,就把它當做一個(gè)抽象的整體,不需要關(guān)注模塊內部細節實(shí)現,直接看使用說(shuō)明就行了。這樣,你才更有可能獨立開(kāi)發(fā)一個(gè)比較龐大的程序。
4、便于維護和查錯
便于維護也是模塊化很重要的一個(gè)特點(diǎn)。模塊化講究降低模塊間的耦合度,一個(gè)不是很核心的模塊出了問(wèn)題,往往不會(huì )對其他模塊造成很大影響,只會(huì )表現出系統中的一些功能無(wú)法使用(當然,如果核心模塊例如電腦CPU出了問(wèn)題,可能會(huì )導致整個(gè)系統崩潰)。這時(shí)你可以直接判斷出哪個(gè)模塊有問(wèn)題,然后去修復那個(gè)模塊,大大縮小了檢查錯誤的范圍。
不知道大家對前面《單片機程序下載失敗總結》的那篇文章還有沒(méi)有印象,文中提到,下載失敗時(shí),如果你能有一套正常下載程序的電腦、下載線(xiàn)、單片機系統板裝備,通過(guò)替換的方法,很快就能確定問(wèn)題是否出在你的電腦上。從這里可以看出來(lái)模塊化思想在查錯時(shí)的重大意義。
5、缺點(diǎn)
任何事物都有兩面性,模塊化思想也不例外。這里我簡(jiǎn)單說(shuō)一下。
不知道大家有沒(méi)有聽(tīng)說(shuō)過(guò)這樣的話(huà),很多互聯(lián)網(wǎng)公司都是“三個(gè)人拿四個(gè)人的錢(qián)干五個(gè)人的活”。為什么很多互聯(lián)網(wǎng)公司工作非常累,工資很高,但是老板卻不愿意降低工資多招聘一些人,同時(shí)讓員工能更輕松呢?
有本書(shū)叫《人月神話(huà)》,里面就解釋了這個(gè)問(wèn)題的原因。人月是一個(gè)單位,表示一個(gè)人一個(gè)月能完成的工作量。按照人月理論,6個(gè)人月的工作兩個(gè)人需要三個(gè)月完成,而三個(gè)人則只需要兩個(gè)月。而事實(shí)是,在互聯(lián)網(wǎng)公司,三個(gè)人往往需要遠遠不止兩個(gè)月,甚至三個(gè)月還完成不了任務(wù),人月理論只是一個(gè)不可能的神話(huà)。
為什么會(huì )這樣呢?原因是多個(gè)人設計同一個(gè)系統,人與人之間需要溝通,人越多溝通需要的成本越大。所以招聘更多的人,意味著(zhù)浪費掉更多的溝通成本。
如果把每個(gè)人看做一個(gè)模塊,人月神話(huà)說(shuō)明了,過(guò)多的模塊會(huì )增加模塊之間的交流成本,從而降低系統效率;而在模塊特別多、關(guān)系很密切的時(shí)候,保持模塊的獨立性和模塊之間的匹配,本身就成了很大的難題。
但是總體來(lái)說(shuō),模塊化的優(yōu)點(diǎn)遠大于缺點(diǎn),有些時(shí)候模塊化也是不得已而為之的,而一些缺點(diǎn)往往是在特定情況下才有的。
=======================================================
評論