因?yàn)?a target="_blank">單片機(jī)有CPU、存儲(chǔ)器、IO等等,使他(人性化一點(diǎn)以配合下文)看起來(lái)就像一個(gè)比較小的計(jì)算機(jī),所以在理解單片機(jī)的時(shí)候如果能把你之前有的那些也許僅僅是直覺上的對(duì)計(jì)算機(jī)的理解融入進(jìn)來(lái)的話,可能會(huì)對(duì)你學(xué)習(xí)單片機(jī)的概念有極大的幫助,至少對(duì)于我是這樣的。
我想在關(guān)于單片機(jī)的眾多讓你頭暈?zāi)X脹、摸不著頭腦甚至想撞墻的概念里面,“堆棧”可能是其中最可惡的一個(gè),因?yàn)榧词箚螁问菑臐h語(yǔ)的角度來(lái)理解這個(gè)詞就已經(jīng)讓你很暈了,其實(shí)我最初也想不通這是哪位大俠的創(chuàng)意,不過(guò)不用擔(dān)心,這里我們完全不去討論關(guān)于這個(gè)詞的問(wèn)題(這個(gè)詞用得其實(shí)很好“堆”和“棧”都有他們各自思,準(zhǔn)確的概括了這個(gè)區(qū)域的功能,有興趣可以Baidu一下),這里我會(huì)打一個(gè)比較有趣的比方,以此來(lái)繞過(guò)那些令你想撞墻的概念,并使你在直覺上對(duì)“堆?!边@個(gè)概念有一個(gè)深刻的理解。
你基本上應(yīng)該清楚,單片機(jī)里面是有存儲(chǔ)區(qū)和CPU的,如果你不清楚,那么我剛剛告訴你了,請(qǐng)記住?,F(xiàn)在,請(qǐng)你把單片中的CPU想成一個(gè)人(你完全可以把他想成是你宿舍的那個(gè)天天和你吵嘴的同學(xué),一會(huì)你就會(huì)發(fā)現(xiàn)這會(huì)非常有趣)在這里就叫他C哥吧,不過(guò)這個(gè)人不同于常人,有一些特點(diǎn),一會(huì)我們會(huì)慢慢說(shuō)清楚,現(xiàn)在要告訴你的關(guān)于這個(gè)人的第一個(gè)特點(diǎn)
是:他的記憶能力很差。下面,請(qǐng)你把存儲(chǔ)區(qū)想象成一個(gè)一個(gè)排好的小盒子,這些盒子的作用大致可以分成兩類:1、保存寫有你命令的紙條,比如你在某個(gè)盒子里面的紙條上寫著:去洗我的襪子!;2、保存你的一些東西,比如你那雙正在污染宿舍空氣的臭襪子。因?yàn)镃哥是一個(gè)記憶力不怎么好的人,所以,這些盒子都有自己的編號(hào),以方便他查找。
那么,現(xiàn)在,我們可以來(lái)說(shuō)明一下單片機(jī)是如何工作的了。首先,你要把所有的命令還有需要處理的東西放進(jìn)那些小盒子,比如剛才提到的你那雙待洗的襪子還有那張紙條,這時(shí)你應(yīng)該發(fā)現(xiàn)C哥另一個(gè)特點(diǎn):笨——他只會(huì)做你明確告訴他的事情,也就是說(shuō),如果你沒(méi)有在紙條上寫“去洗我的襪子!”,那么C哥極有可能會(huì)無(wú)動(dòng)于衷地看著你的襪子直到他被熏暈倒,當(dāng)然,更可能的情況是他根本找不到你的襪子…
好了,當(dāng)你把要做的事情和該怎么做寫到盒子里之后,下面的任務(wù)就交給C哥了。C哥做事真的很講原則,他會(huì)按照你給定的順序或者——如果你沒(méi)有給定的話,根據(jù)盒子上面的編號(hào)按照從小到大的順序——一個(gè)一個(gè)地打開盒子,讀取里面的命令、處理相應(yīng)的事件,直到所有的事情都執(zhí)行完畢,他就會(huì)休息。請(qǐng)你牢記這個(gè)簡(jiǎn)單而有趣的過(guò)程,因?yàn)槠鋵?shí)單片機(jī)就是這樣工作的,當(dāng)然,這里忽略了許多細(xì)節(jié),但是這對(duì)你從直覺上理解單片機(jī)的概念以及足夠了。
下面,就要開始說(shuō)明堆棧這個(gè)概念了,思來(lái)想去,還是覺得如果直接把“堆棧”這個(gè)詞用到文中來(lái),實(shí)在不符合本文的風(fēng)格,考慮到其實(shí)“堆?!币彩谴尜A區(qū)(這一點(diǎn)你要記住,堆棧并不是一個(gè)像專用寄存器那樣專門的一個(gè)區(qū)域,它是由你在通用RAM區(qū)指定的。),按照本文的說(shuō)法也就是一些盒子,所以,現(xiàn)在我們把“堆?!备拿坝洃浐凶印?,你可以感覺到,“堆?!钡淖饔煤陀洃浻袠O大的關(guān)系,不過(guò)你也不用在這里糾結(jié)這個(gè)名字的由來(lái),下面我會(huì)說(shuō)的。
現(xiàn)在,請(qǐng)注意,我要開始解釋“記憶盒子”了,也就是“堆?!薄4笾律险f(shuō),“記憶盒子”的作用是當(dāng)C哥執(zhí)行某任務(wù)到一半的時(shí)候突然有了更緊急的是事情要執(zhí)行的時(shí)候用來(lái)保存當(dāng)前任務(wù)的(包括盒子的編號(hào)和盒子里面的東西)。這么說(shuō)你肯定暈了,其實(shí),通俗一點(diǎn),就是當(dāng)C哥洗襪子洗到一半的時(shí)候突然接到你的命令要去打開另一個(gè)盒子(那個(gè)盒子里的紙條上可能寫著“給我換尿布”)并執(zhí)行里面的命令,因?yàn)镃哥記憶力很差,以至于他做完那件緊急的事情后記不起要回到哪個(gè)盒子來(lái)繼續(xù)執(zhí)行“洗襪子”這個(gè)命令,這時(shí)候,他要把現(xiàn)在手頭的東西保存到“記憶盒子”里,要保存的東西有:
1、放著紙條和襪子的盒子的編號(hào)(注意這里其實(shí)是兩項(xiàng)內(nèi)容);
2、那雙襪子。這樣,當(dāng)他執(zhí)行完緊急任務(wù)后會(huì)去記憶盒子里,從里面找到兩張紙條,和一雙襪子(這個(gè)時(shí)候C哥還是沒(méi)有想起來(lái)他要洗襪子,他必須要到那張寫著洗襪子命令的紙條),他按照兩張紙條的信息知道自己要去哪個(gè)盒子去洗襪子,并在那里繼續(xù)完成洗襪子的任務(wù)。你可能會(huì)發(fā)現(xiàn),在這一段的解釋里面有一個(gè)重要的漏洞,那就是在C哥執(zhí)行完緊急任務(wù)后他是如何知道儲(chǔ)存著原來(lái)的任務(wù)信息的盒子的編號(hào)是存儲(chǔ)在哪個(gè)“記憶盒子”里呢?
別著急,下面我會(huì)解釋的。從本質(zhì)來(lái)說(shuō),“記憶盒子”與普通的盒子是沒(méi)有區(qū)別的,他們都是單片機(jī)里面的存儲(chǔ)單元,證明這一點(diǎn)的最好證據(jù)就是堆棧是需要你來(lái)指定的,也就是說(shuō),你要預(yù)先把一些盒子指定為“記憶盒子”。下面,說(shuō)明一下是如何指定“記憶盒子”的。
其實(shí)這個(gè)過(guò)程很簡(jiǎn)單,在單片機(jī)的專用寄存器里面有一個(gè)SP指針(81H),這個(gè)指針里面記錄著堆棧的開始處的地址。用符合本文的話來(lái)解釋就是,C哥的衣服上有一個(gè)口袋(也就是SP指針),這個(gè)口袋里面的“神奇紙條”上記錄著第一個(gè)“記憶盒子”的編號(hào),而指定“記憶盒子”的過(guò)程就是你在這張“神奇紙條”上寫上一個(gè)盒子的編號(hào)(作為第一個(gè)“記憶盒子”的編號(hào)),這個(gè)紙條會(huì)自動(dòng)地將紙條上的編號(hào)加1或者減1,所以,某個(gè)目前并不確定的區(qū)域內(nèi)盒子具備了成為“記憶盒子”的可能,注意,堆棧的大小是不能規(guī)定的,這就是為什么用“生長(zhǎng)”這個(gè)詞來(lái)形容堆棧。
現(xiàn)在,關(guān)于堆棧的概念基本上都介紹完了,但是,我知道,你可能還是很暈,甚至比看之前還暈,那是因?yàn)閯偛艛⑹龅倪@個(gè)過(guò)程是分開的,而且邏輯上并不是順序的,下面,順序的說(shuō)一下,相信你馬上就明白了。主角仍然是傻傻笨笨但任勞任怨的C哥,他一個(gè)一個(gè)的打開盒子按照里面的紙條上的說(shuō)明執(zhí)行你規(guī)定的任務(wù)。而你,為了防止他在執(zhí)行復(fù)雜任務(wù)時(shí)犯傻,把一個(gè)盒子指定為“記憶盒子”,并把這個(gè)“記憶盒子”的位置寫在了一張“神奇紙條”上放在了C哥的口袋里。
現(xiàn)在,C哥正在洗你的襪子,這個(gè)時(shí)候,他突然接到你的命令要去給你換尿布,而C哥知道自己很笨,所以他自動(dòng)地掏出了口袋里的紙條,找到了第一個(gè)“記憶盒子”,然后拿出一張空白紙條,把裝著“給我洗襪子”那張紙條的盒子的編號(hào)寫在了上面并放進(jìn)“記憶子”。然后,他把“神奇紙條”放回了口袋里。當(dāng)這個(gè)任務(wù)完成后“神奇紙條”會(huì)自動(dòng)將寫在它上面的編號(hào)加1也就是將一個(gè)新的、空的“憶盒子”的編號(hào)寫在上面。
之后,他會(huì)按照剛才的過(guò)程把裝著襪子的那個(gè)盒子的以及襪子本身分別放進(jìn)不同的記憶盒子(現(xiàn)在已經(jīng)有三個(gè)盒子成為“記憶盒子”,堆棧已經(jīng)長(zhǎng)大了,紅色下劃線的字體就是這三個(gè)盒子里的內(nèi)容,注意是有先后順序的)。再然后,他就去給你換尿布了… 現(xiàn)在,尿布換完了,不過(guò),果不其然,C哥完全忘記了他要給你洗襪子這件事情了,不過(guò),他記得一件事,那就是看口袋里的紙條。于是,他摸出了口袋里的紙條,上面當(dāng)然是一個(gè)“記憶盒子”的編號(hào),他按照編號(hào)找到了第一個(gè)“記憶盒子”(按照上一段的順序應(yīng)該是第三個(gè)“記憶盒子”),里面應(yīng)該是一雙你的襪子,于是他拿到了你的襪子。但是,他還是不知道。
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631973 -
cpu
+關(guān)注
關(guān)注
68文章
10804瀏覽量
210829 -
堆棧
+關(guān)注
關(guān)注
0文章
182瀏覽量
19717
原文標(biāo)題:一個(gè)講透了單片機(jī)堆棧的小故事
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論