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