Ú-8  Styk mikropočítača s prostredím

 
 

µ
 Priamy prístup do pamäte - DMA
   qRozhranie DMA s kontrolérom DMAC typu 8237A
   qProgramovanie  DMAC typu 8237A
   ÜDemonštračný príklad



µ Priamy prístup do pamäte - DMA

Teoreticky (nie vždy v PC ) pomocou priameho prístupu do pamäte (DMA - Direct Memory Access - prenos, ktorého organizáciu riadi iné zariadenie ako mikroprocesor, napríklad kontroler DMAC), možno realizovať vysokorýchlostný prenos dát. Nevýhodou takéhoto prenosu je nemožnosť predspracovania prenášaných dát. Nutnosť obnovovania obsahu dynamických pamätí v PC neumožňuje plne využívať súvislý prenos (dávkový a blokový) ale len pomalší prenos DMA v jednom cykle s následným pozastavením PC po 1 cykle.



1 Rozhranie DMA s kontrolérom DMAC typu 8237A

DMA prenos je špecialny typ prenosu, bez účasti mikroprocesora (výstupy mikroprocesora ako aj ďalšie buffere na zbernici sú signálom BUSEN, generovaným mikroprocesorom, počas prenosu uvedené do tzv. tretieho stavu a sú nevodivé), kde kontrolér DMA (DMAC - často typ 8237A) preberá kontrolu nad riadením zberníc.

Kontrolér DMAC má 2 základné módy činnosti:

  • čakací (idle), počas ktorého možno DMAC z CPU naprogramovať;
  • aktívny, v ktorom sa po výskyte žiadosti o DMA postupne vykoná prenos dát.
Jedným z najbežnejšie používaných prenosom DMA je  sériový prenos na pružný disk FD.



2 Programovanie DMAC typu 8237

 

q Inicializácia DMAC

Každý kanál kontroléra 8237 má:
  • 16 bitový register aktuálnej adresy CAR (current address register) a
  • 16 bitový register aktuálneho slova CWR (current word register).
Register aktuálnej adresy CAR obsahuje aktuálnu adresu pre nasledujúci DMA prenos. Register aktálneho slova CWR pracuje ako dekrementujúce 16 bitové počítadlo a je naprogramované na prenos celkového počtu bajtov minus jedna. (Ukončenie prenosu nastane pri prechode z 0000H na FFFFH.)

Každý z týchto registrov je ešte podporovaný:

  • bázovým  registrom adresy BAR (base address register) a
  • bázovým registrom slova BWR (base address register),
do ktorých sa pri inicializácii naprogramujú počiatočné hodnoty pre prenos DMA.

Do registrov CAR a CWR s aktuálnym obsahom nie je možné zapisovať ale sa dajú len čítať. Na zápis 16 bitového slova do registrov sa používa vnútorný preklápací obvod F/L, vďaka ktorému je prvý zápis prvého bajtu do BAR interpretovaný ako dolný  bajt LSB adresy a nasledujúci zápis na rovnakú adresu ako horný bajt MSB adresy. Podobný spôsob sa používa pri  registri s počtom slov BWR.


Demo príklad1:

V PC so štandardne zabudovaným DMAC  sa nemôže používať prenos z pamäte do pamäte, nakoľko ten vyžaduje súčastné použitie DMA kanálu 0 a DMA kanálu 1, ktoré sú štandardne vyhradené pre iné účely. (Pri prenose typu pamäť - pamäť sa prenos realizuje cez kanál 0 DMA a druhá pamäťová adresa sa nahráva do registra 1 kanálu, ktorý je obsadený obnovovaním dynamickej pamäti).  (V  štandardnom DMAC pre PC je pre DMA kanál 0 namiesto portu 07F0H port 0, ako BAR, namiesto portu 07F1H port 1, ako BWR. Preto je v príklade aj príklade Bfig. 8.21, ktorý používa štandardný DMA kanál 2 pre adresovanie BAR použitý port 04H a pre BWR použitý port 05H.) Demonštračný príklad predpokladá nejaký ďalší DMAC s adresami registrov:
 

      Port 07F0H     -   aktuálna a bázová adresa pre DMA kanál 0
      Port 07F1H    -   aktuálny a bázový počet slov pre DMA kanál 0 
      Port 07F2H    -   aktuálna a bázová adresa pre DMA kanál 1
      Port 07F3H    -   aktuálny a bázový počet slov pre DMA kanál 1

