DMA既可以指內(nèi)存和外設(shè)直接存取數(shù)據(jù)這種內(nèi)存訪問(wèn)的計(jì)算機(jī)技術(shù),又可以指實(shí)現(xiàn)該技術(shù)的硬件模塊(對(duì)于通用計(jì)算機(jī)PC而言,DMA控制邏輯由CPU和DMA控制接口邏輯芯片共同組成,嵌入式系統(tǒng)的DMA控制器內(nèi)建在處理器芯片內(nèi)部,一般稱為DMA控制器,DMAC)。
值得注意的是,通常只有數(shù)據(jù)流量較大(kBps或者更高)的外設(shè)才需要支持DMA能力,這些應(yīng)用方面典型的例子包括視頻、音頻和網(wǎng)絡(luò)接口。
DMAC可以在兩種模式下運(yùn)行:無(wú)描述符存取模式和描述符存取模式。模式的選取由DCSRx[NODESCFETCH]位決定。同樣在同一時(shí)間內(nèi),不同的通道里可以分別使用這兩種模式。通道在轉(zhuǎn)換運(yùn)行模式之前必須停止數(shù)據(jù)處理。如果出現(xiàn)錯(cuò)誤,則通道停留在停止?fàn)顟B(tài),等待程序處理。
?。?)無(wú)描述符存取模式
在無(wú)描述符存取模式下,DDADRx被保留。程序不可以向DDADRx中寫(xiě)入數(shù)據(jù),并且必須加載DSADRx、DTADRx和DCMDx寄存器。當(dāng)運(yùn)行位被設(shè)置,DMAC立刻運(yùn)行以傳輸數(shù)據(jù)。無(wú)描述符存取在數(shù)據(jù)傳輸?shù)拈_(kāi)始時(shí)被執(zhí)行。
一個(gè)典型的無(wú)描述符存取操作順序如下。
1)復(fù)位后,通道處于未初始化狀態(tài)。
2)設(shè)置DCSR[RUN]位為0,設(shè)置DCSR[NODESCFETCH]位為1。
3)程序?qū)⒃吹刂穼?xiě)入DSADR寄存器,將目標(biāo)地址寫(xiě)入DTADR寄存器,將命令寫(xiě)入DCMD寄存器。
4)向DCSR[RUN]位中寫(xiě)入1,然后無(wú)描述符存取被執(zhí)行。
5)通道等待數(shù)據(jù)傳輸請(qǐng)求。
6)通道傳輸數(shù)據(jù),數(shù)據(jù)量由DCMD[SIZE]和DCMD[LENGTH]較小者決定。
7)在DCMD[LENGTH]被設(shè)置為0之前,通道等待下一次數(shù)據(jù)請(qǐng)求。
8)DDADR[STOP]被設(shè)置為1,通道運(yùn)行終止。
(2) 有描述符存取模式
在有描述符存取模式下,DMAC的寄存器用內(nèi)存中的DMA描述符數(shù)據(jù)填充。多個(gè)DMA描述符可以被鏈成一個(gè)鏈表。這就允許DMA通道在一系列不連續(xù)的地址上進(jìn)行數(shù)據(jù)傳輸。一個(gè)典型的有描述符存取模式的操作步驟如下。
1)復(fù)位后,通道處于未初始化狀態(tài)。
2)程序?qū)⒚枋龇刂罚?6字節(jié)對(duì)齊)寫(xiě)入DDADR寄存器。
3)程序向DCSR[RUN]中寫(xiě)入1。
4)DMAC從DDADR標(biāo)記的地址中讀取4字長(zhǎng)的描述符,其中各字加載情況如下:
· Word [0] -》 DDADRx寄存器;
· Word [1] -》 DSADRx寄存器;
· Word [2] -》 DTADRx寄存器;
· Word [3] -》 DCMDx寄存器。
5)通道等待數(shù)據(jù)傳輸請(qǐng)求。
6)通道傳輸數(shù)據(jù),數(shù)據(jù)量由DCMD[SIZE]和DCMD[LENGTH]較小者決定。
7)在DCMD[LENGTH]被設(shè)置為0之前,通道等待下一次數(shù)據(jù)請(qǐng)求。
8)DDADR[STOP]被設(shè)置為1,通道運(yùn)行終止,否則繼續(xù)運(yùn)行
DMA控制器的基本組成
一個(gè)DMA控制器,實(shí)際上是采用DMA方式的外圍設(shè)備與系統(tǒng)總線之間的接口電路,這個(gè)接口電路是在中斷接口的基礎(chǔ)上再加DMA機(jī)構(gòu)組成。習(xí)慣上將DMA方式的接口電路稱為DMA控制器。
?。?)內(nèi)存地址計(jì)數(shù)器:用于存放內(nèi)存中要交換的數(shù)據(jù)的地址。在 DMA傳送前,須通過(guò)程序?qū)?shù)據(jù)在內(nèi)存中的起始位置(首地址)送到內(nèi)存地址計(jì)數(shù)器。而當(dāng) DMA 傳送時(shí),每交換一次數(shù)據(jù),將地址計(jì)數(shù)器加“1”,從而以增量方式給出內(nèi)存中要交換的一批數(shù)據(jù)的地址。
?。?)字計(jì)數(shù)器:用于記錄傳送數(shù)據(jù)塊的長(zhǎng)度(多少字?jǐn)?shù))。其內(nèi)容也是在數(shù)據(jù)傳送之前由程序預(yù)置,交換的字?jǐn)?shù)通常以補(bǔ)碼形式表示。在DMA傳送時(shí),每傳送一個(gè)字,字計(jì)數(shù)器就加“1”。當(dāng)計(jì)數(shù)器溢出即最高位產(chǎn)生進(jìn)位時(shí),表示這批數(shù)據(jù)傳送完畢,于是引起DMA控制器向CPU發(fā)出中斷信號(hào)。
?。?)數(shù)據(jù)緩沖寄存器:用于暫存每次傳送的數(shù)據(jù)(一個(gè)字)。當(dāng)輸入時(shí),由設(shè)備(如磁盤(pán))送往數(shù)據(jù)緩沖寄存器,再由緩沖寄存器通過(guò)數(shù)據(jù)總線送到內(nèi)存。反之,輸出時(shí),由內(nèi)存通過(guò)數(shù)據(jù)總線送到數(shù)據(jù)緩沖寄存器,然后再送到設(shè)備。
(4)“DMA請(qǐng)求”標(biāo)志:每當(dāng)設(shè)備準(zhǔn)備好一個(gè)數(shù)據(jù)字后給出一個(gè)控制信號(hào),使“DMA
請(qǐng)求”標(biāo)志置“1”。該標(biāo)志置位后向“控制/狀態(tài)”邏輯發(fā)出DMA請(qǐng)求,后者又向CPU發(fā)出總線使用權(quán)的請(qǐng)求(HOLD),CPU響應(yīng)此請(qǐng)求后發(fā)回響應(yīng)信號(hào)HLDA,“控制/狀態(tài)”邏輯接收此信號(hào)后發(fā)出DMA響應(yīng)信號(hào),使“DMA 請(qǐng)求”標(biāo)志復(fù)位,為交換下一個(gè)字做好準(zhǔn)備。
?。?)“控制/狀態(tài)”邏輯:由控制和時(shí)序電路以及狀態(tài)標(biāo)志等組成,用于修改內(nèi)存地址計(jì)數(shù)器和字計(jì)數(shù)器,指定傳送類型(輸入或輸出),并對(duì)“DMA請(qǐng)求”信號(hào)和CPU響應(yīng)信號(hào)進(jìn)行協(xié)調(diào)和同步。
?。?)中斷機(jī)構(gòu):當(dāng)字計(jì)數(shù)器溢出時(shí),意味著一組數(shù)據(jù)交換完畢,由溢出信號(hào)觸發(fā)中斷機(jī)構(gòu),向CPU提出中斷報(bào)告。
評(píng)論