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