1. 程式人生 > >10.3 輸入輸出的控制方式

10.3 輸入輸出的控制方式

來講 假設 外賣 訪問方式 控制寄存器 個數 一次 也會 技術

計算機組成

10 輸入輸出設備

10.3 輸入輸出的控制方式

技術分享圖片

現在看來,跟外界交互也沒有那麽復雜嘛。跟以前與存儲器的交互差不了多少,我給一個地址,得到一個數;或者給一個地址,寫進去一個數,這樣就跟外設進行交互了。這麽說也不是不對,最簡單的情況確實是這樣的。那我們也不妨從這最簡單情況開始說起吧。

技術分享圖片

CPU控制外設進行輸入輸出的方式主要有三種。

  1. 程序控制方式
  2. 中斷控制方式
  3. 直接存儲器訪問方式

技術分享圖片

那我們先來看第一種程序控制方式。我們還是用這個並行接口作為例子,來講解程序控制方式是如何工作的。

技術分享圖片

程序控制方式。顧名思義,其數據傳送都是在程序的控制下進行的。這個方式又有兩種具體的形式。第一種成為無條件傳送方式,這種方式適合於簡單外設的操作。我們假設外設始終處於準備好的狀態,直接編寫輸入輸出指令進行傳送數據就可以了。這樣編寫出來的控制程序可以非常的簡單。

技術分享圖片

像撥碼開關、數碼管,都是這樣的簡單外設,適合采用無條件傳送的方式。比如要控制數碼管這樣的設備,我們只用在程序中簡單寫一個out指令,把想要點亮的數碼管的對應的比特置一,而並行接口則會將這個數直接放到並行數據輸出線上,這次傳送就完成了。

同樣,如果要進行輸入。因為這些撥碼開關連接到了並行接口的數據輸入寄存器,所以CPU只需要簡單寫一個in指令,從數據輸入寄存器這個端口讀入數據,就可以得到當前撥碼開關的值。

但是對於稍微復雜一點的設備,這樣的方式就不適用了。

技術分享圖片

我們就得采用程序控制方式當中的另一種,叫做程序查詢傳送方式。

在這種方式下,我們先得編寫一段程序,用來查詢外設的工作狀態。在確定外設已經準備就緒的時候,才進行數據的傳送。

技術分享圖片

我們以打印機和掃描儀這樣的設備為例,這些設備也是可以連接在並行接口上的。但是除了剛才提到的那8位並行數據線,還應該有2根信號線來標明發送方和接收方是否已經準備好。對於輸入設備和輸出設備都是如此。這對用於交互聯絡的信號,就叫做握手信號。在數據傳輸的每一步,都需要通過握手信號進行確認,然後才可以進行下一步的傳輸。

技術分享圖片

那我們先通過數據輸出的過程,來看一看程序查詢方式是怎麽工作的。

現在CPU通過系統總線連到了並行接口,而並行接口的外面連接了一個輸出設備,可以是一個打印機。我們現在要編寫一段程序,希望在打印機上打印出一段文字。

首先CPU要執行out指令,去寫接口當中的控制寄存器。控制寄存器當中由若幹個位域組成,這些位域有著不同的含義,通常是用來設置這個並行接口的工作模式。比如說接口的時鐘頻率應該是多少,對外的接口信號是高電頻有效,還是低電頻有效。我們要寫進控制寄存器的這個數值,常被稱作控制字。在通常情況下,在初始化的時候寫入一次控制字就可以了。然後這個接口就會按照這樣設置的工作模式一直工作下去。除非要改變工作模式,才需要重新寫入控制字。那好,現在設置好了工作模式,我們就可以正式開始傳輸了。那麽在這段程序裏面,接下來要寫一個out指令,將我們要打印的數據傳送到這個接口的輸出緩沖寄存器中。當這條out指令執行完之後,並行接口的硬件電路就會將輸出緩沖寄存器當中的內容送到並行數據輸出信號線上,並且會將輸出準備好信號置為有效。

技術分享圖片

而對於這個打印機外設來說,它一直在監測輸出準備好這根信號。一旦發現這根信號有效,就會從並行數據輸出信號上采樣數據,然後將輸出回答信號置為有效,表示它已經接收到了這個數據。這個數據可能表示一個字符,現在打印機就可以把這個字符打印在紙上了。

我們要註意,在這種情況下,這個握手信號是必須的。因為打印機這樣的外設,單純看並行數據輸出這組信號,並不能判斷當前是否來了數據。因為這組數據線即使是全0,也可能是有含義的。所以,必須要等到並行接口發出了這個輸出準備好信號,它才會去采樣,而且只采樣一次。在打印機將輸出回答信號置為有效後,它又處於等待狀態。那這個並行接口芯片發現輸出回答信號有效之後,就會讓狀態寄存器當中的某一位置為有效。這個狀態位叫做輸出緩沖空,表示當前輸出緩沖寄存器中已經沒有需要發送的數據了。

