嵌入式學(xué)習和發(fā)展(七)-DMA(直接存儲器訪問)

姓名:姜思維? ? ? ? ?學(xué)號:19020100333? ? ? ? 學(xué)院:電子工程學(xué)院

轉(zhuǎn)自:https://blog.csdn.net/weixin_41213648/article/details/88204328?spm=1001.2014.3001.5501

【嵌牛導(dǎo)讀】DMA(直接存儲器訪問)

【嵌牛鼻子】DMA? ? ?直接存儲器訪問

【嵌牛提問】什么是DMA的直接存儲器訪問?

【嵌牛正文】

 DMA是指外部設(shè)備不通過CPU而直接與系統(tǒng)內(nèi)存交換數(shù)據(jù)的接口技術(shù)。

  要把外設(shè)的數(shù)據(jù)讀入內(nèi)存或把內(nèi)存的數(shù)據(jù)傳送到外設(shè),一般都要通過CPU控制完成,如CPU程序查詢或中斷方式。利用中斷進行數(shù)據(jù)傳送,可以大大提高CPU的利用率。

?   但是采用中斷傳送有它的缺點,對于一個高速I/O設(shè)備,以及批量交換數(shù)據(jù)的情況,只能采用DMA方式,才能解決效率和速度問題。DMA在外設(shè)與內(nèi)存間直接進行數(shù)據(jù)交換,而不通過CPU,這樣數(shù)據(jù)傳送的速度就取決于存儲器和外設(shè)的工作速度。

  通常系統(tǒng)的總線是由CPU管理的。在DMA方式時,就希望CPU把這些總線讓出來,即CPU連到這些總線上的線處于第三態(tài)--高阻狀態(tài),而由DMA控制器接管,控制傳送的字節(jié)數(shù),判斷DMA是否結(jié)束,以及發(fā)出DMA結(jié)束信號。DMA控制器必須有以下功能:

  1. 能向CPU發(fā)出系統(tǒng)保持(HOLD)信號,提出總線接管請求;

  2. 當CPU發(fā)出允許接管信號后,負責對總線的控制,進入DMA方式;

  3. 能對存儲器尋址及能修改地址指針,實現(xiàn)對內(nèi)存的讀寫操作;

  4. 能決定本次DMA傳送的字節(jié)數(shù),判斷DMA傳送是否結(jié)束

  5. 發(fā)出DMA結(jié)束信號,使CPU恢復(fù)正常工作狀態(tài)。

如圖是DMA控制器硬件結(jié)構(gòu)示意圖。

  DMA的可能引腳說明:

  數(shù)據(jù)總線:用于傳送數(shù)據(jù)。

  地址總線:用于選擇存儲器地址。

  數(shù)據(jù)傳送信號:MEMR為存儲器讀操作信號,MEMW為存儲器寫操作信號,IOR為外設(shè)讀操作信號,IOW為外設(shè)寫操作信號。

  DRQ:DMA請求信號。是外設(shè)向DMA控制器提出要求DMA操作的申請信號。

  DACK:DMA響應(yīng)信號。是DMA控制器向提出DMA請求的外設(shè)表示已收到請求和正進行處理的信號。

  HOLD:總線請求信號。是DMA控制器向CPU要求讓出總線的請求信號。

  HLDA:總線響應(yīng)信號,是CPU向DMA控制器表示允許總線請求的應(yīng)答信號。

5.2  DMA工作方式

  隨著大規(guī)模集成電路技術(shù)的發(fā)展,DMA傳送已不局限于存儲器與外設(shè)間的信息交換,而可以擴展為在存儲器的兩個區(qū)域之間,或兩種高速的外設(shè)之間進行DMA傳送,如圖所示。

  DMAC是控制存儲器和外部設(shè)備之間直接高速地傳送數(shù)據(jù)的硬件電路,它應(yīng)能取代CPU,用硬件完成數(shù)據(jù)傳送的各項功能。

  各種DMAC一般都有兩種基本的DMA傳送方式:

1. 單字節(jié)方式:每次DMA請求只傳送一個字節(jié)數(shù)據(jù),每傳送完一個字節(jié),都撤除DMA請求信號,釋放總線。

