FIFO and DMA
FIFO
? SPI端口增加了FIFO,使得傳輸數據有了緩沖區間。
? ?FIFO存儲器是一個先入先出的雙口緩沖器,即第一個進入其內的數據第一個被移出,其中一個存儲器的輸入口,另一個口是存儲器的輸出口。主要有三個方面的作用:1)對連續的數據流進行緩存,防止在進機和存儲操作時丟失數據;2)數據集中起來進行進機和存儲,可避免頻繁的總線操作,減輕CPU的負擔;3)允許系統進行DMA操作,提高數據的傳輸速度。這是至關重要的一點,如果不采用DMA操作,數據傳輸將達不到傳輸要求,而且大大增加CPU的負擔,無法同時完成數據的存儲工作。更詳細的介紹參考FIFO的定義與作用
?
DMA
??????DMA的英文拼寫是“Direct Memory Access”,漢語的意思就是直接內存訪問,是一種不經過CPU而直接從內存存取數據的數據交換模式。PIO模式下硬盤和內存之間的數據傳輸是由CPU來控制的;而在DMA模式下,CPU只須向DMA控制器下達指令,讓DMA控制器來處理數的傳送,數據傳送完畢再把信息反饋給CPU,這樣就很大程度上減輕了CPU資源占有率。
????? DMA 傳送方式的優先級高于程序中斷,兩者的區別主要表現在對CPU的干擾程度不同。中斷請求不但使CPU停下來,而且要CPU執行中斷服務程序為中斷請求服務,這個請求包括了對斷點和現場的處理以及CPU與外設的傳送,所以CPU付出了很多的代價;DMA請求僅僅使CPU暫停一下,不需要對斷點和現場的處理,并且是由DMA控制外設與主存之間的數據傳送,無需CPU的干預,DMA只是借用了一點CPU的時間而已。還有一個區別就是,CPU對這兩個請求的響應時間不同,對中斷請求一般都在執行完一條指令的時鐘周期末尾響應,而對DMA的請求,由于考慮它的高效性,CPU在每條指令執行的各個階段之中都可以讓給DMA使用,是立即響應。
?
?
緩存一致性問題
?
DMA 會導致緩存一致性問題。想像 中央處理器 帶有緩存與外部存儲器的情況,DMA 的運作則是去訪問外部存儲器,當中央處理器訪問外部存儲器某個地址的時候,暫時先將新的值寫入緩存中,但并未將外部存儲器的數據更新,若在緩存中的數據尚未更新到外部存儲器前發生了 DMA,則 DMA 過程將會讀取到未更新的數據。
相同的,如果外部設備寫入新的值到外部存儲器內,則 中央處理器 若訪問緩存時則會訪問到尚未更新的數據。
這些問題可以用兩種方法來解決:
第二種的方法會造成 DMA 的系統負擔。
?
?
說明:1)這里的device是controller,如spi ?controller,對應的slave 接在device上
? ??2)一般device與DMA之間還有FIFO
?
?一個 DMA 傳輸的例子
? ? 這個例子展示了 DMA 傳輸的觸發和執行。在這個例子里,軟盤控制器 (FDC) 從軟盤讀入了一個字節,然后需要 DMA 把這個字節放到內存的 0x00123456 處。整 個過程由 FDC 對 DMA 控制器發出 DRQ2 (對第二個通道發出 DRQ 信號)信號開始。.1.1 一個 DMA 傳輸的例子
? DMA 控制器會注意到接收到了一個 DRQ2信號。然后控制器會確定第二個 DMA 通道已經被編程而且被標記為 unmasked (開啟)。然后控制器也會確定其他的通道是活動的而且有更高的優先權。一旦這些工作完成,DMA 就要求 CPU 把總線放開,以便自己可以使用。DMA 通過總線發出 HRQ 信號直達 CPU。
? ?依靠處理器,CPU 在空閑的時候就可以執行一些附加的指令。但是最終 CPU 在執行從內部處理器緩存或管道讀取內容的命令的時候, 還是要等待。
既然 DMA “取得了管理權”,那么 DMA 就會激活 -MEMR,-MEMW, -IOR,-IOW 輸出信號,來自 DMA 的地址輸出也會被設定為 0x3456。這個輸出將用來引導將被傳輸的字節到確定的內存地址。
DMA 然后讓需求 DMA 傳輸數據的設備知道傳輸就要開始了。這個開始的信號 就是 -DACK,如果這個設備是軟盤控制器, 那么就使用 -DACK2 信號。
軟盤控制器會負責把要傳輸的字節放到總線數據線上。除非軟盤控制器需要更多的時間從總線上獲取數據(而且,如果外圍設備的確需要更多的時間,這個設備會 使用 READY 信號警告 DMA。),DMA 就會等待一個 DMA 時鐘周期,然后去除掉 -MEMW 和 -IOR 信號以便內存可以關閉和保存總線上的字節,然后軟盤控制器就知道 那個字節已經被傳輸。
因為 DMA 周期一次只傳輸一個字節,軟盤控制器現在就會丟掉 DRQ2 信號, 因此 DMA 就知道這個不再需要了。DMA 也丟掉 -DACK2 信號,以便軟盤控制器知道它必須停止往總線上傳輸數據。
DMA 會檢查任何一個 DMA 通道有沒有動靜。如果任意通道都沒有 DRQ 信號,那 么 DMA 控制器就會第三次發出 -MEMR,-MEMW,-IOR,-IOW 和地址信號。
最后,DMA 會去掉 HRQ 信號。CPU 看見這個信號后,也會去掉 HOLDA 信號。 然后 CPU 激活 -MEMR,-MEMW,-IOR,-IOW 和地址信息,然后再回去執行命令并訪 問內存和外圍設備。
對于一個典型的軟盤區段,上述過程會重復 512 次,每次一個字節。每個字節傳輸的時候,DMA 中的地址寄存器會增加一,顯示還有多少字節要傳輸的數據計數器則會減一。
當這個計數器變為 0 的時候,DMA 會發出 EOP 信號,意味著 DMA 知道計數 器為 0,沒有數據需要傳輸了,并等待再次被 CPU 召喚執行其他任務。這個事件也 叫作 終端計數 (Terminal Count, or TC)。只有一個 EOP 信號,而且,既然每次只 會有一個 DMA 通道是活動的,那么這個活動的通道就只可能是剛剛完成任務的通道。
當緩存的傳輸結束以后,如果一個外圍設備需要發出中斷信號,就可以試驗一 下把 -DACKn 信號和 EOP信號一起發出去。如果有這樣的情況發生,就意味著 DMA 在沒有 CPU 干預的情況下,不會再給那個設備傳送任何的數據了。外圍設備就可以發出中斷信號來取得處理器的注意。在 PC 架構下,DMA 芯片自己是不能發出中斷信號的。只有外圍設備以及相應的硬件才負責發送中斷信號。因此,就有可能有使用 DMA 而不使用中斷的外圍設備。
應該懂得,盡管 CPU 在 DMA 需要的時候,總是把總線釋放給 DMA,這個動作在應用程序和操作系統里面是不可見的,只是當 DMA 是活動的時候,CPU 執行指令的時間會有一點點的差別。因此,處理器會不時的探測外圍設備的狀態,探測 DMA 芯片中的寄存器,或者當 DMA 傳輸結束的時候,從外圍設備接收中斷信號以確定 情況。
總結
以上是生活随笔為你收集整理的FIFO and DMA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UART的FIFO功能
- 下一篇: 杂音 pop 音的解决方法