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