,
AOA 22AOA 22, inforamtyka, art of assembly language
[ Pobierz całość w formacie PDF ]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& WYŁĄCZNOŚĆ DO PUBLIKOWANIA TEGO TŁUMACZENIA POSIADA RAG „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 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 : 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: 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 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 [ Pobierz całość w formacie PDF ] |
Podobne
|