Cieľom príkladu je nainicializovať tieto kanály na prenos 100D=64H bajtov z adresy 1000H na adresu F000H. Za povšimnutie v inicializačnom zápise stojí, že zadávanie adries môže byť pomiešané, avšak prvý zápis adresy alebo počtu slov je vždy interpretovaný ako LSB a druhý zápis zápis ako MSB. Pre typ prenosu z pamäte do pamäte stačí len raz zadať počet prenášaných slov.

Inicializačná postupnosť inštrukcii pre danú úlohu:
 

 Demo: mov dx,
07F0H   adresa portu 07F0H
  mov al,
0   LSB zdrojovej a cieľovej adresy 
  out dx,
al   kanála 0
  inc dx

 
  inc dx

  adresa portu 07F2H
  out dx,
al   kanála 1
  dcr dx

 
  dcr dx

  adresa portu 07F0H
  mov al,
10H   MSB zdrojovej adresy
  out dx,
al   kanála 0

inc dx




inc dx


adresa portu 07F2H

mov al,
F0H
MSB cieľovej adresy
  out dx,
al   kanála 1
  mov dx,
07F3H   adresa portu 07F3H

mov al,
63H
LSB počtu slov -1
  out dx,
al   kanál 1
  mov al,
0   MSB počtu slov1
  out dx,
al   kanál 1


q Nastavenie spôsobu prenosu DMA

V obvode 8237A existujú 4 možné nastavenia spôsobu prenosu - módy, ktoré treba tiež programovo zadefinovať:

  • Jednoslovný prenos (Single transfer) - Po prenose jednotlivého bajtu je počítadlo slov dekremntované a obsah registra aktuálnej adresy sa inkrementuje alebo dekremnetuje tak ako je predprogramované.
  • Súvisle blokový prenos (Block transfer) - Súvislý prenos bloku dát sa uskutočňí do okamihu výskytu signálu TC (Terminal count) alebo EOP (End of process).
  • Dávkový (niekoľko slovný blokový prenos) na požiadanie (Demand transfer) - dáta sa prenášajú len počas aktívneho stavu signálu  požiadavky DREQ. Keď prestane byť signál DREQ aktívny nebude sa meniť aktálna adresa a počet slov až do obnovenia aktívneho stavu požiadavky DREQ. V konečnom dôsledku sa prenos uzavrie až po výskyte signálu TC (Terminal count) alebo EOP(End of process).

Na naprogramovanie vhodného módu prenosu slúžia nasledovné 4 registre. Do každého z týchto registrov možno len zapisovať dáta:

  • Riadiaci register (Command register) - určuje spôsob činnosti (úroveň DACK, DREQ a spôsobob priority) obvodu 8237A (obr. 8.1a). Pomocou linky D2 možno činnosť DMAC zablokovať.
  • Register režimu kanálu (Mode register) - umožňuje (obr. 8.1d) špecifikovať spôsob prenosu (čítanie, zápis alebo overovanie - pri overovaní sa generuje len adresa bez doprovodných riadiacich signálov) operácie.
  • Register zápisu žiadosti (Request register) - umožňuje (obr. 8.1b) softwareovo vyvolať žiadosť DMA, teda nielen pomocou signálu DREQ. Táto SW požiadavka nie je maskovateľná.
  • Maskovací register (Mask register) - sa používa (obr. 8.1c alebo celkove pre zapis celkovej masky pomocou 1 príkazu - 8.1e) na zamaskovanie individuálnej žiadosti DREQ z kanálov. Zamaskované bity môžu byť vymazané individuálne alebo naraz kolektívne.
Ďalší z registrov - stavový register (Status register na obr. 8.2), ktorý možno len čítať, umožňuje zistiť, ktorý z kanálov požaduje o DMA a ktorý z kanálov  dosiahol TC.

Celkom na inicializáciu, ako aj na zisťovanie aktuálneho stavu prenosu je v DMAC 8237A k dispozícii 16 adries portov (pomocou 3 adresných bitov  na zbernicových vodičoch A0 - A3 obvodu možno vytvoriť maximálne 8 adries portov a rozšírenie na ďalšich 8 adries sa realizuje pomocou špecialneho preklápacieho obvodu F/L. Pozri v príklade demopríklad1 port0 pre bázovú adresu DMA kanálu 0, port1 pre počítadlo počtu bajtov prenesených cez DMA kanálu 0, v príklade Bfig. 8.21 obdobne port4 pre bázovú adresu DMA kanálu 2, port5 pre počítadlo počtu bajtov prenesených cez DMA kanálu 2 apod.) Tri z týchto portov (na adresách 0CH, 0DH a 0EH) nie sú plnohodnotné registre slúžia len ako prístup pre impulz, generovaný na základe inštrukcie OUT, ktorý slúži na nulovanie alebo prednastavenie vnútorných preklápacích obvodov (F/L), pomocou ktorých sa špecifikuje  16 bitový zápis - najprv LSB a potom MSB po preklopení F/L  (Clear first/last flip flop) alebo nastavujú, resp nulujú bity maskovacich registrov.



