AOA 22.pdf

(330 KB) Pobierz
Microsoft Word - AoA22A.doc
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WYŁĄCZNOŚĆ DO PUBLIKOWANIA TEGO TŁUMACZENIA
POSIADA RAG
HTTP://WWW.R-AG.PRV.PL
„THE ART OF ASSEMBLY LANGUAGE
tłumaczone by KREMIK
Konsultacje naukowe: NEKRO
wankenob@priv5.onet.pl
nekro@pf.pl
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ROZDZIAŁ DWUDZIESTY DRUGI: PORTY SZEREGOWE
Standard komunikacji szeregowej RS-232 jest prawdopodobnie najpopularniejszym schematem
komunikacji szeregowej na świecie. Chociaż cierpi z powodu wielu wad, szybkość jest jedną z nich , jego
zastosowanie jest rozpowszechnione i są dosłownie tysiące urządzeń jakie możemy podłączyć do PC przy
użyciu interfejsu RS-232. PC wspiera do czterech urządzeń kompatybilnych z RS-232 używając COM1:,
COM2:, COM3: i COM4: dla tych, którzy potrzebują więcej urządzeń szeregowych (np. sterowanie
elektronicznej komputerowej tablicy ogłoszeń [BBS], możemy kupić urządzenia, które pozwalają dodać 16 lub
więcej ,portów szeregowych do PC. Ponieważ większość PC ma tylko jeden lub dwa porty szeregowe,
skoncentrujemy się w tym rozdziale jak użyć COM1: i COM2:.
Chociaż, teoretycznie, oryginalnie zaprojektowany PC pozwolił projektantom systemu
zaimplementować porty komunikacji szeregowej używając żądanego sprzętu, wiele z dzisiejszego
oprogramowania wykonuje komunikację szeregową poprzez bezpośredni kontakt z chipem komunikacji
szeregowej 8250 SCC. Wprowadza to takie same komplikacje z kompatybilnością jakie były kiedy
komunikowaliśmy się bezpośrednio ze sprzętem portu równoległego. Jednakże, podczas gdy BIOS dostarcza
doskonałego interfejsu dla portu równoległego, wspierając wszystko co życzylibyśmy sobie zrobić poprzez
bezpośrednie dotarcie do sprzętu, wsparcie szeregowe nie jest dobre. Dlatego też jest powszechną praktyką
omijanie funkcji BIOS 1h i sterowanie chipem 8250 SCC bezpośrednio tak aby program mógł uzyskać dostęp
do każdego bitu każdego rejestru w 8250.
Być może największym problemem z kodem BIOS jest to, że nie wspiera przerwań. Chociaż
oprogramowanie sterujące portami równoległymi rzadko używa układów I/O sterowanych przerwaniami, często
znajduje się oprogramowanie, które dostarcza podprogramów obsługi przerwań dla portów szeregowych.
Ponieważ BIOS nie dostarcza takich podprogramów, oprogramowanie które zechce użyć układów I/O
sterowanych przerwaniami będzie musiało komunikować się bezpośrednio z 8250 i omijać BIOS. Dlatego też
pierwsza część tego rozdziału będzie omawiała chip 8250.
Manipulowanie portem szeregowym nie jest trudne. Jednakże, 8250 SCC zawiera wiele rejestrów i
dostarcza wielu cech. Dlatego też, zabiera wiele kodu sterowanie każdą cechą tego chipu. Na szczęście nie
musimy pisać tego kodu sami. Biblioteka Standardowa UCR dostarcza doskonałego zbioru podprogramów,
które pozwalają sterować 8250. Druga część tego rozdziału będzie przedstawiać kod z Biblioteki Standardowej
jako przykład jak oprogramować każdy rejestr w 8250 SCC.
22.1 CHIP KOMUNIKACJI SZEREGOWEJ 8250
8250 i kompatybilne chipy (jak urządzenia 16450 i 16550) dostarczają dziewięciu rejestrów I/O.
Pewne urządzenia kompatybilne w górę(np. 16450 i 16550) dostarczają również dziesięciu rejestrów. Rejestry te
konsumują osiem portów I/O adresowanych w przestrzeni adresowej PC. Sprzęt i lokacje adresów dla tych
urządzeń jest następująca:
Port
Fizyczny adres bazowy (w hex) Zmienna BIOS zawierająca adres
fizyczny
COM1:
3F8
40:0
COM2:
2F8
40:2
Tablica 81; Adresy portów COM
21856003.009.png
Podobnie jak w portach równoległych PC możemy wymieniać COM1: i COM2: z poziomu programu
poprzez wymianę ich adresów bazowych w zmiennych BIOS 40:0i 40:2. Jednakże, oprogramowanie które
zmierza bezpośrednio do sprzętu, zwłaszcza podprogramy obsługi przerwań dla portów szeregowych, muszą
działać z adresami sprzętowymi, nie adresami logicznymi. Dlatego też zawsze będziemy oznaczać adres
bazowy I/O 3F8h kiedy omawiamy COM1: w tym rozdziale. Podobnie zawsze oznaczamy adres bazowy 2F8h
kiedy omawiamy COM2: w tym rozdziale.
Adres bazowy jest pierwszym z ośmiu lokacji I/O konsumowanych przez 8250 SCC. Dokładne zadanie
tych ośmiu lokacji I/O pojawiają się w poniższej tablicy:
Adresy I/O (w hex)
Opis
3F8/2F8
Rejestr danych odbiór/ przekazanie. Również najmniej
znaczący bajt rejestru zatrzasku dzielenia szybkości
transmisji
3F9/2F9
Rejestr zezwalający na przerwania/ Również bardziej
znaczący bajt rejestru zatrzasku dzielenia szybkości
transmisji
3FA/2FA
Rejestr identyfikacji przerwań (tylko odczyt)
3FB/2FB
Rejestr sterowania łączem
3FC/2FC
Rejestr sterowania modemem
3FD/3FD
Rejestr stanu linii (tylko odczyt)
3FE/2FE
Rejestr stanu modemu (tylko odczyt)
3FF/2FF
Rejestr rzutowania odbioru (tylko odczyt, nie dostępny
na oryginalnym PC)
Tablica 82: Rejestry 8250 SCC
Kolejne sekcje opisują zadania każdego z tych rejestrów
22.1.1 REJESTR DANYCH (REJESTR PRZESŁANIA / ODBIORU)
Rejestr danych jest w rzeczywistości dwoma oddzielnymi rejestrami: rejestr przesłania i rejestr
odbioru. Wybieramy rejestr przesłania poprzez wpisanie adresu I/O 3F8h lub 2F8h, wybieramy rejestr odbioru
poprzez odczyt z tych adresów. Zakładając, że rejestr przesłania jest pusty zapis do rejestru przesłania
zaczynamy transmisję danych poprzez linie szeregową. Zakładając, że rejestr odbioru jest pełny, odczytanie
rejestru odbioru zwraca tą daną. Aby określić czy nadajnik jest pusty lub odbiornik jest pełny, zobacz rejestr
stanu lini. Zauważmy, że rejestr dzielenia szybkości transmisji dzieli ten adres I/O z rejestrami odbioru i
przesłania. Proszę zobaczyć „Dzielenie szybkości transmisji” i „Rejestr sterowania łączem” po więcej informacji
o podwójnym zastosowaniu tych lokacji I/O.
22.1.2 REJESTR ZEZWALAJĄCY NA PRZERWANIA (IER)
Kiedy działamy w trybie przerwań, 8250 SCC dostarcza czterech źródeł przerwań: przerwanie odbioru
znaku, przerwanie pustego nadajnika, przerwanie błędu komunikacji i przerwanie zmiany statusu. Możemy
indywidualnie zezwalać lub blokować te źródła przerwań poprzez wpisanie jedynek lub zer do 8250 IER
(Rejestr zezwalający na przerwania). Wpisując zero do odpowiedniego bitu blokujemy to szczególne
przerwanie. Wpisując jedynkę zezwalamy na to przerwanie. Rejestr ten jest do odczytu / zapisu, więc możemy
przepytywać aktualne ustawienie w dowolnym czasie (na przykład, jeśli chcemy zamaskować poszczególne
przerwanie bez wpływania na inne). Rozkład tego rejestru jest następujący :
21856003.010.png 21856003.011.png 21856003.012.png
Lokacja rejestru zezwalającego na przerwania jest również wspólna z rejestrem dzielenia szybkości transmisji.
22.13 DZIELNIK SZYBKOŚCI TRANSMISJI
Rejestr dzielnika szybkości transmisji jest 16 bitowym rejestrem który dzieli lokacje I/O 3F8h/2F8h i
3F9h/2F9h z rejestrem danych i zezwolenia na przerwania. Bit siedem rejestru sterowania łączem wybiera
rejestr dzielenia lub rejestr danych / zezwolenia na przerwanie.
Rejestr dzielenia szybkości transmisji pozwala nam wybrać szybkość transmisji danych (poprawnie
nazywanej bity na sekundę lub bps lub baud) Poniższa tablica pokazuje wartości jakie powinniśmy zapisać do
tych rejestrów aby sterować szybkością transmisji / odbioru:
Bity na sekundę
Wartość 3F9/2F9
Wartość 3F8/2F8
110
4
17h
300
1
80h
600
0
C0h
1200
0
60h
1800
0
40h
2400
0
30h
3600
0
20h
4800
0
18h
9600
0
0Ch
19,2K
0
6
38,4K
0
3
56K
0
1
Tablica 83 Wartości rejestru dzielenia szybkości transmisji
Powinniśmy działać przy szybkościach większych niż 19,2K na szybkich PC z wysoko wydajnym
SCC’esem (np. 16450 lub 16550). Na szczęście powinniśmy użyć kabli najwyższej jakości i trzymać nasze
kable bardzo krótkie kiedy działamy przy wysokich szybkościach.
22.1.4 REJESTR IDENTYFIKACJI PRZERWANIA
Rejestr identyfikacji przerwania jest rejestrem tylko do odczytu, który określa czy przerwanie oczekuje
i które z czterech źródeł wymaga uwagi. Ten rejestr ma następujący rozkład:
21856003.001.png 21856003.002.png 21856003.003.png 21856003.004.png 21856003.005.png
Ponieważ IIR może tylko raportować o jednym przerwaniu w czasie, a jest prawdopodobieństwo, że są
dwa lub więcej przerwania oczekujące, 8250 SCC wprowadza priorytety przerwań. Przerwanie źródła 00
(zmiana statusu) ma najniższy priorytet a przerwanie źródła 11 (błąd lub przerwa) mają priorytet najwyższy ,tj
.numer źródła przerwania dostarcza priorytetu (z trzema będącymi najwyższego priorytetu)
Poniższa tablica opisuje źródła przerwań i jak „wyczyścić” wartość przerwania w IIR. Jeśli dwa
przerwania oczekują a my obsługujemy najwyższe przerwanie, 8250 SCC zamienia wartość IIR z
identyfikatorem kolejnego źródła przerwania o najwyższym priorytecie
Priorytet
Wartość ID
Przerwanie
Powód
Wyzerowanie
Najwyższy
11b
Błąd lub przerwanie Błąd przepełnienia,
parzystości,
synchronizacji ramki
lub przerwanie break
Odczytanie rejestru
stanu łącza
Kolejny z
najwyższych
10b
Dostępna dana
Odczyt rejestru
odbioru
Kolejny z
najniższych
01b
Pusty przekaźnik
Odczytanie IIR (z ID
przerwania 01b) lub
zapis rejestru danych
Najniższy
00
Stan modemu
Odczyt rejestru
stanu modemu
Tablica 84: Powody przerwania i funkcje zwalniające
Jest jeden interesujący punkt do odnotowania o organizacji IIR: rozkład bitów dostarcza dogodnego
sposobu do przekazania sterowania do właściwej sekcji podprogramu obsługi przerwania SCC. Rozważmy
poniższy kod:
-
-
-
in
al., dx
;odczyt IIR
mov
bl, al.
mov
bh, 0
jmp
HnadlerTbl [bx]
HandlerTbl
word RLSHandler, RDHandler,TEHandler, MSHandler
Kiedy wystąpi przerwanie, bit zero IIR będzie zerem. Kolejne dwa bity zawierają numer źródła przerwania a
bardziej znaczące pięć bitów jest zerami. Pozwala to nam użyć wartości IIR jako indeksu do tablicy wskaźników
właściwego podprogramu obsługi, jak demonstruje powyższy kod.
22.1.5 REJESTR STEROWANIA ŁĄCZEM
21856003.006.png 21856003.007.png
Rejestr sterowani łączem pozwala nam określić parametry transmisji dla SCC. Obejmuje to ustawienie
rozmiaru danej, liczby bitów zatrzymujących, parzystości, wymuszenia break i wybrania rejestru dzielnika
szybkości transmisji . Rejestr sterowania łączem wygląda następująco:
8250 SCC może transmitować daną szeregową jako grupy pięciu, sześciu, siedmiu lub ośmiu bitów.
Większość nowoczesnych systemów komunikacji używa siedmiu lub ośmiu bitów do transmisji ( my
potrzebujemy siedmiu bitów do przekazania ASCII, ośmiu bitów do przekazania danej binarnej). Domyślnie,
większość aplikacji przekazuje dane używając ośmio bitowej danej. Oczywiście, zawsze odczytujemy osiem
bitów z rejestru odbiorczego; 8250 SCC ustawia wszystkie bardziej znaczące bity na zero jeśli odbieramy mniej
niż osiem bitów. Zauważmy, że jeśli przekazujemy tylko znaki ASCII,, komunikacja szeregowa będzie działała
około 10% szybciej z siedmio bitową transmisją zamiast transmisji ośmio bitowej. Jest to ważna rzecz do
zapamiętania, jeśli sterujemy oboma końcami kabla szeregowego . Z drugiej strony, zazwyczaj będziemy łączyć
urządzenia które maja stałą długość słowa, więc będziemy musieli oprogramować SCC specjalnie do
dopasowania tego urządzenia.
Szeregowa transmisja danych składa się z bitu startowego, pięciu do ośmiu bitów danych i jednego lub
dwóch bitów stopu. Bit startu jest specjalnym sygnałem, który informuje SCC (lub inne urządzenie), że dana
przebywa na lini szeregowej. Bity stopu są, w gruncie rzeczy, pod nieobecność bitu startowego, dostarczając
małą ilość czasu pomiędzy przybyciem kolejnych znaków na linię szeregową .Przez wybranie dwóch bitów
stopu wprowadzamy dodatkowy czas pomiędzy transmisję kolejnego znaku. Niektóre inne starsze urządzenia
mogą wymagać tego dodatkowego czasu lub się pogubią. Jednakże, prawie wszystkie nowoczesne urządzenia
szeregowe zadowalają się pojedynczym bitem stopu. Dlatego też, powinniśmy zawsze oprogramować chip tylko
jednym bitem stopu. Dodatkowy druki bit stopu zwiększa czas transmisji o około 10%.
Bity parzystości pozwalają nam włączyć lub wyłączyć parzystość lub wybrać tryb parzystości.
Parzystość jest schematem detekcji błędu. Kiedy włączmy parzystość, SCC dodaje dodatkowy bit (bit
parzystości) do transmisji. Jeśli wybieramy kontrolę nieparzystości, bit parzystości zawiera zero lub jeden aby
suma mniej znaczącego bitu danej i bitu parzystości dało jeden. Jeśli wybieramy kontrolę parzystości, SCC
tworzy bit parzystości taki, że mniej znaczący bit sumy parzystości i bitu danej to zero Wartość „parzystości
zablokowanej” (10b i 11b) zawsze tworzy bit parzystości na zero lub jeden. Głównym celem bitu parzystości
jest wykrycie możliwego błędu transmisji. Jeśli mamy długi, hałaśliwy lub zły kanał komunikacji szeregowej,
jest możliwe zgubienie informacji podczas transmisji. Kiedy się to zdarzy, jest mało prawdopodobne, że suma
bitów będzie pasowała do wartości parzystości. Węzeł odbiorczy może wykryć ten „błąd parzystości” i
zaraportować błąd transmisji.
Możemy również użyć wartości zablokowanej parzystości (10b i 11b)do usunięcia tych ośmiu bitów i
zawsze zamienić na zera lub jedynki podczas transmisji. Na przykład, kiedy przesyłamy osiem bitów znaków
PC/ASCII do różnych systemów komputerowych, jest możliwe ,że zbiór rozszerzonych znaków PC (znaki
których kod to 128 i większy) nie odwzorowywuje takiego samego znaku na maszynie przeznaczenia. Istotnie,
wysyłając takie znaki możemy stworzyć problem na tej maszynie. Poprzez ustawienie rozmiaru słowa na
21856003.008.png
Zgłoś jeśli naruszono regulamin