一、這樣理解數(shù)據(jù)存儲(chǔ)器 單片機(jī)的工作機(jī)制并不復(fù)雜,最主要的包括兩大系統(tǒng),即數(shù)據(jù)處理系統(tǒng)和數(shù)據(jù)存取系統(tǒng)。 打個(gè)比方說,你在做算術(shù)時(shí),流程是這樣的:你先把需要處理的兩個(gè)數(shù)據(jù)從題目上找來,然后按計(jì)算規(guī)則放在你的作業(yè)本上,然后對這兩個(gè)數(shù)據(jù)進(jìn)行算術(shù)計(jì)算,然后將結(jié)果寫在計(jì)算式后面,然后你可能還要將計(jì)算結(jié)果寫在別的地方如卷子上。 在這個(gè)流程中,算術(shù)計(jì)算是依靠你的大腦的處理來得到的,你的大腦就是數(shù)據(jù)處理系統(tǒng),而把數(shù)據(jù)拿過來就是數(shù)據(jù)的“取”,將結(jié)果寫在卷子上就是“存”。在這其中,“存”“取”所用到的介質(zhì),就是存儲(chǔ)器。 數(shù)據(jù)處理與數(shù)據(jù)存取,是單片機(jī)的核心,單片機(jī)對數(shù)據(jù)進(jìn)行什么樣的處理,我們只需給它一個(gè)命令,它就會(huì)自己去實(shí)現(xiàn),我們并不需要知道它的詳細(xì)的處理過程;而對于數(shù)據(jù)從哪里取、取后放在什么地方、處理后的結(jié)果需要放在什么地方,這個(gè)就得程序員來一個(gè)一個(gè)地安排了,單片機(jī)自己是不會(huì)做的,也就是如果你不告訴它需要處理的數(shù)據(jù)在什么地方,處理完成后的結(jié)果需要放在哪,它是不會(huì)自己來自動(dòng)安排的。當(dāng)然,我們這里說的是匯編語言和機(jī)器語言。 另外說一句:所計(jì)算出來的結(jié)果是作什么用的即其用途是什么,那就是另外一件事了。這些用途之類的處理,并不是單片機(jī)的核心功能,而只是其拓展功能,核功能仍是數(shù)據(jù)處理與數(shù)據(jù)存取。 學(xué)習(xí)與理解匯編語言編程原理其實(shí)很簡單,一是記住單片機(jī)本身有哪些數(shù)據(jù)處理命令,這個(gè)通過多編程就可以記住了;第二就是對數(shù)據(jù)進(jìn)行合理的存取位置安排與計(jì)劃,這個(gè)只要你理解了存儲(chǔ)器的設(shè)置機(jī)理,你就可以很好地做到。 二、這樣理解程序存儲(chǔ)器 我們在做算術(shù)題時(shí),用到的“存取”,只是對數(shù)據(jù)的操作,這些數(shù)據(jù),我們要么寫在草稿紙上要么寫在作業(yè)本上或卷子上。這個(gè)在單片機(jī)中,對應(yīng)的,就是數(shù)據(jù)存儲(chǔ)類存儲(chǔ)器,即教科書上所說的數(shù)據(jù)存儲(chǔ)器,只對需要處理的數(shù)據(jù)和計(jì)算結(jié)果進(jìn)行存取操作。 以上做法,在題目簡單計(jì)算步驟較少需處理的數(shù)據(jù)較少時(shí),你可以只用你的大腦來記憶控制整個(gè)計(jì)算流程就行了,但是,當(dāng)計(jì)算工作量很大時(shí),特別是需要很長時(shí)間比如得幾天,那么你就不能只憑大腦來控制整個(gè)計(jì)算流程了,你得先寫一個(gè)計(jì)算的流程書來說明整個(gè)計(jì)算步驟,然后你就按這個(gè)流程書一步一步地來進(jìn)行計(jì)算,每執(zhí)行一步都做個(gè)標(biāo)記以表示你已經(jīng)做完這一步了,這樣,不管多復(fù)雜的計(jì)算題,你都不會(huì)弄亂。 其實(shí),單片機(jī)本身是沒有一個(gè)能夠控制整個(gè)計(jì)算流程的大腦的,它的每一步操作,包括從哪里取數(shù)據(jù)、對數(shù)據(jù)進(jìn)行什么樣的處理、處理后的結(jié)果存在哪,都必須由程序員事先告訴它。怎么告訴它?這就是我們所寫的程序即前面說的流程書。這些寫好的程序要交給單片機(jī)即存入單片機(jī)內(nèi)(或單片機(jī)能找到的地方),單片機(jī)才能按這個(gè)寫好的程序來一步一步地按程序員的要求來執(zhí)行。這個(gè)存放程序的地方,就是單片機(jī)的程序存儲(chǔ)器。在這里,我們還知道了為什么我們要給單片機(jī)寫程序。 有一點(diǎn)要說明的是,單片機(jī)中寫在程序中的需要處理的數(shù)據(jù)是存在程序存儲(chǔ)器中的,至于其如何區(qū)分指令與數(shù)據(jù),想知道的可以百度一下(我發(fā)誓不是給百度做廣告)。 三、這樣理解數(shù)據(jù)存儲(chǔ)器的種類 數(shù)據(jù)存儲(chǔ)器的分類方法之一,就是其距離數(shù)據(jù)處理器的時(shí)間距離(不是物理距離),這個(gè)距離,決定了單片機(jī)存取數(shù)據(jù)所花費(fèi)的時(shí)間,直接影響到程序運(yùn)行的時(shí)間。為什么我要在這里說時(shí)間?因?yàn)檫@直接關(guān)系到單片機(jī)的運(yùn)行速度,單片機(jī)的工作原理很簡單,但在芯片設(shè)計(jì)上,設(shè)計(jì)師最主要的精力并不是功能方面的,而是提高運(yùn)行速度,它決定著你的芯片能否賣得出去并賣出個(gè)好價(jià)錢。所以,數(shù)據(jù)存儲(chǔ)器作為單片機(jī)的核心之一,其設(shè)計(jì)布置,以保證提高運(yùn)行速度為根本。 還是以做算術(shù)題為例,就只做兩個(gè)數(shù)據(jù)的算術(shù)計(jì)算時(shí),這兩個(gè)數(shù)據(jù)其實(shí)是就放在你眼前的一張紙,你抬眼就能找到它。這是第一種情況。 當(dāng)數(shù)據(jù)多了時(shí),你的數(shù)據(jù)就要記在一個(gè)本子上了,找數(shù)據(jù)時(shí)你可能就要翻本子了,這個(gè)是第二種情況,比第一種情況多花一些時(shí)間。 當(dāng)數(shù)據(jù)量更大、而你的本子記不下了時(shí),怎么辦?那你就要記在別的本子上了。這就是第三種情況了。這時(shí)問題就來了,你放在手上的只有第一個(gè)本子,你的這個(gè)本子是編了頁碼的,你在這個(gè)本子上找數(shù)據(jù)是根據(jù)頁碼來找的,你增加了一個(gè)本子后,怎么才能在這第二個(gè)本子上找到你所需要的數(shù)據(jù)?跟在第一個(gè)本子的后面續(xù)編頁碼么?還是采用其它方法?這里我們暫不討論,只說明一下,這第三種情況,其所花費(fèi)的時(shí)間,與采用的尋找數(shù)據(jù)的方法有直接關(guān)系,但最好的情況,也不過是與第二種情況所花費(fèi)的時(shí)間一樣多,基本上都會(huì)超過第二種情況。(思考一下,為什么片外RAM可以從地址0000開始,但片外ROM則不能) 從以上三種情況來看,存儲(chǔ)結(jié)構(gòu)的設(shè)計(jì),將直接關(guān)系到單片機(jī)的運(yùn)行速度,而我們知道,第一種情況是最快的,所以,在結(jié)構(gòu)設(shè)計(jì)時(shí),應(yīng)盡可能多的將存儲(chǔ)器放在你眼前,這個(gè)放在單片機(jī)眼前的,就是累加器、B寄存器之類的,抬眼就能找到的。在物理設(shè)計(jì)上,它們與數(shù)據(jù)處理器是直接電路連接的即專用且直通方式,是每一個(gè)這類寄存器一個(gè)專用“車道”與數(shù)據(jù)處理器連接,同時(shí)設(shè)計(jì)了一個(gè)專用機(jī)器指令,對應(yīng)于匯編指令,也是每一個(gè)這類寄存器有一條專用指令。這些單元,其實(shí)在芯片硬件電路設(shè)計(jì)中是屬于CPU部分的,而不是在RAM中,我們可以稱之為核心存儲(chǔ)單元。 第二種情況,對應(yīng)的就是書上所說的片內(nèi)數(shù)據(jù)存儲(chǔ)器中的一部分,這部分就是編了頁碼的本子(這里有一點(diǎn)要說明的是,核心存儲(chǔ)單元其實(shí)也在這個(gè)本子上占了頁碼的)。這一類,我們稱之為片內(nèi)編碼式存儲(chǔ)單元即書上所說的片內(nèi)RAM。 第三種情況,對應(yīng)的就是片外編碼式存儲(chǔ)單元即片外RAM。 四、這樣理解尋址方式 好了,從上面所述,單片機(jī)用到的存儲(chǔ)器其實(shí)就只有四種:三種數(shù)據(jù)存儲(chǔ)類和一種程序存儲(chǔ)類。 單片機(jī)在對數(shù)據(jù)處理前和處理后,所做的事就是對數(shù)據(jù)的存與取,所謂尋址方式,就是找數(shù)據(jù)存數(shù)據(jù),通俗地說是倒騰數(shù)據(jù),專業(yè)一點(diǎn)的說法是數(shù)據(jù)傳送,從這個(gè)存儲(chǔ)器到那個(gè)存儲(chǔ)器,不過有一點(diǎn),單片機(jī)的設(shè)計(jì)上,有些存儲(chǔ)器之間是不能直接進(jìn)行數(shù)據(jù)倒騰的,而是必須通過A寄存器等的。需要說明的是,單片機(jī)在運(yùn)行時(shí),程序存儲(chǔ)器中的內(nèi)容是不可改變的,所以運(yùn)行時(shí)對程序存儲(chǔ)器只有“取”操作,而沒有“存”操作。 明白了存儲(chǔ)器的設(shè)計(jì)分類,明白了所謂尋址不過是數(shù)據(jù)倒騰,那你自然明白所謂的尋址方式是怎么回事了,甚至,你可以不管所謂的尋址方式,你在編程時(shí)只要清楚你準(zhǔn)備如何安排數(shù)據(jù)的存取位置,然后你從現(xiàn)成的匯編指令中找到合適的數(shù)據(jù)存取指令并應(yīng)用之就行了。 PS:個(gè)人覺得教科書中的尋址方式分類法,并不能反映數(shù)據(jù)倒騰的根本,甚至?xí)屓酥淙欢恢渌匀,?huì)僵化你的編程,所以,我們要多角度來理解數(shù)據(jù)的倒騰方式以全面了解之。 PS2:所謂的位操作,我們其實(shí)知道,利用現(xiàn)有的匯編指令可以實(shí)現(xiàn)對任一存儲(chǔ)單元中任一位的操作,但那屬于軟件操作。而單片機(jī)中給定的位操作指令,都是硬件實(shí)現(xiàn),即操作指令發(fā)出后,對位的操作過程全部由芯片內(nèi)的硬件邏輯電路來實(shí)現(xiàn),在電路上這樣設(shè)計(jì)的目的,只是為了快速實(shí)現(xiàn)。這個(gè)電路,就是書中所說的位處理器。 PS3:數(shù)據(jù)傳送指令,還有一種分類方法,那就是專用傳送指令和通用傳送指令。專用傳送指令是指直通車式存儲(chǔ)單元之間的數(shù)據(jù)傳送,不同的直通車式存儲(chǔ)單元之間的數(shù)據(jù)傳送,每一樣都專門有一個(gè)機(jī)器指令,這樣設(shè)計(jì)的目的,同樣是為了快速。通用傳送指令就是一條指令可以用于多個(gè)存儲(chǔ)單元,只需在該指令后面寫上要操作的存儲(chǔ)單元就是了。當(dāng)然,這種說法,針對的是機(jī)器指令。 |