www.eprace.edu.pl » rejestrowanie-multimediow » Program wykonywany przez mikroprocesor sygnałowy » Organizacja programu

Organizacja programu

Działanie programu rozpoczyna się od inicjalizacji. Składa się ona z następujących etapów:

Po wykonaniu inicjalizacji program wchodzi do pętli głównej, którą wykonuje od tego momentu przez cały czas pracy urządzenia.

Pętla główna

Schemat blokowy działań wykony­wanych w pętli głównej przedstawia rysunek 7.2. Zasadniczym zadaniem pętli głównej jest wysyłanie do komputera ramek sterujących oraz ramek głosowych. Za każdym przebiegiem pętli na początku program sprawdza, czy w buforze znajdują się ramki sterujące na podstawie licznika (y:shi_cnt). Jeżeli licznik ten jest większy od zera, program sprawdza, czy nie występuje taka sytuacja, że bieżąca ramka była już wysyłana, a obecnie trwa oczekiwanie na jej potwierdzenie (mechanizm potwierdzeń i retransmisji zostanie szczegółowo omówiony w podrozdziale 7.4). Jeżeli ta sytuacja nie występuje lub jeżeli maksymalny czas oczekiwania na potwierdzenie minął, program przystępuje do nadania ramki głosowej przez Ethernet, po czym pętla zostaje rozpoczęta od nowa.

Dopiero gdy w danym obiegu pętli nie ma żadnej ramki sterującej do wysłania, program przechodzi do sprawdzenia czy w buforze są oczekujące dane głosowe. Sprawdzenie to wykonywane jest w jednym obiegu pętli tylko dla jednego kanału. Jeżeli w buforze danego kanału zgromadziły się przynajmniej 473 próbki (tyle mieści się w jednej ramce głosowej), następuje sprawdzenie, czy obecnie nie trwa oczekiwanie na potwierdzenie już wysłanej ramki. Jeżeli nie ma to miejsca lub upłynął już maksymalny czas oczekiwania na potwierdzenie, wysyłana jest ramka głosowa. Niezależnie od tego czy ramka głosowa została nadana czy też nie, w kolejnym przebiegu pętli sprawdzany będzie następny kanał.

Opisana powyżej kolejność postępowania w pętli głównej daje bezwzględne pierwszeństwo ramkom sterującym w stosunku do ramek głosowych, ponieważ niosą one dane wymagające pilnej obsługi.


Rys. 7.2. Schemat blokowy przedstawiający kolejność czynności wykonywanych w pętli głównej


Dane głosowe przechowywane są w 32 buforach cyklicznych, po jednym dla każdego kanału. Bufory te zapisane są w zewnętrznej pamięci SRAM pod adresem y :TrBuf. Dla każdego bufora cyklicznego istnieje wskaźnik zapisu danych i wskaźnik odczytu. Wskaźniki te umieszczone są w kolejnych komórkach pamięci X, poczynając od adresu buf_inp dla wskaźników zapisu oraz buf_oup dla wskaźników odczytu. Do obsługi tych wskaźników przyporządkowane są na stałe rejestry adresowe. Rejestr R1 zawiera adres wskaźnika zapisu dla kanału, który ma być aktualnie zapisywany. Rejestr R0 służy do przechowywania samego wskaźnika zapisu. Analogicznie rejestr R2 zawiera adres wskaźnika odczytu dla kanału, który będzie właśnie odczytywany, a rejestr R3 jest używany do przechowywania samego wskaźnika (rejestr ten pełni też inne funkcje w niektórych fragmentach programu). Na podstawie zawartości rejestru R2 można wyznaczyć numer kanału, który ma być odczytany, poprzez odjęcie od niej wartości buf_oup.

Ramki sterujące podczas nadawania są jednocześnie interpretowane przez rejestrator. Wykrywana jest informacja o numerze kanału na danym module przypisanego do danego identyfi­katora rozmowy CRV. Jeżeli ramka zawiera taką informację, zapisywana jest ona w tablicach: x:modchn – numer kanału, x:modcrv – CRV. Tablice zawierają po 16 pól – po jednym dla każdego modułu. Poza tym program wykrywa w ramkach sterujących informację o rozpoczęciu lub zakończeniu rozmowy i na podstawie tego ustawia bądź zeruje znacznik Channel Active (bit 2) w odpowiednim polu tablicy y:chflags. Jest to tablica zawierająca 32 pola, po jednym dla każdego kanału. Poszczególne bity tych pól mają określone znaczenia. Będą one opisane podczas omawiania funkcji programu, z którymi są związane.

Ramki głosowe wysyłane są zgodnie z podanym powyżej opisem, ale tylko pod warunkiem, że bit Channel Active dla danego kanału (w tablicy y:chflags) jest ustawiony. Przed wysłaniem ramki głosowej następuje sprawdzenie znacznika AGC Done – bit 0 w tablicy y:chflags. Jeżeli znacznik ten nie jest ustawiony, wykonywana jest procedura AGC i znacznik jest ustawiany. Stosowanie tego znacznika zapobiega wielokrotnemu wykonaniu algorytmu AGC na tych samych danych w przypadku retransmisji ramki.

