操作系统:DMA
1、DMA由來
DMA(Direct Memory Access,直接存儲器訪問)。在DMA出現(xiàn)之前,CPU與外設之間的數(shù)據(jù)傳送方式有程序傳送方式、中斷傳送方式。CPU是通過系統(tǒng)總線與其他部件連接并進行數(shù)據(jù)傳輸。
1.1程序傳送方式
程序傳送方式是指直接在程序控制下進行數(shù)據(jù)的輸入/輸出操作。分為無條件傳送方式和查詢(條件傳送方式)兩種。
1.1.1無條件傳送方式
?微機系統(tǒng)中的一些簡單的外設,如開關、繼電器、數(shù)碼管、發(fā)光二極管等,在它們工作時,可以認為輸入設備已隨時準備好向CPU提供數(shù)據(jù),而輸出設備也隨時準備好接收CPU送來的數(shù)據(jù),這樣,在CPU需要同外設交換信息時,就能夠用IN或OUT指令直接對這些外設進行輸入/輸出操作。由于在這種方式下CPU對外設進行輸入/輸出操作時無需考慮外設的狀態(tài),故稱之為無條件傳送方式。
1.1.2查詢(有條件)傳送方式?
查詢傳送也稱為條件傳送,是指在執(zhí)行輸入指令(IN)或輸出指令(OUT)前,要先查詢相應設備的狀態(tài),當輸入設備處于準備好狀態(tài)、輸出設備處于空閑狀態(tài)時,CPU才執(zhí)行輸入/輸出指令與外設交換信息。為此,接口電路中既要有數(shù)據(jù)端口,還要有狀態(tài)端口。
1.2中斷傳送方式
中斷傳送方式是指當外設需要與CPU進行信息交換時,由外設向CPU發(fā)出請求信號,使CPU暫停正在執(zhí)行的程序,轉(zhuǎn)而去執(zhí)行數(shù)據(jù)輸入/輸出操作,待數(shù)據(jù)傳送結(jié)束后,CPU再繼續(xù)執(zhí)行被暫停的程序。
以上兩種方式,均由CPU控制數(shù)據(jù)傳輸,不同的是程序傳送方式由CPU來查詢外設狀態(tài),CPU處于主動地位,而外設處于被動地位。這就是常說的----對外設的輪詢,效率低。而中斷傳送法師則是外設主動向CPU發(fā)生請求,等候CPU處理,在沒有發(fā)出請求時,CPU和外設都可以獨立進行各自的工作。 ?需要進行斷點和現(xiàn)場的保護和恢復,浪費了很多CPU的時間,適合少量數(shù)據(jù)的傳送。
1.3 DMA原理
DMA的出現(xiàn)就是為了解決批量數(shù)據(jù)的輸入/輸出問題。DMA是指外部設備不通過CPU而直接與系統(tǒng)內(nèi)存交換數(shù)據(jù)的接口技術。這樣數(shù)據(jù)的傳送速度就取決于存儲器和外設的工作速度。
通常系統(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傳送是否借宿。
5、發(fā)出DMA結(jié)束信號,使CPU恢復正常工作狀態(tài)。
DMA傳輸將從一個地址空間復制到另外一個地址空間。當CPU初始化這個傳輸動作,傳輸動作本身是由DMA控制器來實行和完成。 ?典型例子---移動一個外部內(nèi)存的區(qū)塊到芯片內(nèi)部更快的內(nèi)存區(qū)。
對于實現(xiàn)DMA傳輸,它是由DMA控制器直接掌管總線(地址總線、數(shù)據(jù)總線和控制總線),因此,存在一個總線控制權(quán)轉(zhuǎn)移問題
DMA傳輸開始前: CPU------>DMA控制器
DMA傳輸結(jié)束后: ?????????????DMA控制器------>CPU
一個完整的DMA傳輸過程必須經(jīng)歷DMA請求、DMA響應、DMA傳輸、DMA結(jié)束4個步驟。
DMA方式是一種完全由硬件進行組信息傳送的控制方式,具有中斷方式的優(yōu)點,即在數(shù)據(jù)準備階段,CPU與外設并行工作。
?
2、DMA的傳送過程
DMA的數(shù)據(jù)傳送分為預處理、數(shù)據(jù)傳送和后處理3個階段。
(1)預處理
由CPU完成一些必要的準備工作。首先,CPU執(zhí)行幾條I/O指令,用以測試I/O設備狀態(tài),向DMA控制器的有關寄存器置初值,設置傳送方向、啟動該設備等。然后,CPU繼續(xù)執(zhí)行原來的程序,直到I/O設備準備好發(fā)送的數(shù)據(jù)(輸入情況)或接受的數(shù)據(jù)(輸出情況)時,I/O設備向DMA控制器發(fā)送DMA請求,再由DMA控制器向CPU發(fā)送總線請求(統(tǒng)稱為DMA請求),用以傳輸數(shù)據(jù)。
(2)數(shù)據(jù)傳送
DMA的數(shù)據(jù)傳輸可以以單字節(jié)(或字)為基本單位,對于以數(shù)據(jù)塊為單位的傳送(如銀盤),DMA占用總線后的數(shù)據(jù)輸入和輸出操作都是通過循環(huán)來實現(xiàn)。需要特別之處的是,這一循環(huán)也是由DMA控制器(而不是通過CPU執(zhí)行程序)實現(xiàn)的,即數(shù)據(jù)傳送階段是完全由DMA(硬件)來控制的。
(3)后處理
DMA控制器向CPU發(fā)送中斷請求,CPU執(zhí)行中斷服務程序做DMA結(jié)束處理,包括檢驗送入主存的數(shù)據(jù)是否正確,測試傳送過程中是否出錯(錯誤則轉(zhuǎn)入診斷程序)和決定是否繼續(xù)使用DMA傳送其他數(shù)據(jù)塊等。
3、在STM32F407中使用DMA
3.1使用大約步驟
1、使能DMA時鐘,并等待數(shù)據(jù)流可配置。 使能DMA時鐘,才可配置DMA相關的寄存器。要對DMA的配置寄存器DMA_SxCR進行配置,則要等其最低位為0----即DMA傳輸禁止,才可配置。
2、DMA_SxCR(指定的外設--x)設置該流x,包括配置通道,外設地址,存儲器地址,傳輸數(shù)據(jù)量、優(yōu)先級等。
3、使能外設的DMA功能
4、使能DMA數(shù)據(jù)流,啟動傳輸。
5、查詢DMA傳輸狀態(tài)。
3.2 從DMA配置時最為關鍵的寄存器出發(fā)
DMA數(shù)據(jù)流x配置寄存器(DMA_SxCR)
?
CHSEL[2:0] ?3位8個通道選擇,即對于流x選擇哪個通道
PL[1:0] 2位,設置流x的軟件優(yōu)先級,DMA控制器的仲裁器根據(jù)軟件優(yōu)先級,輔以硬件優(yōu)先級來仲裁進行哪個數(shù)據(jù)流哪個通道的數(shù)據(jù)傳輸。
MSIZE[1:0] 2位,存儲器的數(shù)據(jù)寬度(8位、16位、32位)
PSIZE[1:0] 2位,外設的數(shù)據(jù)寬度
MINC ?1位, 設置存儲器遞增模式,存儲器地址指針時遞增還是固定
PINC ??1位, 設置外設遞增模式,外設地址指針遞增還是固定
DIR ?????2位,數(shù)據(jù)傳輸方向
TCIE ??1位,傳輸完成中斷使能
HTIE ??1位,半傳輸中斷使能
TEIE ??1位,傳輸錯誤中斷使能
DMEIE 1位, 直接模式錯誤中斷使能
EN ????1位, 0禁止該數(shù)據(jù)流,此時可配置該數(shù)據(jù)流
?????????????????????1使能該數(shù)據(jù),參與仲裁器的競爭
?
總結(jié)
- 上一篇: Linux:Swap分区
- 下一篇: Windows下配置NodeJS环境详解