2. 多字節(jié)方式:每次DMA請求連續(xù)傳送一個數(shù)據(jù)塊,待規(guī)定長度的數(shù)據(jù)塊傳送完以后,才撤除DMA請求,釋放總線。

  在DMA傳送中,為了使源和目的間的數(shù)據(jù)傳送取得同步,不同的DMAC在操作時都受到外設(shè)的請求信號或準備就緒信號--Ready信號的限制。

5.3 DMA控制器8237

Intel 8237/8237-2是一種高功能的可編程的DMA控制器,采用5MHz的8237-2傳送,速度可達到1.6M字節(jié)/秒。

8237的主要功能

8237的DMA傳送有以下四種方式:

1. 單字節(jié)傳送方式

2. 數(shù)據(jù)塊傳送方式

3. 請求傳送方式

4. 級連方式

有一個結(jié)束處理的輸入信號EOP,允許外界用此輸入端結(jié)束DMA傳送或重新初始化。

8237可以級連,任意擴展通道數(shù)。

8237的系統(tǒng)結(jié)構(gòu)圖如圖所示

圖中的通道部分只畫出了一個通道的情況(其實每個通道都有一個一個基地址寄存器(16位)、基字節(jié)數(shù)計數(shù)器(16位)、現(xiàn)行地址寄存器(16位)和現(xiàn)行字節(jié)計數(shù)器(16位),每一個通道都有一個6位的模式寄存器以控制不同的工作模式)。

8237的內(nèi)部寄存器類型和數(shù)量如表所示。

8237的結(jié)構(gòu)中包含了三個基本的控制邏輯塊:

1. 時序控制邏輯塊;(根據(jù)編程規(guī)定的DMAC的工作模式,產(chǎn)生包括DMA請求、DMA傳送以及DMA結(jié)束所需要的內(nèi)部時序和外部信號)

2. 程序命令控制塊;(對在DMA請求服務(wù)之前,CPU編程時給定的命令字和模式控制字進行譯碼,以確定DMA服務(wù)類型)

3. 優(yōu)先權(quán)編碼邏輯。(對同時有請求的通道進行優(yōu)先編碼,確定哪個通道的優(yōu)先權(quán)最高。在8237中通道的優(yōu)先權(quán)可能是固定的,也可以是旋轉(zhuǎn)的)

另外,緩沖器、8237的數(shù)據(jù)引線、地址引線都有三態(tài)緩沖器,因而可以接管也可以釋放總線。

5.3 DMA控制器8237

8237在設(shè)計時規(guī)定它有兩種主要的工作周期,即空閑周期和有效周期,每一個周期又是由若干個時鐘周期所組成的。

1. 空閑周期(IDLE CYCLE)

? 當8237的任一通道都無請求時,就進入空閑周期,在空閑周期8237始終執(zhí)行SI狀態(tài),在每一個時鐘周期都采樣通道的請求輸入線DREQ。只要無請求就始終停留在SI狀態(tài)。