Prehľad formátov registrov DMAC 8237A a ich adries v PC

Obr. 8.1a Riadiaci register, štandardne v PC na adrese 08H/0D0H
  bit  Význam (možno len zapisovať dáta)
    7  D7=0 DACK je aktívny na úrovni L resp. D7=1 je aktívny na úrovni H 
    6  D6=0 DREQ je aktívny na úrovni L resp. D6=1 je aktívny na úrovni H 
    5  D5=x
    4  D4=0 pevná priorita resp.D4=1 rotácia priorít
    3  D3=x
    2  D2=0 povolenie činnosti kontroléra DMA 
    1  D1=x
    0  D0=0 DREQ je aktívny na úrovni L resp. D6=1 je aktívny na úrovni H 






Obr. 8.1b Register zápisu žiadostí, štandardne v PC na adrese 09H/0D1H
  bit  Význam (možno len zapisovať dáta) 
    7  D7=x 
    6  D6=x 
    5  D5=x
    4  D4=x 
    3  D3=x
    2  D2=0 nulovanie bitu žiadosti  resp. D2=1 nastavenie bitu žiadosti 
    1  D1 Výber kanálu binárne
    0  D0 Výber kanálu binárne






Obr. 8.1c Maskovací register, štandardne v PC na adrese 0AH/0D2H
  bit  Význam (možno len zapisovať dáta) 
    7  D7=x
    6  D6=x
    5  D5=x
    4  D4=x
    3  D3=x
    2  D2=0 nulovanie bitu masky resp. D2=1 nastavenie bitu masky
    1  D1 Výber kanálu binárne
    0  D0 Výber kanálu binárne



Obr. 8.1d Register režimu kanálu, štandardne v PC na adrese 0BH/0D3H
  bit  Význam (možno len zapisovať dáta) 
    7  D7=0 pre jednoslový prenos - single mode
    6  D6=1 pre jednoslový prenos - single mode
    5  D5=0 inkrementácia adresy  D5=1dekrementácia adresy 
    4  D4=0 autoinicializácia nepovolená  D4=1 autoinicializácia povolená 
    3  D3,D2 =00 overovanie D3,D2 =01 zápis
    2  D3,D2 =10 čítanie D3,D2 =11 nepovolená kombinácia 
    1  D1 Výber kanálu binárne
    0  D0 Výber kanálu binárne



Obr. 8.1e Register úplnej masky, štandardne v PC na adrese 0FH/0D7H
  bit  Význam (možno len zapisovať dáta)
    7  D7=x
    6  D6=x
    5  D5=x
    4  D4=x
    3  D3=0 nulovanie masky kanálu 3 D0=1 nastavenie masky kanálu 3
    2  D2=0 nulovanie masky kanálu 2 D0=1 nastavenie masky kanálu 2
    1  D1=0 nulovanie masky kanálu 1 D0=1 nastavenie masky kanálu 1
    0  D0=0 nulovanie masky kanálu 0 D0=1 nastavenie masky kanálu 0 






Obr. 8.2 Formát slova stavového registera, štandardne v PC na adrese 08H/0D0H
  bit  Význam (možno len čítať dáta) 
    7  D7=1 Žiadosť z kanálu 3  
    6  D6=1 Žiadosť z kanálu 2
    5  D5=1 Žiadosť z kanálu 1
    4  D4=1 Žiadosť z kanálu 0
    3  D3= 1Kanál 3 dosiahol hodnoty TC
    2  D2=1 Kanál 2 dosiahol hodnoty TC
    1  D1=1 Kanál 1 dosiahol hodnoty TC
    0  D0=1 Kanál 0 dosiahol hodnoty TC





Bfig. 8.21.asm - Demonštračný program pre čítanie z diskety PC XT, ktoré sa realizuje cez kanál DMA-2.