而在剛才的這個過程當中,CPU實際上還在反復的執行指令,不斷的從狀態寄存器這個端口中,把數據讀出來。那麽從狀態寄存器當中讀出的這個數,就稱為狀態字。因為現在這段程序是在做數據輸出,所以CPU讀出狀態字之後,就會檢查當前的這個狀態字中輸出緩沖空這個狀態位是否是有效的。如果無效,那就再執行一次in指令,繼續讀狀態寄存器。所以,我們可以想像,這段程序應該是一條in指令,然後是幾條邏輯運算指令去檢查對應的狀態位是否有效,然後是一條條件轉移指令決定是否要跳回去繼續執行那條in指令。直到有一次讀出來的狀態字中輸出緩沖空這個狀態位是有效的,CPU就會將下一個要打印的字符,用out指令送到並行接口的輸出緩沖寄存器當中去,然後開始下一輪的輸出過程。這樣不斷的執行,打印機就可以打出很多的文字來了。

技術分享圖片

我們再來看一個數據輸入的過程。我們可以假想這個外設是一個掃描儀。我們現在啟動一個控制掃描儀的程序,同樣在初始化時,CPU會執行out指令,將控制字寫入接口的控制寄存器當中,設置好這個並行接口的工作模式。然後我們操作這個掃描儀開始工作,掃描儀可能掃完了一張圖片,但是先要存在掃描儀內部的緩沖區當中。然後將其中第一個字節放到並行數據輸入信號線上,然後將輸入準備好信號置為有效。而並行接口的硬件一直在檢查輸入準備好信號是否有效,一旦發現這根信號有效,就會采樣並行數據輸入信號線上的內容,然後放入輸入緩沖寄存器當中。同時將輸入回答信號置為有效,這個信號是告訴外設先不要傳送新的數據,因為我們現在設計的這個並行接口,它的輸入緩沖寄存器只有一個字節,所以一次只能接收一個字符。如果是更為先進的並行接口,這個輸入緩沖可能會更大一些,這樣一次就可以接收更多的數據。我們現在還是只接收了這一個字節。

技術分享圖片

接收完之後,接口還是需要將狀態寄存器當中輸入緩沖滿這個狀態位置為有效。而在這個過程中,CPU應該一直在執行一段循環代碼,從狀態寄存器當中不斷的讀出狀態字,然後檢查輸入緩沖滿這個狀態位是否有效。一旦發現這個狀態位有效,就會繼續執行後面的指令。那後面就應該是一條in指令,從輸入緩沖寄存器這個端口讀入數據,這就是從掃描儀傳過來的第一個字符。一旦CPU將這個數據讀走了,那並行接口電路就會將輸入回答信號置為無效,等待外設輸入新的數據。當然同時也會將狀態寄存器當中輸入緩沖滿這個狀態位置為無效。在這個過程中,掃描儀一直在監測輸入回答這個信號。一旦發現無效了,它就將它自己內部緩沖區當中的第二個字符,送到並行數據輸入上。同時再次將輸入準備好信號置為有效,這樣就開始了第二個字符的傳輸工作。如此往復,就可以完成很多數據的傳輸。

技術分享圖片

那我們再來看一看程序控制方式的優缺點。

其中的無條件傳送方式,優點是要編寫的控制程序非常的簡單。但缺點是只適用於非常簡單的外設的操作。像打印機這種還不算太復雜的設備,就已經不適用了。

而程序查詢傳送方式,由於有了握手的過程,比無條件傳送方式準確和可靠。但它的缺點是查詢外設狀態占用了大量的時間。

這兩種方式還有一些共同的特點。它的優點在於對外設的要求比較低,不需要外設在接口上有很復雜的功能。而且控制程序的操作流程非常的清晰。但是缺點在於,要靠CPU進行數據的傳送,如果要傳送的數據量很大,除了查詢外設狀態花的時間之外,一個一個傳送數據也需要花費大量的時間,占用了CPU非常寶貴的運算資源,從而可能影響整個計算機系統的性能。

技術分享圖片

程序控制方式確實簡單易行,那對於出門開關一個小燈泡這樣的事情,應該是沒有問題的。但是如果稍微復雜一些的情況呢,比如說我定了一個外賣,要送一份午餐過來。那我不知道它什麽時候才能送到,那我們如果用程序控制的方式,比如說用無條件傳送的方式,我正在看書,做一條條運算的之後。突然一條寫著去校門口把這個外賣拿回來。我就放下書本,到了校門口,不管是什麽東西,看見就拿,啪,給拿回來了。然後拿回來以後呢,不管是什麽,張嘴就吃,就把這當午餐給吃了。這恐怕不太合適,對吧,肯定會出問題。所以,那我們用程序查詢模式呢,那麽就是這樣 —— 我們做的運算說要去拿外賣了,然後去校門口看一眼有沒有外賣。好,我就去了。校門口一看,哎呀,沒有。回來了。然後寫著再去校門口看一眼,好,放下書本,再去校門口看一眼,沒有再回來。一直在做這個循環,一直放、看、沒有、看、沒有。然後直到有一次,看到有了,就把這個盒飯拿回來,可以吃上這頓午飯了。飯雖然是吃上了,但是這事兒恐怕就幹不成了,這一整天啥也沒幹,就光顧等這飯了。所以這個方式呢,看來還是不太實用,我們還得想新的辦法。

10.3 輸入輸出的控制方式