Architektura Komputerów/Wykład 14: Wejście-wyjście

From Studia Informatyczne


Grafika:ASK_M14_S01.png

Grafika:ASK_M14_S02.png

Grafika:ASK_M14_S03.png

Port wejściowy lub wyjściowy jest w modelu programowym widziany tak samo lub podobnie, jak lokacja pamięci. W większości architektur porty są odwzorowane w przestrzeni adresowej pamięci. W niektórych architekturach, np. w x86, porty urządzeń zewnętrznych są dostępne w oddzielnej przestrzeni adresowej, na której operują specjalne instrukcje procesora – tzw. instrukcje wejścia-wyjścia.


Grafika:ASK_M14_S04.png

Rysunek przedstawia schemat – model logiczny pojedynczej komórki pamięci, który nie ma bezpośredniego odwzorowania w sprzętowej realizacji układów pamięci.

Adres wystawiony przez procesor służy do wygenerowania sygnału wyboru konkretnej komórki pamięci.

Zapis danej polega na wytworzeniu na podstawie sygnału wyboru komórki i sygnału zapisu sygnału zapisu do wybranej komórki, który powoduje zapamiętanie bieżącego stanu szyny danych w rejestrze typu D.

Przy odczycie danych sygnał wyboru komórki ziloczynowany z sygnałem żądania odczytu powoduje otwarcie bufora trójstanowego (wzmacniacza), a tym samym podanie stanu zapamiętanego w komórce na szynę danych. Przy nieaktywnym stanie sygnału włączającego bufor jest wyłączony i nie steruje szyny.


Grafika:ASK_M14_S05.png

Aby uzyskać port wejściowy i wyjściowy, wystarczy zrealizować tylko część komórki pamięci, a brakującą część zastąpić wyjściem lub wejściem sygnału zewnętrznego.

Rysunek przedstawia port wyjściowy i wejściowy, uzyskane z „przecięcia” pokazanej wcześniej komórki pamięci. Wyjście elementu pamiętającego steruje diodą świecącą jako urządzeniem wyjściowym. Wejście jest połączone z przyciskiem. Odczyt danej z portu wejściowego zwraca stan wciśnięcia przycisku.


Grafika:ASK_M14_S06.png

Grafika:ASK_M14_S07.png

W praktyce komputer steruje na ogół znacznie bardziej złożonymi urządzeniami zewnętrznymi. Przykładem średnio skomplikowanego urządzenia może być drukarka wyposażona w interfejs Centronics. Drukarka jest połączona z komputerem kablem, przesyłającym 17 sygnałów.


Grafika:ASK_M14_S08.png

Sygnały nStrobe, Busy i Ack służą do synchronizacji transmisji danych po liniach Data.

Sygnały Perror, Select i nFault sygnalizują komputerowi stan drukarki.

Sygnał nInit służy do inicjowania drukarki przez komputer. Sygnały nSelectIn i nAutoFd służą do sterowania trybem pracy drukarki.


Grafika:ASK_M14_S09.png

Diagram ilustruje sekwencję zdarzeń podczas typowej transmisji danych. Przyjęto, że drukarka jest w stanie normalnej pracy (brak błędów) i jedyna interakcja z komputerem dotyczy przesyłania danych do wydrukowania.

Protokół Centronics wymaga ważności danych tylko podczas aktywnego (niskiego) stanu sygnału nStrobe.


Grafika:ASK_M14_S10.png

Sterownik interfejsu Centronics zajmuje trzy jednobajtowe lokacje w przestrzeni adresowej procesora. Poszczególne sygnały z komputera do drukarki są wyprowadzone z poszczególnych bitów rejestru sterowania, a sygnały z drukarki do komputera wchodzą na kolejne bity portu stanu drukarki.


Grafika:ASK_M14_S11.png

W porównaniu ze współpracą procesora z pamięcią transmisja danych do i z urządzeń zewnętrznych jest o tyle bardziej skomplikowana, że nie może zachodzić w dowolnym momencie, lecz jedynie wtedy, kiedy urządzenie jest gotowe do przyjęcia danej lub do udostępnienia danej komputerowi.

Do synchronizacji z urządzeniem służą sygnały synchronizacji transmisji – w przypadku drukarki są to linie Busy, nAck i nStrobe.

Istnieją trzy metody synchronizacji, o zróżnicowanych kosztach implementacji i wydajności.


Grafika:ASK_M14_S12.png

Metoda aktywnego oczekiwania nie wymaga żadnych nakładów sprzętowych. Cała synchronizacja transmisji jest osiągana na drodze programowej, poprzez testowania stanu sygnałów gotowości i ustawianie sygnałów sterujących transmisją danych.

Przedstawiona procedura programowej obsługi drukarki zapewnia transmisję pojedynczych bajtów do drukarki. Porty sterownika drukarki są oznaczone nazwami symbolicznymi (wielkie litery) i traktowane prze kompilator jak zmienne w programie. Szczegółowy sposób ich deklaracji zależy od kompilatora. Należy zauważyć, że na poziomie języka C muszą to być obiekty klasy volatile.


Grafika:ASK_M14_S13.png

Grafika:ASK_M14_S14.png

Obsługa z użyciem przerwań korzysta z mechanizmu sytuacji wyjątkowych – zdarzeń obsługiwanych przez system operacyjny.

Szczegółowa realizacja tego mechanizmu w systemie operacyjnym jest dużo bardziej złożona, niż przedstawia to opisany schemat.


Grafika:ASK_M14_S15.png

Główną zaletą obsługi przy użyciu przerwań jest możliwość zajęcia się przez procesor wykonywaniem innych czynności podczas oczekiwania na gotowość urządzeń, co jest niezbędne w systemach wieloprocesowych.

Jeśli urządzenie transmituje dane szybko, a co za tym idzie – często zgłasza przerwania, może się okazać, że procesor traci dużo czasu na przełączanie kontekstu wynikające z obsługi przerwań oraz na czynności systemowe wynikające ze zmian stanu urządzeń, w tym m.in. zmiany stanu procesów oczekujących na te urządzenia. Obsługa z użyciem przerwań może się w tym przypadku stać bardziej czasochłonna, niż aktywne oczekiwanie.


Grafika:ASK_M14_S16.png

Najbardziej efektywnym i najdroższym sposobem obsługi urządzeń zewnętrznych jest bezpośredni dostęp do pamięci. Wymaga on sprzętowej realizacji specjalnego modułu – sterownika bezpośredniego dostępu do pamięci.


Grafika:ASK_M14_S17.png

Przy korzystaniu z bezpośredniego dostępu do pamięci przerwanie jest zgłaszane do procesora po przetransmitowaniu całego bloku danych. Narzut czasowy na obsługę programową transmisji jest więc bardzo mały.


Grafika:ASK_M14_S18.png

Przy współczesnych implementacjach sterowników urządzeń w postaci układów wielkoscalonych, koszty realizacji sterownika DMA są bardzo niskie. Jest to więc preferowana metoda współpracy z szybkimi urządzeniami zewnętrznymi, stosowana szeroko również w komputerach osobistych.