? 在SI狀態(tài)可由CPU對8237編程,或從8237讀取狀態(tài)(8237在SI狀態(tài)也始終采樣選片信號#CS,只要#CS信號變?yōu)橛行В瑒t為CPU要對8237進行讀/寫操作。當8237采樣到#CS為低(有效)而HRQ也為低(無效),則進入程序狀態(tài)CPU就可以寫入8237的內(nèi)部寄存器,實現(xiàn)對8237的編程或改變工作狀態(tài)。在這種情況下,由控制信號#IOR和#IOW,地址信號A3-A0來選擇8237的內(nèi)部的不同寄存器)。 由于8237內(nèi)部的地址寄存器和字節(jié)數(shù)計數(shù)器都是16位的,而數(shù)據(jù)線是8位的,所以,在8237的內(nèi)部有一個觸發(fā)器,稱為高/低觸發(fā)器,由它來控制寫入 16位寄存器的高8位還是低8位。8237還具有一些軟件命令,這些命令是通過對地址(A3-A0)和#IOW,#CS信號的譯碼決定的,不使用數(shù)據(jù)總 線。

2. 有效周期(Active Cycle)

? 當8237在SI狀態(tài)采樣到外設(shè)有請求時,就脫離SI而進入S0狀態(tài)。當接收到HLDA,就使8237進入工作狀態(tài),開始DMA傳送。工作狀態(tài)由S1、S2、S3、S4組成,以完成數(shù)據(jù)傳達,若外設(shè)的數(shù)據(jù)傳送速度較慢,不能在S4之前完成,則可由Ready線在S2或S3與S4之間插入SW狀態(tài)。

? 在存儲器與存儲器之間的傳達,需要完成從存儲器讀和存儲器寫的操作,所以每一次傳達需要8個時鐘周期,在前四個周期S11、S12、S13、S14完成從存儲器讀,另外四個周期S21、S22、S23、S24完成存儲器寫。

5.3 DMA控制器8237

8237在DMA傳送時有四種工作方式。

1. 單字節(jié)傳送方式

這種方式一次只傳送一個字節(jié)。數(shù)據(jù)傳送后字節(jié)計數(shù)器減量,地址要相應(yīng)修改(增量或減量取決于編程)。HRO變?yōu)闊o效,釋放系統(tǒng)總線。若傳送使字節(jié)數(shù)減為0,TC發(fā)生或者終結(jié)DMA傳送,或重新初始化。

2.多字節(jié)傳送方式

在這種傳送方式下,8237由DREQ啟動后就連續(xù)地傳送數(shù)據(jù),直至字節(jié)數(shù)計數(shù)器減到零產(chǎn)生TC(Terminal Count),或者由外部輸入有效的EOP信號來終結(jié)DMA傳送。

3.請求傳送方式

在這種工作方式下,8237可以進行連續(xù)的數(shù)據(jù)傳送。當出現(xiàn)以下三種情況之一時停止傳送。

? 1) 字節(jié)數(shù)計數(shù)器減到0,發(fā)生TC;

? 2) 由外界送來一個有效的EOP信號;

? 3) 外界的DREQ信號變?yōu)闊o效。

? 當由于第三種情況使傳送停下來時,8237釋放總線,CPU可以繼續(xù)操作。而8237的地址和字節(jié)數(shù)的中間值,可以保持在相應(yīng)通道的現(xiàn)行地址和字節(jié)數(shù)寄存器中。只要外設(shè)準備好了要傳送的新的數(shù)據(jù),由DREQ再次有效就可以使傳送繼續(xù)下去。

4. 級連方式

  這種方式用于通過級連以擴展通道的情況。第二級的HRQ和HLDA信號連到第一級的DREQ和DACK上,如圖所示。

  第二級各個芯片的有限權(quán)等級與所連的通道相對應(yīng)。在這種工作情況下,第一級只起優(yōu)先權(quán)網(wǎng)絡(luò)的作用,除了由某一個二級的請求向CPU輸出HRQ信號外,并不輸出任何其他信號。實際的操作是由第二級的芯片完成。若有需要還可由第二級擴展到第三級等等。

 8237共有9類寄存器,分別是現(xiàn)行地址寄存器、現(xiàn)行字節(jié)數(shù)寄存器、基地址和基字節(jié)數(shù)寄存器、命令寄存器、模式寄存器、請求寄存器、屏蔽寄存器、狀態(tài)寄存器、臨時寄存器。

  1. 現(xiàn)行地址寄存器

   每一個通道有一個16位的現(xiàn)行地址寄存器。在這個寄存器中保存著用于DMA傳送的地址值,在每次傳送后,這個寄存器的值自動增量或減量。這個寄存器的值 可由CPU寫入或讀出(分兩次連續(xù)操作)。若編程為自動初始化,則在每次EOP后,將其初始值(即保持在基地址寄存器中的值)轉(zhuǎn)入寄存器。

  2. 現(xiàn)行字節(jié)數(shù)寄存器

  每個通道有一個16位的現(xiàn)行字節(jié)數(shù)寄存器。它保持著要傳送的字節(jié)數(shù),在每次傳送后此寄存器減量。當這個寄存器的值減為零時,TC將產(chǎn)生。這個寄存器的值在編程狀態(tài)可由CPU讀出和寫入。在自動初始化情況下當EOP產(chǎn)生時,它的值可初始化到其始狀態(tài)。

  3. 基地址和基字節(jié)數(shù)寄存器

  每個通道有一對16位的基地址和基字節(jié)數(shù)寄存器。它們存放著與現(xiàn)行寄存器相聯(lián)系的初始值。在自動初始化情況下。這兩個寄存器中的值,用來恢復(fù)相應(yīng)的現(xiàn)行寄存器中的初始值。在編程狀態(tài),基寄存器與它們相應(yīng)的現(xiàn)行寄存器是同時由CPU寫入的。這些寄存器的內(nèi)容不能讀出。

