【連載】謹以此文,向大家講述振南十多年前入門單片機階段的往事和感悟
對,就是他,于振南老師,十年后,與郭天祥老師再度聯(lián)手打造全新課程。
現(xiàn)在網(wǎng)絡(luò)上,基本的C語言課程滿天飛,我們現(xiàn)在差不多都在半山腰,歇夠了沒,于老師在嵌C之巔等我們!接下來我們將連載課程,介紹那些大佬背后不為人知的故事!
于老師跟郭老師合照
(相關(guān)資料圖)
致廣大單片機學習者和工程師:
你們所經(jīng)歷的,振南也一樣不落的都經(jīng)歷過。起初對于C語言和單片機學習上的迷茫困惑可能比你們更甚,但是一切都過來了,沒什么能夠真正難倒我們,相信自己!
謹以此文,向大家講述我十多年前入門階段的往事和感悟,以及告訴大家:單片機到底是什么?
為什么很多初學者都被困在C語言與單片機入門基礎(chǔ)的山腳下止步不前,彷徨徘徊?為什么大家在學習上花費了如此大的精力,卻仍然是收效甚微?為什么C語言中的指針就那么難于理解,始終讓人們摸不著頭腦?又為什么看似毫無問題的代碼,燒錄到單片機中運行就是不對?這一切的一切都歸結(jié)于一個根源:對C語言的本質(zhì)和單片機的體系結(jié)構(gòu)與運作機制認識不清!
通過本章,我希望能讓你看穿一切,升華你的整體認知。
此時,你會發(fā)現(xiàn)做單片機和嵌入式開發(fā)是如此簡單,單片機也變得“乖巧”了很多,仿佛一切都變得順暢了,和諧了!
注定墮入單片機05年開始接觸單片機和嵌入式技術(shù),從此墮入其中,直至今日。這十幾年里經(jīng)歷了很多項目,遇到了無數(shù)技術(shù)點。從一個涉事不深的初學者,成長為了現(xiàn)在還算稱得上是“資深”的工程師。這期間我還辦演著另一個角色—技術(shù)和知識的傳授者和解惑者。我熱衷于這種工程師之間的交流,它時常會帶給我反思、領(lǐng)悟和動力,讓我一直保持追求新技術(shù)新高度的熱情和信念。在交流中,我無數(shù)次的被問到一個問題:“如何才能學好嵌入式C語言和單片機?”我也確實深深感覺到:C語言的掌握程度嚴重制約著單片機和嵌入式工程師的研發(fā)水平。其實,我在硬件方面的研發(fā)水平很大程度上得益于我C語言的扎實基礎(chǔ)和對其深入細致的理解。下面,我結(jié)合我較早期的學習經(jīng)歷和感悟來講一下嵌入式C語言應(yīng)該如何學好(年代可能會有些久遠)。也許,我的經(jīng)歷不易復制,但它作為一種學習方式,大家多少可以借鑒。引用我啟蒙老師的一句話:“C語言,學得多精都不為過!要學單片機,先學C語言。”
1.1 懵懂好奇的我
性格決定你所能從事的事業(yè),也決定了你的命運。
我的性格是對新鮮事物有極大的好奇,而且這種好奇會發(fā)展為興趣,并最終狂熱。當我腦子里出現(xiàn)一個新想法,我就會迫不及待地去實現(xiàn)它,而且不看到它最后的樣子,不會輕易放棄,不論成敗都要試試。在我記憶里,我小時候就是這樣的。
有一次我看到一根鐵絲,正好我衣兜里有一個皮筋,于是我就做了一個彈弓。后來一發(fā)不可收拾,我迷上了做彈弓,各種各樣,大大小小。還不乏創(chuàng)新和發(fā)揮,我想到在電影里見過的弩(其實我當時還不知道它叫弩),于是接下來的很長時間我一直在研究如何用鐵絲制造一把弩。最終,弩出現(xiàn)了。原來玩彈弓時的紙子彈被我換成了石子,隨著扳機的扣動,我的屁股也開花了。
上初中的時候,我通過學校開設(shè)的興趣班第一次接觸到計算機,第一次知道了DOS、Windows98、WPS、輸入法這些東西,迅速燃起了對計算機的好奇和興趣。當時我渴望擁有自己的計算機。于是開始天天纏著我爸媽給我買一臺計算機。礙于當時的經(jīng)濟條件,最后家里給我買了一臺學習機。用它可以模擬DOS環(huán)境、練習指法,還有一些簡單的編程,如LOGO、BASIC等。從此,我開始有了最基本的編程意識:程序就是一行行順序執(zhí)行的語句。但是對循環(huán)、條件判斷等比較復雜的東西還不夠熟練,只能說有一個概念。
對計算機的興趣沒有像以往一樣,熱乎一段時間就放下了。我發(fā)現(xiàn)計算機要學的東西非常多,而且它好像一直都在變化出新,這些新的東西又會再一次掀起我的興趣。對計算機的狂熱從上了高中就開始了。長期基于學習機的練習,我的指法已經(jīng)足夠熟練,但是用拼音輸入文字速度太慢,所以我報班學了五筆,一直延用至今(現(xiàn)在每當有人知道我用五筆的時候都會對我投來欽佩的目光)。在一頓軟磨硬泡之下,我擁有了第一臺自己的奔IV電腦,從此我的“折騰”開始了。
平時一有時間就研究VB、軟件加解密、網(wǎng)絡(luò)攻防這些東西,還訂閱了雜志《電腦愛好者》,期期不落。到高考前,我應(yīng)該可以稱得上是半個“業(yè)余電腦專家”了,也已經(jīng)可以使用VB開發(fā)一些小的桌面軟件,比如計算器、小游戲。計算機讓我的好奇心得到了很大的滿足,也使我的創(chuàng)造力得到了施展。
1.2 我的C語言學習經(jīng)歷
基于我對計算機的濃厚興趣,高考報志愿的時候,我四個志愿全部報了計算機專業(yè),從那時起,注定了我將以計算機為伴、為業(yè)。
原以為進了大學就能馬上接受正統(tǒng)的計算機教育了,其實并不是。計算機專業(yè)一開始并不直接學編程,而是學數(shù)學。我當時比較迷茫,覺得學計算機不教編程,上學有什么用?其實我知道專業(yè)課程安排的用意,計算機科學的基礎(chǔ)是數(shù)學,應(yīng)該先打基礎(chǔ)。但是又有多少學生真正去好好學習這些基礎(chǔ)而枯燥的東西。導致很多人整個大一的寶貴時間都浪費在打游戲上,估計他們已經(jīng)忘了自己為什么要學計算機了。我也怕會變成這樣。
我開始自學很多計算機方面的知識,但是又漫無目的,直到我碰到一個“能人”。據(jù)說他小學開始學計算機,初中已經(jīng)可以獨立開發(fā)軟件,高中時因為開發(fā)了一個網(wǎng)絡(luò)軟件,被某軟件平臺收錄,并評為五星軟件,而被免試特招。他智商高,但似乎情商不是太高,經(jīng)常容易得罪人,有一些讓別人不太舒服的做事風格。有一次我們偶然聊天,他提到國際ACM程序設(shè)計競賽的事情,問我有沒有興趣參加,說已經(jīng)集結(jié)了五六個人,組成小組參加比賽。從此我開始有了動力,開始自學C語言和算法,參加團隊集訓,下載往年競賽題目模擬競技,相互交流經(jīng)驗。當時專業(yè)課還沒有開C語言,但是我們已經(jīng)都是C語言高手了。也許,應(yīng)該在這里放一道ACM競賽的試題給大家解解悶(這是一道陳年老題,感興趣的話可以百度)。
對!ACM試題是全英文的。
圖1.1 國際ACM程序設(shè)計競賽歷屆真題
大二下學期,C語言專業(yè)課開了。很多人并不知道C語言有什么用,帶著迷茫上課、考試、通過,最后忘掉。我開始慢慢深刻感覺到C語言的精妙,它有自己嚴格的語法規(guī)則,但是又不作過多限定,這讓它非常靈活而實用。同一個邏輯功能,可以有很多種C語言的表達方式,它一定程度上體現(xiàn)出了編程者自身的習慣和素養(yǎng)。代碼可以寫得很亂,也可以寫得很優(yōu)雅;可以寫得冗長啰嗦,也可以寫得如蜻蜓點水,幾行了事。但是亂也可以錯落有致,寥寥幾行也可以大顯功底。我意識到C語言沒那么簡單,不僅僅是一門語言而已,它會伴隨我一生,正如后來有人所說的“程序如人生”。
我的性格仍然在發(fā)揮著巨大的作用。隨著不斷的學C語言,用C語言,我開始覺得C語言真的是樂趣多多,如同挖礦,永遠都有那些未曾遍及的角落,永遠都有沒有見過的另類技巧,永遠都有富含創(chuàng)意的智慧的流露。(關(guān)于C語言的技巧,振南專門整理成了一章《C語言的那些技巧與深層理解》,感興趣的讀者可以看一下)
1.3 C語言的頂級賽事
在C語言專業(yè)課上,老師告誡我們:“C語言,學得多精都不為過!”
很多人可能當時并沒有完全理解這句話,但是我卻深深的贊同。后來,我們的ACM參賽組對編程的高漲熱情感染了整個計算機學院,而這位C語言老師,也成為了我們的集訓老師。再后來,我們的舉動,帶動了更多人參加ACM程序設(shè)計競賽,學院、學校、乃至哈爾濱市、黑龍江省、東北三省。最終,國際ACM委員會委任我們學校為國際ACM中國東北賽區(qū)承辦方(南方賽區(qū)承辦方是浙大)。當時,全校到處都掛滿了條幅:“Program Your World!”
關(guān)于ACM程序設(shè)計競賽,當年還有一個關(guān)于浙大的傳奇故事(浙大是當年的ACM世界總冠軍)。我們知道寫程序要經(jīng)歷編程、編譯、查錯修改、再編譯,如此往復,若干次。這個往復的次數(shù),與程序的難度與程序員的能力有很大關(guān)系。但是要做到所有一次成功,不能說不可能,但是極難!當年浙大參加總決賽,只剩十分鐘,還有最后一道試題。參賽隊員,打開記事本,直接寫代碼,直接提交,一次通過。這件事情,在圈里流傳,也許有夸張的成分。但是,也足以顯示我們與頂尖編程高手之間的巨大差距。
ACM競賽,就是一群瘋狂熱愛計算機和編程的人們,一起正在z做的事情。他們技術(shù)夯實,以不斷獵奇、不斷學習、不斷完成新的目標為最大樂趣。
除了ACM,我私下還在關(guān)注另一個國際編程競賽,IOCCC(國際混亂C代碼大賽,官方網(wǎng)站http://www.ioccc.org/,如圖1.2)。其實很多人都不知道這個比賽,我也是偶然間發(fā)現(xiàn)的。
圖1.2 IOCCC官網(wǎng)歷屆比賽的消息公布
為什么會關(guān)注這樣一個似乎不太正經(jīng)的比賽?它不比算法,也不比代碼的質(zhì)量和風格,而是比誰的代碼最亂,但是亂得要藝術(shù),要能編譯,要能實現(xiàn)正確的功能,如圖1.3所示代碼。
圖1.3 第24屆IOCCC(2015年)參賽代碼
C語言代碼還能寫得如此任性?它體現(xiàn)了C語言在形式上的靈活性。當然,也不是單純用代碼來畫畫,就能被稱為“亂”的,它有更多更深層的編程技巧。在這里,你可以看到C語言世界的無奇不有,各種揮揮灑灑的編程風格,以及映射出來的代碼背后的那個“高手”。
我對C語言的學習熱情是自始至終的,現(xiàn)在也還是在學習。記得大學時候我們宿舍有一個習慣,就是大考之后的晚上要傾巢出動去網(wǎng)吧包宿。當時流行玩CS,他們聯(lián)網(wǎng)打得熱鬧。但是我對游戲毫無興趣,就窩在一個靠邊的位置上,上網(wǎng)看C語言代碼。當時特別熱衷逛編程網(wǎng)站,比如CSDN、PUDN等,還喜歡把代碼包全下載下來,看看別人的代碼是怎么寫的。看了代碼,就想編譯試試,于是就在網(wǎng)吧的電腦上安裝VC6.0。室友過來看我在干啥,然后就驚呆了:“都考完了,你還在看C語言?”
1.4 岔路口上選擇單片機
接下來,我繼續(xù)學了C++,還有后來的MATLAB、VHDL和Verlog(其實當時對硬件、數(shù)字信號處理和仿真沒什么概念,所以對于后者沒有多少熱情)。在學C++之前,我使用VC6.0已經(jīng)有一定經(jīng)驗了,尤其是MFC(當時有人建議我學.NET,比如C#,或者JAVA,說MFC已經(jīng)過時,說MFC的意思就是Maybe Finally Canceled,即最終會被微軟取消)。在系統(tǒng)學了C++之后,我對MFC(微軟基礎(chǔ)類庫)有了深入的理解,開始閱讀這方面的一些專業(yè)書籍,已經(jīng)可以編寫一些功能復雜的多層級的應(yīng)用軟件了。
到這里,我對編程的學習開始出現(xiàn)瓶頸,感覺到迷茫。C語言,很優(yōu)雅,很強大,它的父集C++,面向?qū)ο蟮木幊棠J剑梢蚤_發(fā)專業(yè)的桌面軟件。然后呢?似乎其他人用C#或者JAVA,開發(fā)軟件的速度更快,做得更好。優(yōu)雅不能當飯吃,在這種驅(qū)使下,我開始轉(zhuǎn)入C#、JAVA、PHP、JSP、ASP這些上層應(yīng)用級語言的學習,準備努力成為一個出色的軟件工程師。
在這個岔路口上,我遇到了我的啟蒙老師,讓我再一次打開好奇之門,從而走上了單片機和嵌入式技術(shù)的道路。他就是杜撰(化名):他以年齡最小、學歷最低的身份,代表黑龍江省參加全國“挑戰(zhàn)杯”科技創(chuàng)新大賽,憑自己設(shè)計的“仿生蛇”獲得二等獎。獲獎后,他把相關(guān)技術(shù)全部無償給了國防科大。曾作為“小崔說事”欄目的特邀嘉賓接受專訪。
關(guān)于“杜撰”和我當初進入單片機圈的經(jīng)歷,振南在本書《我與郭天祥的那些事兒》這一章有詳細的描寫。他給我講了很多關(guān)于單片機的事情,當時我對單片機完全不了解,只知道在他的“仿生蛇”里使用了單片機,而且單片機可以用C語言進行編程開發(fā)。單片機可以做出如此強大的東西,它遠比在電腦上寫桌面軟件要有趣的多。正是這一點,深深吸引了我。“你從51開始學吧,先焊個最小系統(tǒng),然后點個燈!”
他給了我一個最小系統(tǒng)板和一些配件,還有一個叫《平凡的C51教程》的電子文檔。
“你就在我這學吧,有問題問我就行。”
圖1.4 我的第一個單片機實驗原理圖(摘自《平凡的C51教程》)
我照著圖1.5依葫蘆畫瓢的焊完了我人生中第一個電路板。雖然慘不忍睹,但是經(jīng)杜撰過目之后,評價是“還不錯,能用。”然后,就讓我去學C51。其實我對這個被稱為“最小系統(tǒng)”的電路為什么要用到這些元件,為什么要焊成這樣,完全沒有概念。帶著諸多的迷惑不解開始了我的單片機C語言學習之旅,讓我開始慢慢明白了C語言課上老師說的“C語言是最貼近硬件的高級語言”這句話。
1.5 窗戶紙破了
C語言,不論是變量、函數(shù),還是分支循環(huán),乃至于算法,哪怕是最復雜的算法,這一切的體質(zhì)都是CPU內(nèi)核的指令執(zhí)行和訪存操作(RAM和ROM)。這是起初我對C語言的理解。那如何讓C語言去操控硬件產(chǎn)生物理效果呢?當時讓我百思不得其解的是C語言是軟件,發(fā)光二極管是物理上的硬件,軟件是如何能夠影響到物理世界的呢?小到點燈;大到“仿生蛇”產(chǎn)生一系列的動作;更大的比如控制火箭發(fā)動機點火。這曾經(jīng)是我入門階段無法逾越的一條思維鴻溝。
sfr P1=0x80;
void main(void){P1=0x55;While(1);}
這是我親手寫過的第一個嵌入式C語言代碼。它為我第一次揭示了C語言與硬件之間的交互方式—特殊功能寄存器(Special Function Register)。
register在標準C語言中是一個修飾符。一個變量在定義的時候如何加入這個修飾符,編譯器便不會把它分配在內(nèi)存里,而是直接放在CPU內(nèi)部寄存器里。它的目的是為了加快變量的訪問速度,尤其是那些需要被頻繁訪問的變量。
register int i;register int sum=0;
for(i=1;i<=100;i++){sum+=i;}
上面這段代碼(計算1到100的和)的執(zhí)行效率就比沒有register要高。
51單片機中的SFR本質(zhì)上也是一些隨機存儲單元,它們的訪問速度很快(與CPU之間采用直接尋址)。但其又有特殊之處,它們都是一些電路(片內(nèi)外設(shè))的門戶出入口。向這些寄存器寫入數(shù)值,會直接影響相關(guān)電路的運行和輸出。
51單片機的C語言中,為這些有特殊功能的寄存器,專門增加了一個修飾符—SFR。由它定義的標識(類似變量名),是可以訪問到相應(yīng)的特殊功能寄存器的,即片內(nèi)外設(shè)電路的出入口,從而達到控制電路的目的。諸多的電路,具有各自的功能,它們紛紛留出寄存器接口,形成一系列的SFR。通過CPU統(tǒng)一調(diào)配、有機控制,最終就可以完成復雜而有序的各種功能。這就是單片機,乃至于更高端的嵌入式CPU,如ARM、DSP等均采用的運作機理。而這些電路,連同CPU內(nèi)核,還有存儲器,當然還有連接它們之間的總線,被塑封在一起(即封裝),再把電路(片內(nèi)外設(shè))的相關(guān)外部信號通過引腳引出,這就是我們所看到的單片機芯片了。其實它就是一個完整的計算機。這大大拓寬了我起初對計算機認識的范疇:凡是擁有獨立計算能力,具備輸入輸出和存儲功能的設(shè)備都可以稱為計算機。從某種意義來說,算盤就是最原始的計算機,雖然它很大程度上依賴人的操作和輔助。
一直困惑我的謎霧終于變得清晰了。捅破了這層C語言軟件與硬件之間的窗戶紙,讓我看清了硬件和嵌入式系統(tǒng)的本質(zhì)。我覺得在硬件上,我將可以發(fā)揮更大的創(chuàng)造力。興趣的泛濫再一次一發(fā)不可收拾。
基于我在C語言方面的扎實基礎(chǔ)和深入的理解,我對單片機的學習也較為順利。
理解了51單片機的SFR,很多東西便變得簡單了。對“C語言,學得再精也不為過!”這句話有了更深的認識:C語言不光是一門語言,它影射出了整個計算機體系的運作機制,每當硬件出現(xiàn)進步,甚至是革命的時候,C語言必定會隨之進化。(大家可以看一下GCC編譯器的迭代歷程,基本上就是主流編程語言衍化的寫照)
我們不應(yīng)再為C語言如何操控硬件而產(chǎn)生疑惑,因為從我們使用C語言寫下第一行代碼的那一刻起,其實我們就已經(jīng)在操控硬件了(內(nèi)存訪問、數(shù)據(jù)傳送、CPU執(zhí)行就是硬件行為)。
下一節(jié),看透單片機!
歷時籌備一年,于振南老師結(jié)合多年實戰(zhàn)經(jīng)驗,全新系統(tǒng)性的打造了一套課程《十天登頂嵌入式C語言之巔(高手C)》,一共100講,總課時2000多分鐘,為我們解密了很多嵌入式C語言中你所不知道、經(jīng)常出錯的問題。
希望這套課程,可以讓那些已經(jīng)入門C語言,還在【半山腰】徘徊的人們,能夠再提升一個層次,最終登頂嵌入式C語言之巔峰!!課程7月底更新完之后恢復原價1299元,6.18日-6月20日進行三天活動,特惠499元,感興趣的同學可以在下面海報掃碼先去看看免費章節(jié),今晚再行入手!轉(zhuǎn)發(fā)下面海報到微信群或朋友圈,可以找老宇哥返現(xiàn)69元!
點擊閱讀原文注冊,跟小伙伴們一起學習吧!關(guān)鍵詞:
您可能也感興趣:
為您推薦
每日報道:觀龍舟,品木槿!“古韻古城·資水資陽”端午美食文化旅游節(jié)開幕
重要突破!我國最長深水油氣管道鋪設(shè)完工
當前熱議!河南省臨潁縣發(fā)布冰雹橙色預警
排行
最近更新
- 【連載】謹以此文,向大家講述振南十多年前入門單片機階段的...
- 實時:巴州區(qū)梓橦廟小學開展端午節(jié)系列活動
- “萌心童趣 與‘粽’不同” ——彭山區(qū)機關(guān)幼兒園開展端午...
- 全球球精選!摩爾多瓦外交部召見俄羅斯駐摩大使
- 專家稱“泰坦號”潛艇或已斷電進水,24小時浮出水面功能失效-...
- 時間、空間可控的視頻生成走進現(xiàn)實,阿里大模型新作VideoComp...
- 世界通訊!鄔君梅母女游玩,82歲明星媽媽身姿挺拔好美,她穿...
- 開個燒烤店賺錢嗎?肉坨坨現(xiàn)拌烤肉加盟實現(xiàn)你的致富夢想!
- 佳人苑設(shè)計理念上來自江南的風情文化|前沿資訊
- 喬東被查!
- 世界熱訊:債券注冊制改革落地,中介機構(gòu)監(jiān)管趨嚴,強化以償債...
- 中國銀行董事長葛海蛟會見瑞士日內(nèi)瓦州副州長方塔奈
- 天天播報:聽文物講故事·端午|古代名畫帶你解鎖端午“斗草”
- 貴州省女子強制隔離戒毒所教育宣傳進校園活動走進南明區(qū)
- 侯澤民醫(yī)生隆胸怎么樣靠譜嗎?給你醫(yī)生背景簡介!速覽~
- 期貨市場擴容助力實體企業(yè)保鏈穩(wěn)鏈
- 家居植物風水講究與禁忌最新介紹 家居植物擺放風水禁忌
- 全球快資訊:鋰電池行業(yè)下半年度投資策略:圍繞三條主線布局
- 天天快資訊丨家里養(yǎng)荷花好嗎 荷花怎么養(yǎng)
- 師生共創(chuàng)五米長卷,中國美術(shù)學院攜《英雄聯(lián)盟手游》弘揚國風魅力
- 天天熱點評!山東省路橋集團有限公司舉辦黨建生產(chǎn)經(jīng)營融合交...
- 世界新消息丨上市公司AI“沖浪” 謹防“亂上頭”
- 東德和西德怎么統(tǒng)一的(東德和西德怎么統(tǒng)一的背景)|當前獨家
- 世界快看:瓦特是哪個世紀的人 瓦特是什么時候的人
- 快訊|長沙已有收費站管制,多個收費站交通流量大
- 世界微動態(tài)丨這些生肖女天生旺夫命,年齡越大越富有,娶回家...
- 感動不會變成愛,不要試著感動一個處女座 焦點播報
- 當前快看:生肖豬7月17日起喜事接二連三,財運,愛情,事業(yè)大豐收
- 【全球熱聞】高考成績即將公布,請到以下平臺查分!
- 福建日報社記者“對話崇武古城” 聚焦古城保護傳承和活化利用
今日要聞
- 世界新消息丨上市公司AI“沖浪” 謹防“亂上頭”
- 什么是股市中的杠桿-什么是股市杠桿,有很大風險么?|天天微動態(tài)
- 貴州主要城市天氣預報 環(huán)球熱門
- 這名“女老大”為首犯罪團伙被摧毀,警方征集線索!
- 世界今亮點!現(xiàn)代汽車將關(guān)閉在華兩家工廠,產(chǎn)品將從13款減少至8款
- 世界消息!寧夏銀川燒烤店爆炸事故9名責任人已被控制
- 2023全球數(shù)字經(jīng)濟大會7月舉行 將呈現(xiàn)“五大亮點” 每日時訊
- 有明海日本料理_對于有明海日本料理簡單介紹
- 叮咚!您有一份端午天氣預報,請查收|世界信息
- 世界快看:瓦特是哪個世紀的人 瓦特是什么時候的人