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