Ero sivun ”Oikosiirto” versioiden välillä

[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
0 + AWB
Käyttäjän Lab-oratory (keskustelu) muokkaus 5380446 kumottiin
Rivi 1:
'''Oikosiirto''' (engl. ''DMA'' tai ''direct memory access'') tarkoittaa tapaa kopioida muistia tietokoneen sisällä siten että ohjelmiston ei tarvitse suoraa käsitellä kopioitavia muistisanoja. Tyypillisesti oikosiirto käsittelee tapausta jossa halutaan siirtää tietoa muistista oheislaitteelle. Tieto siirtyy muistista oheislaitteelle sana kerrallaan ilman että ohjelmiston täytyy kopioida jokainen sana erikseen.
 
Ennen oikosiirtoa suorittimen täytyi lukea muistia sana kerrallaan [[Rekisteri Rekisteri_(tietokonetekniikka)|rekistereihin]] ja kirjoittaa se I/O porttiin tai erikoisrekisteriin jotta oheislaite saisi halutun tiedon. Tästä aiheutui huomattavia tehokkuusmenetyksiä koska suorittimen täytyi odotella muiden hitaampien tietokoneenosien toimintoja (pääasiassa muistipiirien ja väylien).
 
Oikosiirtoa saatetaan myös käyttää tilanteessa jossa tiedon pitää saapua täsmälleen tiettyyn aikaan eli täsmälleen tietyllä kellojaksolla. Ohjelmistopohjainen ajoitus on tyypillisesti epätarkempaa kuin kellojaksontarkka digitaalitekniikka.
Rivi 8:
===Äänensoittaminen eri siirräntämenetelmillä===
Riippuen arkkitehtuurista tavallainen [[siirräntä]] [[äänikortti|äänikortille]] voidaan tehdä ainakin kolmella eri tavalla: [[suora siirräntä]] (engl. ''Programmed I/O''), [[keskeytysohjattu siirräntä]] (engl. ''interrupt-driven I/O'') tai oikosiirrolla.
Suorassa siirrännässä ääninäytteet kirjoitetaan ohjelmakoodilla äänilaitteen rekisteriin tietyin väliajoin tai kun tietty arvo saadaan luettua rekisteristä. Keskeytysohjatussa siirrännässä saadaan keskeytys kun uusi ääninäyte voidaan kirjoittaa äänilaitteen rekisteriin, mikä helpottaa ja tehostaa ohjelmaa koska ei tarvita erillistä ajastinta tai muuta tarkkaa ajastamista. Oikosiirrännässä ohjelma signaloi äänilaitteelle että se voi hakea tietysti paikasta fyysistä muistia kaikki ääninäytteet. Ohjelmiston ei tarvitse kirjoittaa näytteitä äänilaitteen rekistereihin mikä tavallisesti nopeuttaa järjestelmän toimintaa.
 
Esimerkki suorasta siirrännästä:
1 '''function''' suorasiirräntä
2 '''for''' näytenumero := 0 to (maksimi - 1) '''do'''
3 Kopioi_näyte_rekisteriin(näytemuisti[i])
4 Odota_seuraavaa_ajankohtaa() /* esimerkiksiesim. odota 1 ms */
5 '''done'''
6 Lopeta_ohjelma()
 
Esimerkki keskeytysohjatusta toteutuksesta:
1 '''function''' Pääohjelma
2 näytenumero := 0
3 Alusta_äänikeskeytys()
4 Pakota_ensimmäinen_äänikeskeytys_tapahtuvaksi()
5 Odota valmistumista()
6 Lopeta_ohjelma()
7
8 '''function''' Äänikeskeytys
9 Kopioi_uusi_näyte_äänirekisteriin(näytemuisti[näytenumero])
10 näytenumero := näytenumero + 1
11 '''if''' näytenumero = maksiminäytenumero
12 Herätä_pääohjelma_valmistumisen_merkiksi()
 
Keskeytysohjattu toteutus voi kärsiä muiden keskeytyksien aiheuttamasta häiriöstä tai siitä että keskeytykset ovat poissa päältä liian pitkään. Suora siirräntä on erityisen tehoton verrattuna keskeytysohjattuun siirräntään mikäli seuraavan näytteen odottaminen tehdään silmukoimalla (ilman minkäänlaista keskeytystä).
Rivi 36:
Vaihtoehtoisesti soitto voidaan tehdä oikosiirrolla jolloin jokaista näytettä ei tarvitse erikseen kopioida äänirekisteriin keskeytyskäsittelijässä. Kun kaikki näytteet ovat soitettu antaa äänipiiri keskeytyksen suorittimelle että soittaminen on valmis ja keskeytyskäsittelijä signaloi pääohjelmalle että soittaminen on valmis.
 
1 '''function''' Pääohjelma
2 Oikosiirto_pois_päältä()
3 Kirjoita_ääninäytteiden_osoitin_äänirekisteriin()
4 Alusta_äänikeskeytys()
5 Komenna_oikosiirtolaitetta_aloittamaan_siirto()
6 Odota_valmistumista()
7 Lopeta_ohjelma()
8
9 '''function''' Äänikeskeytys
10 '''if''' soitto_on_valmistunut()
11 Herätä_pääohjelma_valmistumisen_merkiksi()
 
[[Luokka:Tietokonetekniikka]]