4. 命令寄存器

  這是一個8位的寄存器,用以控制8237的工作命令字的格式如圖所示。

  D0位用來規(guī)定是否工作在存儲器到存儲器傳送方式。

  D4位用來選擇是固定優(yōu)先權(quán)還是優(yōu)先旋轉(zhuǎn)。8237有兩種優(yōu)先權(quán)方式可供選擇,一種是固定優(yōu)先權(quán),在這種方式下通道的優(yōu)先權(quán)是固定的,通道0的優(yōu)先權(quán)最高,通道3的優(yōu)先權(quán)最低;另一種方式是優(yōu)先權(quán)旋轉(zhuǎn),在這種方式下剛服務(wù)過的通道的優(yōu)先權(quán)變?yōu)樽畹?,其他通道的?yōu)先權(quán)也作相應(yīng)的旋轉(zhuǎn),如下圖所示。

  命令寄存器可由CPU寫入進行編程,復(fù)位信號使其清零。

5. 模式寄存器

? 每個通道有一對8位的模式寄存器以規(guī)定通道的工作模式,如圖所示。

? 在編程時用最低兩位來選擇寫入哪個通道的模式寄存器。

? 最高兩位(D7、D6)規(guī)定了四種工作模式中的某一種,D3、D2兩位規(guī)定是DM讀還是DMA寫或是校驗操作。

? D5位用于規(guī)定地址是增量修改還是減量修改。

? D4位規(guī)定是否允許自動初始化。若工作在自動初始化方式,則每當產(chǎn)生EOP信號時(不論是由內(nèi)部的TC產(chǎn)生或是由外界產(chǎn)生)都是基地址寄存器和基字節(jié)數(shù)寄 存器的內(nèi)容,使相應(yīng)的現(xiàn)行寄存器恢復(fù)初始值。而現(xiàn)行寄存器和基寄存器的內(nèi)容,是由CPU編程時同時寫入的,但在DMA傳送過程中,現(xiàn)行寄存器的內(nèi)容是不斷 修改的,而基寄存器的內(nèi)容則維持不變(除非重新編程)。在自動初始化以后通道就做好了進行另一次DMA傳送的準備。

6. 請求寄存器

8237的每個通道有一條硬件的DREQ請求線,當工作在數(shù)據(jù)塊傳送方式時,也可以由軟件發(fā)出DREQ請求。所以,在8237中有一種請求寄存器,如圖5-10所示。

每個通道的軟件請求可以分別設(shè)置。軟件請求是非屏蔽的,它們的優(yōu)先權(quán)同樣受優(yōu)先權(quán)邏輯的控制。

軟件請求位由TC或外部的EOP復(fù)位。Reset信號使整個寄存器清除。

只有在數(shù)據(jù)塊傳送方式,才允許使用軟件請求,若用于儲存器到儲存器傳送,則0通道必須用軟件請求,以啟動傳送過程。

7. 屏蔽寄存器

  每個通道外設(shè)通過DREQ發(fā)出的請求,可以單獨地屏蔽或允許,所以在8237中有一個屏蔽寄存器,如圖所示。

  在Reset信號作用后,四個通道全置于屏蔽狀態(tài),所以,必須在編程時,根據(jù)需要復(fù)位屏蔽位。當某一個通道進行DMA傳送后,產(chǎn)生EOP信號,如果不是工作在自動初始化方式,則這一通道的屏蔽位置位,必須再次編程為允許,才能進行下一次的DMA傳送。

  也可以用如圖(b)所示的格式,在一個命令字中對4個通道的屏蔽情況進行編程。

