第五十七章 闖禍(上)
以我現(xiàn)在的知識(shí)水平,要知其然已經(jīng)很是吃力了,更別說是要知其所以然。在老爹的幫助下,我點(diǎn)亮了流水燈、學(xué)會(huì)了包括但不限于串口通信、I2C、SPI和網(wǎng)絡(luò)。
驅(qū)動(dòng)屏幕、攝像頭、圖片解析、MP3解析和視頻解析還有文件系統(tǒng)的使用,其中最有意思的就是實(shí)現(xiàn)printf函數(shù)以及輸入法,但凡是計(jì)算機(jī)中常用到的功能,老爹都帶著我用單片機(jī)給實(shí)現(xiàn)了一遍。
老爹這么做并不是要我深度掌握這些技能,而是作為擴(kuò)展性知識(shí)。因?yàn)槔系f無論現(xiàn)在的高級(jí)編程語言和硬件的耦合性有多少,但其運(yùn)行還是依托于硬件之上的。有很多東西在設(shè)計(jì)上其實(shí)也是貼合硬件的,如果對(duì)硬件的知識(shí)多一些了解,那么在學(xué)習(xí)這些東西的時(shí)候就相對(duì)容易理解得多。
況且這個(gè)單片機(jī)是真的挺好玩兒的,我居然在老爹的幫助下做了一個(gè)可以聽歌、看電影、瀏覽圖片、看小說的MP4,我還特別為其移植了兩款經(jīng)典的紅白機(jī)游戲——超級(jí)瑪莉和魂斗羅。
為了支撐這兩款游戲的操作,老爹還特別給我做了一個(gè)外接鍵盤,鍵盤和單片機(jī)的通信使用的是串口。
經(jīng)過一些這一些列的學(xué)習(xí),我是真切的體會(huì)到了剛剛學(xué)習(xí)編程的時(shí)候,老爹跟我說的計(jì)算機(jī)中所有的東西都是由二組成的。
可以說,我已經(jīng)漸漸地領(lǐng)悟到了「二」的真意,以至于現(xiàn)在無論我看到什么,到了腦中都變成了一串二進(jìn)制。
當(dāng)然,完成這些東西足足花了我一年半的時(shí)間,轉(zhuǎn)眼間我就到了小學(xué)地最后一年——六年級(jí)。
在這一年多的時(shí)間中,通過和硬件緊密結(jié)合以及大量的事件,我對(duì)C語言的運(yùn)用不說是爐火純青,但至少已經(jīng)是得心應(yīng)手。
不僅如此,單片機(jī)其實(shí)就是一個(gè)微型的電腦,通過移植使用系統(tǒng),以小見大,見微知著,讓我對(duì)電腦操作系統(tǒng)有了一個(gè)深層次的理解。
這些東西目前來看似乎沒有什么作用,可是在今后的學(xué)習(xí)和工作中起著舉足輕重的作用。
老爹說過,任何事物都具有兩面性,既然在玩兒單片機(jī)的過程中帶來這么多美好的東西,當(dāng)然也會(huì)有讓人咬牙切齒的時(shí)候。
一開始調(diào)試串口的時(shí)候,死活就是不能和電腦通信,各種辦法都想盡了,結(jié)果還是不行,急得我眼淚都流出來了。
最有意思的就是內(nèi)存溢出的問題,經(jīng)過我和老爹的檢查,代碼沒有問題,但是程序死活就是不能在單片機(jī)中正確的運(yùn)行。
后來發(fā)現(xiàn),原來是我在函數(shù)內(nèi)部聲明了一個(gè)長度為512Byte的數(shù)組變量,導(dǎo)致堆棧溢出了。
因?yàn)閱纹瑱C(jī)的資源很有限,用于運(yùn)行程序的RAM(相當(dāng)于電腦的內(nèi)存條)很少,只有256KB,而單片機(jī)程序的內(nèi)存映射配置中只給棧分配了1KB的內(nèi)存,通過老爹之前將的C語言內(nèi)存結(jié)構(gòu)可以知道,聲明在函數(shù)中的局部變量都是保存在棧中的。
于是乎,老爹就和我說了malloc函數(shù)的用法,并且告誡我一定要記得釋放用malloc從堆中申請(qǐng)的內(nèi)存。
當(dāng)然,即便有老爹的耳提面命,我還是有忘記的時(shí)候,特別是又一次在for循環(huán)中通過malloc不斷申請(qǐng)內(nèi)存,并且沒有釋放。
然后就悲劇了,物理內(nèi)存很快就消耗殆盡,然后單片機(jī)就死了。
過后雖然找到了問題所在,但卻給了我一個(gè)靈感,如果我把這段程序用在電腦上,是不是就可以寫出來一個(gè)讓人電腦死機(jī)的惡搞程序了呢?
想到這里,我一下子就興奮了起來,然后就那自己的電腦試了一下。
寫了一個(gè)while死循環(huán),然后在里面不斷地申請(qǐng)1KB內(nèi)存。程序剛剛執(zhí)行,我就通過任務(wù)管理器看到內(nèi)存使用量蹭蹭蹭地不斷飆升,僅僅數(shù)秒之間,程序就卡得一動(dòng)都不能動(dòng)!最后只能夠強(qiáng)制斷電重啟才恢復(fù)正常。
對(duì)于這個(gè)結(jié)果,我很是滿意。
不過我又想到一個(gè)問題,要如何才能讓別人心甘情愿地運(yùn)行這個(gè)程序呢?畢竟這程序連個(gè)像樣的圖標(biāo)都沒有。
這個(gè)時(shí)候我想起了以前老爹跟我說過的一個(gè)叫「木馬」的東西,于是經(jīng)過一陣查閱資料后,我成功將程序偽裝成了一張紅包的圖片,只要有人點(diǎn)擊了這張圖片,程序就會(huì)立刻運(yùn)行,然后電腦就死機(jī)了。
嘗試了很多遍,效果和預(yù)期中的一樣。我對(duì)這個(gè)程序就更加滿意了,將其上傳到了家中的網(wǎng)盤上,準(zhǔn)備等到星期二上電腦課的時(shí)候惡搞一下班上的同學(xué)。
到時(shí)候我把這紅包圖片往群里一放,大家肯定爭先恐后的搶紅包,然后電腦就死機(jī)了!
想到他們傻眼的模樣,我忍不住的笑了。
「還有一個(gè)問題,如果這個(gè)程序能夠開機(jī)自動(dòng)啟動(dòng),那就算是斷電重啟也沒用了!」
閑來無事之余,我又開始思考這個(gè)惡搞程序的缺點(diǎn)所在。最后在網(wǎng)上查找資料,終于實(shí)現(xiàn)了程序開機(jī)啟動(dòng)。
原來Windows系統(tǒng)在開機(jī)的時(shí)候會(huì)自動(dòng)運(yùn)行某個(gè)文件夾下面的程序或者腳本,于是我就在這段惡搞程序中加了一段代碼,在第一遍運(yùn)行程序的時(shí)候?qū)⒊绦驈?fù)制一份到那個(gè)文件夾下。
當(dāng)然了,我才不會(huì)那么笨,在家里面用自己的電腦試。萬一真的成功了,電腦不是就開機(jī)、死機(jī)、開機(jī)、死機(jī)無線循環(huán)了么?
好不容易等到星期二微機(jī)課,等到老師讓我們自由操做的時(shí)候,我將偽裝成紅包圖片的程序發(fā)在了班級(jí)群眾。果然,沒過多久,同學(xué)們的電腦開始陸陸續(xù)續(xù)地死機(jī)。
當(dāng)然了,死機(jī)對(duì)于微機(jī)室里面這些配置低到爆的電腦來說是很正常的,大家也沒有多加留意,果斷按下了重啟鍵。
但是當(dāng)更多的人的電腦開始死機(jī)的時(shí)候大家就開始意識(shí)到了問題的所在,再加上那些重啟了電腦的人狀況依然沒有得到解決,所以很快這件事情就驚動(dòng)了老師。
很快,大家通過群里的聊天記錄就鎖定到了我頭上??粗蠋熻F青的臉色,我知道自己這次闖大禍了。