Przerwania

Odbiór danych z kart interfejsów linii oraz odbiór informacji z komputera wykonywany jest w przerwaniach. Do tego celu wykorzystywane są 3 przerwania:

Uzupełnienie tych przerwań stanowią przerwanie odbioru ostatniej szczeliny ESAI oraz przerwanie przepełnienia bufora SHI.

Przez ESAI odbierane są próbki głosu z kart interfejsów linii telefonicznych. Port ESAI pracuje w trybie sieciowym z 32 szczelinami, z których każda zarezerwowana jest na dane jednego kanału. Transmisja została zorganizowana w taki sposób, że wykorzystywane są 2 linie, RX0 i RX1. Na linii RX1 odbierane są 8-bitowe próbki głosu w kodzie A-law, natomiast na linii RX0 – znaczniki ważności. Dana próbka głosu jest ważna tylko wtedy, gdy odebrany w tym samym czasie znacznik ważności ma najmłodszy bit ustawiony na 0. Próbki głosu odbierane są z inwersją bitów, ponieważ moduł interfejsu telefonicznego zaprojektowany został do współpracy z poprzednią wersją modułu głównego, która miała na liniach portu ESAI transoptory wprowadzające inwersją logiczną. Inwersja ta jest korygowana w procedurze AGCsub przed wykonaniem zasadniczego algorytmu AGC. Próbki głosu są wpisywane do bufora y:TrBuf w zewnętrznej pamięci SRAM, adresowanego przy użyciu rejestrów R0 i R1, używanych w sposób opisany w poprzednim podrozdziale.

Port SHI pracuje w trybie SPI i wykorzystywany jest do odbierania informacji sterujących. Informacje te nie są odbierane bezpośrednio z modułów interfejsów linii, ale z mikrokontrolera Atmel. Jego zadaniem jest odpytywanie kart interfejsów za pośrednictwem asynchronicznej transmisji szeregowej i wysyłanie ich odpowiedzi do procesora DSP. Odbierane przez DSP informacje gromadzone są w buforze cyklicznym, rozpoczynającym się pod adresem y:shi_buf.

Informacje sterujące przesyłane są w postaci ramek o takim samym formacie jak ramki sterujące przesyłane do komputera, z pominięciem pierwszych dwóch bajtów. Procedura obsługi przerwania odbioru rozpoznaje koniec odebranej ramki po znaczniku końca (dwa kolejne bajty o wartościach 16 i 3). Po jego wykryciu inkrementowany jest licznik odebranych ramek w komórce y:shi_cnt. Na podstawie tego licznika pętla główna dowiaduje się o ilości ramek oczekujących na przesłanie do komputera.

Trzecie przerwanie jest odpowiedzialne za odbiór danych z komputera przez Ethernet. Procedurę obsługi tego przerwania (recv_i) można podzielić na dwie części: odbiór danych z układu W3100A oraz wykonanie działań stosownych do odebranych danych. Sposób odbierania danych z układu W3100A zostanie omówiony w podrozdziale 7.3. Podczas odbioru tych danych każda trójka kolejnych bajtów składana jest w słowo 24-bitowe, przy czym pierwszy bajt trójki traktowany jest jako najmłodszy. Tak sformatowane dane zapisywane są w buforze liniowym pod adresem y:rcv_in.

Ponieważ odbierane są tu dwa typy ramek, potwierdzenia i parametry AGC, postępowanie po odebraniu danych może być dwojakiego rodzaju. Jeżeli pierwsze słowo odebranej ramki jest równe 255, zostanie ona potraktowana jako ramka potwierdzenia. Sprawdzane jest wówczas drugie słowo ramki celem ustalenia, czy dotyczy ona danych sterujących czy też jednego z kanałów głosowych. Potem następuje sprawdzenie, czy odebrane potwierdzenie jest ważne, według zasad podanych w podrozdziale 7.4, a jeżeli wynik tego sprawdzenia jest pozytywny, ustawiany jest odpowiedni znacznik w tablicy y:chflags. Dla ramek głosowych jest to znacznik ACK Received/Retries Limit Exceeded, zawarty w bicie 1 w polu tablicy przyporządkowanym danemu kanałowi, a dla ramek sterujących - Control Frame ACK Received – bit 23 w polu kanału 0. Znaczniki te są również wykorzystywane w przypadku przekroczenia licznika retransmisji, co zostanie dokładnie omówione w rozdziale 7.4.

Jeżeli natomiast pierwsze słowo ramki jest różne od 255, zostaje ona potrakto­wana jako ramka parametrów AGC dla kanału wskazanego przez to słowo. Wówczas pozostała część ramki (8 słów), kopiowana jest do obszaru pamięci przechowującego parametry AGC, pod adresem x:ch#, gdzie w miejsce # należy wstawić numer kanału.



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.