8. 狀態(tài)寄存器

  8237中有一個可由CPU讀取的狀態(tài)寄存器,如圖所示。

  狀態(tài)寄存器中的低4位,反映了在讀命令這個瞬間,每個通道的字節(jié)數(shù)是否已減到零。高4位反映每個通道的請求情況。

9. 臨時寄存器

?   在存儲器到存儲器的傳送方式下,臨時寄存器保存從源單元讀出的數(shù)據(jù),又由它寫入至目的單元。在傳送完成時,它保留傳送的最后一個字節(jié),此字節(jié)可由CPU讀出。Ready信號使其復(fù)位。

  如上所術(shù),8237內(nèi)部存寄存器可以分成兩大類,一類是通道寄存器,即每個通道都有的現(xiàn)行地址寄存器,現(xiàn)行字節(jié)數(shù)寄存器和基地址及基字節(jié)數(shù)寄存器;另一類是控制和狀態(tài)寄存器。這些寄存器是由最低4位地址A3-A0以及讀寫命令來區(qū)分的。

1. 軟件命令

  8237在編程狀態(tài)還有兩種軟件命令,軟件命令不需要通過數(shù)據(jù)總線寫入控制字,而由8237直接對地址和控制信號進行譯碼。命令的格式如下表所示。

  1) 清除高/低觸發(fā)器

  2) 主清除命令

信號

A3  A2  A1 A0 #IOR #IOW

操作

1  0  0  0  0   1

讀狀態(tài)寄存器

1  0  0  0  1   0

寫命令寄存器

1  0  0  1  0   1

非法

1  0  0  1  1   0

寫請求寄存器

1  0  1  0  0   1

非法

1  0  1  0  1   0

寫單屏蔽寄存器位

1  0  1  1  0   1

非法

1  0  1  1  1   0

寫模式寄存器

1  1  0  0  0   1

非法

1  1  0  0  1   0

清高/低觸發(fā)器命令

1  1  0  1  0   1

讀臨時寄存器

1  1  0  1  1   0

主清除命令

1  1  1  0  0   1

非法

1  1  1  0  1   0

非法

1  1  1  1  0   1

非法

1  1  1  1  1   0

寫所有屏蔽位

2. 8237的編程步驟

  1) 輸出主清除命令

  2) 寫入基與現(xiàn)行地址寄存器

  3) 寫入基與現(xiàn)行字節(jié)數(shù)寄存器

  4) 寫入模式寄存器

  5) 寫入屏蔽寄存器

  6) 寫入命令寄存器

  7) 寫入請求寄存器。若有軟件請求,就寫入指定通道,可以開始DMA傳送的過程。若無軟件請求,則在完成了(1)--(6)的請求后,由通道的DREQ啟動DMA傳送過程。

3. 編程舉例

  若要利用通道0,由外設(shè)(磁盤)輸入32K字節(jié)的一個數(shù)據(jù)塊,傳送至內(nèi)存8000H開始的區(qū)域(增量傳送),采用塊連續(xù)傳送的方式,傳送完不自動初始化,外設(shè)的DREQ和DACK都為高電平有效。

  要編程首先要確定端口地址。地址的低4位用以區(qū)分8237的內(nèi)部寄存器,高4位地址A7--A4經(jīng)譯碼后,連至選片端#CS,假定選中時高4位為5。

  初始化程序如下:

OUT 5DH, AL ;輸出主清除命令

MOV AL, 00H

OUT 50H, AL ;輸出基和現(xiàn)行地址的低8位

MOV AL, 80H

OUT 50H, AL ;輸出基和現(xiàn)行地址的高8位

MOV AL, 00H

OUT 51H, AL

MOV AL, 80H

OUT 51H, AL ;給基和現(xiàn)行字節(jié)數(shù)賦值

MOV AL, 84H

OUT 5BH, AL ;輸出模式字

MOV AL, 00H

OUT 5AH, AL ;輸出屏蔽字

MOV AL, 0A0H

OUT 58H, AL ;輸出命令字

————————————————

版權(quán)聲明:本文為CSDN博主「JiandaoStudio」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/weixin_41213648/article/details/88204328

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容