Ú-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 |
|

|