Pred vykonaním konkrétneho prenosu cez niektorý z kanálov DMAC treba nastaviť:

  • Typ, smer prenosu a číslo kanálu DMA do 8 bitového registra režimu kanálu (mode register).
  • Adresu (v príklade pomenovaná buffer, do ktorého sa uloží 512 bajtov z diskety) do registera začiatočnej adresy pamäte.  Pretože v PC je adresa najmenej 20 bitov, používa sa na doplnenie adresy z 16 bitov (adresy predstavujúce 16 bit bunky sa nahrávajú na dva krát po 8 bitových slovách) na potrebných 20 bitov, resp. 32 bitov ešte ďalší tzv. register stránky (na obrázku 84 označený ako 74LS373). Adresa sa teda ukladá po častiach pomocou špecialneho synchronizačného signálu ADSTB (Address strobe).
  • Register dĺžky prenosu (počet bajtov -1).
Inicializácia DMAC sa uskutočňuje zápisom niekoľkých riadiacich slov do vnútorných registrov DMAC, ktoré sú adresované pomocu adries na zbernicových vodičoch A0 - A3, resp aj s pomocou preklápacieho obvodu F/L nasledovne:
 

   krok  činosť
     1  Nastaví sa  pomocou zápisu kódu 46H jednoslovný režim umožňujúci čítanie cez 2 kanál DMA, cez ktorý sa v PC XT realizuje prístup k pružnému disku FD. 

   2  Kód sa zapíše do registra režimu kanála DMA na adrese 0BH (obr.8.1d.)

   3  Vynuluje sa vnútorný preklápací obvod F/L na základe impulzu, ktorý je generovaný po inštrukcii out, nakoľko prenos bude uskutočňovaný po bajtoch.

   4  Vytvorenie 20 bitovej adresy segmentu:

   5 
  • najprv sa vysunu 4MSb zo segmentu a uložia sa do registra CL
  • potom sa k posunutému (vynásobenému 16) segmentu pripočíta offset bufera.

   6  V prípade, ak pri spočítaní dôjde k prenosu CY koriguje sa aj MSb v registri CH.

   7  Realizácia zápisu 20 bitovej adresy po častiach:

   8 
  • Najprv LSB adresy z registra AL do portu 04H;
  • potom MSB adresy pôvodne z registra AH do portu 04H.

   9  Na koniec najvyššie bity adresy A17 - A20 do registra stránky na adrese 081H.

  10  Nastavenie počitadla prenášaných bajtov n-1= 511 do portu 05H.

  11  Povolenie činnosti DMAC na základe aktivizovania bitu D2 v riadiacom registri (obr.8.1a.)




 

Vlastný program Bfig. 8.21.asm:
 



page ,132

TITLE 
 Fig.8.21 - DMA Setup

stackseg 
para stack


db 64 dup("stack")

stackseg 
 ends





DMA 
equ 0  ;zac I/O adresa portov DMA obvodu 





code 
segment


assume cs:code ss:stackseg

DMA_set 
proc far


push ds  ;Uschova navrat do DOS


sub ax ,ax


push ax




 1
mov al, 46h ;Pre čítanie cez kanal 2
 2
out DMA+11, al ; nast modu DMA do 0BH
 3
out DMA+12, al ;Nast 1/ posled F/F- len imp
 4
mov ax, cs ;Zadat akt segm adresu
 5
mov cl, 4 ;rot=*16


rol ax, cl ;4 msb ulozit do ch


mov ch, al


and al, 0f0h ;Vynulovat 4 LSB
 6
add ax, offset buffer ;+posun adr. bufera


jnc no_high_incr ;Ak CY=1 tak musiabyt 4 MSB


inc ch ;incrementovane

no_high_incr:
;Vystup LSbajtu adresy
 7
out DMA+4, al ;kanal 2 používa port 04H a


mov al, ah ;a port 05H --> demo príklad 1
 8
out DMA+4, al ;Vystup MSbajtu adresy


mov al, ch
 9
out 081h, al ;Vystup na page register



Page reg DMA na adr 80-83
10
mov ax, 511  ;pocitadlo pre 1 sektor


out DMA+5, al ;LSbajt do pocitadla


mov al, ah


out DMA+5, al ;MSbajt do pocitadla
11
mov al, 2 ;Povel pre Enable D2 


out DMA+10, al ;mask reg. kanalu DMA


ret

DMA_set 
 endp

buffer 
db 512 dup(?)  ;Buffer pre citanie z diskety

code 
ends


end



 



[Návrat]
 

 

>