Documente Academic
Documente Profesional
Documente Cultură
fereastră deschisă pentru producătorii care se vor afla într-o continuă competiţie,
pentru furnizorii de servicii, care vor beneficia de sporirea volumului de trafic transportat, cât
şi pentru utilizatorii finali care sunt interesaţi de integrarea aplicaţiilor de voce şi date în
scopul reducerii cheltuielilor.
Producătorii de tehnologie VoIP sunt conştienţi că nu vor reuşi să înlocuiască
telefonia clasică, nici măcar să realizeze o schimbare dramatică în scurt timp. Scopul lor
imediat ar fi acela de a reproduce calităţile oferite la momentul actual de PSTN ( Public
Switched Telephone Network ) la un preţ semnificativ mai scăzut şi de a oferi o alternativă
viabilă acesteia. Prima măsură de succes pentru VoIP ar putea fi reducerea costurilor
convorbirilor realizate pe distanţe mari.
O altă aplicaţie imediată pentru telefonia IP este transmisia facsimilelor în timp real.
Până acum, serviciile de transmitere de facsimile foloseau în mod obişnuit conexiuni PSTN
de dial-up, la viteze de 14.4 Kbps. Calitatea transmisiilor prin intermediul fax-ului era
afectată de întârzierea prin reţea, compatibilitatea maşinilor şi calitatea semnalului analogic.
Pentru trimiterea fax-urilor prin intermediul reţelelor de pachete, o unitate de interfaţă va
trebui să realizeze pachetizarea datelor de transmis, conversia de semnalizări şi protocoalele
de control şi să se ocupe de asigurarea transferului complet al datelor scanate. Pierderea de
pachete şi întârzierea capăt-la-capăt au o importanţă negativă mult mai mare decât în
aplicaţiile de voce.
Majoritatea aplicaţiilor pe suport VoIP sunt considerate de timp real. Se aşteaptă
totuşi şi implementare serviciilor de voce de tip store-and-forward. Un exemplu ar fi acela de
prelucrare a mesajelor de voce local, care apoi să fie trimise către o căsuţă poştală de mesaje
vocale prin intermediul Intranet-ului sau al serviciilor Internet. Documentele însoţite de
mesaje vocale, fişiere multimedia, etc. nu vor mai reprezenta un lucru ieşit din comun în
viitorul apropiat folosind tehnologia VoIP.
Creşterea pieţei de desfacere a aplicaţiilor bazate pe serviciile VoIP se aşteaptă să fie
considerabilă în următoarea perioadă datorită unor mari avantaje. În general, acestea se pot
împărţi în mai multe categorii:
Calitatea convorbirilor realizate peste reţeaua IP trebuie să fie dacă nu mai mare, cel
puţin ca cea oferită de reţeaua telefonică publică PSTN, în ciuda faptului că se pot străbate
reţele cu un QoS ( Quality of Service ) variabil.
Reţeaua suport IP trebuie să aibă stricte criterii de performanţă, incluzând aici un cât
mai mic număr de convorbiri rejectate, pachete pierdute; întârzierea prin reţea trebuie să fie
cât mai mică, iar apelurile pierdute datorită problemelor reţelei cât mai puţine.
Controlul apelului din reţeaua IP trebuie să fie transparent semnalizărilor telefonice,
astel încât utilizatorului să nu-i pese pe baza cărei tehnologii se realizează conexiunea.
Serviciile de interconectarea PSTN/VoIP implică utilizarea de “gateway”-uri între
reţeaua de voce şi reţeaua IP.
Cursa având ca scop producerea de echipamente VoIP care să acopere o cât mai mare
paletă de cereri venite din partea beneficiarilor este în plină desfăşurare. Este nevoie de
adoptarea şi implementarea multor standarde, iar actualelor reţele le este necesară
implementarea QoS-ului. Adoptarea VoIP-ului trebuie să fie o alternativă viabilă chiar în
contextul scăderii pronunţate şi constante a preţurilor la telefonie.
Asigurarea unui nivel calitativ cel puţin egal cu al serviciilor PSTN este privită ca o
cerinţă de bază, în ciuda argumentelor venite din partea anumitor producatori potrivit cărora
problema cost-funcţionalitate-calitate ar fi prioritară. Deşi QoS se referă în principal la
fidelitatea de a transmite voce şi facsimil, se poate de asemenea aplica şi la disponibilitatea
reţelei la facilităţi ale reţelei telefonice ( conferinţă, afişarea numărului apelantului, etc. ) şi
scalabilitate.
Una dintre cele mai importante evoluţii oferite de VoIP este pre-procesarea software a
conversaţiilor de voce. S-a ajuns la concluzia ca 50 – 60 % din discursul telefonic dintre 2
persoane este de fapt … pauză. De accea, inginerii au găsit o metodă contra acestui neajuns:
suprimarea pauzelor. Poate cea mai mare facilitate a VoIP-ului este aceea că, astfel, de acum
încolo plata se va face conform cu volumul de trafic generat, nu ca până acum ca produs de
bandă x timp, produs ce duce la o irosire a resurselor reţelei.
Problemele specifice trasportului de voce venite din partea reţelei, cărora proiectanţii
au trebuit să le găsească soluţii ar putea lua următoarele aspecte:
Întârzierea capăt-la-capăt – este una dintre cele mai neplăcute probleme care apar în
cazul transportului vocii pachetizate peste o reţea IP. Ea este la originea a 2 probleme: ecoul
şi suprapunerea parţială a discursului telefonic.
Ecoul este cauzat de reflexia vocii celui care vorbeşte, produsă la celălalt capăt al
convorbirii telefonice, care ajunge la urechea vorbitorului. Ecoul devine o mare problemă
atunci când întârzierea dus-întors are o valoare mai mare de 50 milisecunde. În condiţiile în
care ecoul este considerat o mare limitare a calităţii, transmiterea vocii peste o reţea de
pachete trebuie să ţină seama de controlul ecoului, dar mai ales de modalităţi de reducere a
lui.
Suprapunerea discursului devine semnificativă dacă întârzierea într-un singur sens
depăşeşte 250 milisecunde.
Sursele de generare a întârzierii capăt-la-capăt, în cazul unui apel având ca suport o
reţea de pachete, sunt:
Întârzierea de acumulare – uneori numită şi întârzierea algoritmică, ea este cauzată de
nevoia de a colecta mai multe eşantioane de voce pentru a fi procesate de către codor.
Aceasta depinde de tipul de codor de voce folosit şi poate ajunge de la peioada de eşantionare
( 0.125 ms ) la câteva milisecunde. O listă reprezentativă de codoare de voce folosite este:
G.726 – ADPCM – 16, 24, 32, 40 kb/s – 0.125 ms
G.728 LD – CELP – 16 kb/s – 2.5 ms
G.729 CS – ACELP- 8 kb/s – 10 ms
G.723.1 – Codor multirată – 5.3, 6.3 kb/s – 30 ms.
Întârzierea de procesare – este cauzată de procesele de codare si colectare a
eşantioanelor de voce, codate deja, pentru a fi “împachetate” şi trimise în reţeaua IP.
Problema reducerii
întârzierii totale include şi
necesitatea eliminării acestui jitter. Acest lucru presupune adunarea pachetelor şi menţinerea
lor suficient de mult, permiţând astfel şi celui mai lent, celui mai afectat de reţea, să ajungă la
recepţie în timp util pentru a fi redat în secvenţa corectă.
Cele 2 scopuri urmărite, de minimizere a întârzierii şi de înlăturare a jitter-ului, au
produs diverse scheme de adaptare a buffer-ului de recepţie pentru a corespunde cerinţelor
variabile în timp ale înlăturării jitter-ului. Această adaptare are atât scopul explicit de a
minimiza dimensiunea şi întârzierea buffer-ului pentru eliminarea jitter-ului, cât şi prevenirea
golirii buffer-ului.
În cele ce urmează, vom prezenta 2 soluţii de adaptare a dimensiunii “jitter buffer”-
ului. Ele au o mare dependenţă de reţeaua de pachete care este folosită drept suport de
transmisie.
Prima variantă ar fi măsurarea variaţiei nivelului de pachete din “jitter buffer” de-a
lungul unei perioade de timp şi adaptarea prin creştere a dimensiunii buffer-ului pentru a se
potrivi jitter-ului calculat. Această soluţie dă cele mai bune rezultate în cazul reţelelor care
cauzează un jitter consistent de-a lungul timpului, spre exemplu reţelele ATM.
A doua variantă este de a contoriza numărul de pachete care sosesc cu întârziere şi de
a raporta numărul acestor pachete la numărul de pachete corect procesate. Această proporţie
poate fi apoi folosită la ajustarea “jitter buffer”-ului, care să poată face faţă în cazul unei
predeterminate rate
permise a pachetelor sosite cu întârziere. Soluţia are mare utilizare în cazul reţelelor
cu variaţie foarte mare a intervalelor de sosire a pachetelor. Este cazul aici şi al reţelelor de
tip IP.
Trebuie totuşi menţionat că, pe lângă aceste tehnici descrise, reţeaua, de orice tip ar fi
ea, trebuie configurată şi gestionată pentru a furniza întârzierea şi jitter minime, permiţând
astfel un QoS consistent.
Figura 1.2.5. Eliminarea ecoului prin intermediul unui filtru digital [17].
Pentru a ascunde şi a repara câteva din neajunsurile reţelei IP, care au un impact
foarte grav asupra comunicaţiilor de timp real pe acest suport, se folosesc tehnici ca:
Prioritizarea – are o strânsă legătură cu QoS-ul. Se foloseşte pentru aceasta protocolul
RSVP ( Resourse Reservation Protocol ), care permite sursei de trafic să ceară anumite
caracteristici ale serviciului de transport. Din păcate acest protocol nu a avut un foarte mare
succes şi de aceea răspândirea lui este destul de limitată. Specialiştii IETF (Internet
Engineering Task Force) au abordat o altă soluţie, mai simplă şi mai promiţătoare:
DiffServ( Differentiated Services Model ) care foloseşte câmpul ToS ( Type of Service ) din
antetul IPv6 al fiecărui pachet, pe baza căruia clasifică traficul la graniţa dintre client şi ISP.
În ciuda acestor proiecte, în reţeaua IP nu se poate încă vorbi de un QoS viabil.
Fragmentarea IP este realizată în acelaşi mod ca şi la Frame Relay. Deşi cerută pentru
a reduce întârzierea globală a traficului de voce, fragmentarea realizează totuşi adăugarea
unui overhead mare, datorită headerului destul de mare al pachetelor IP. S-a constatat că
traficul de voce pe suport IP consumă din această cauză resursele WAN cu până la 50% mai
mult decât traficul de voce pe suport Frame Relay. Se speră totuşi că pe măsură ce IP-ul se
maturizează, compresia headerului si îmbunătăţirea performanţelor routerelor să elimine
aceste neajunsuri.
“Voice over IP” este o tehnologie nouă, care vine să ofere o alternativă modului de
transmisie a vocii, în special, şi a altor servicii oferite de reţeaua de comutaţie de circuite. Ca
orice inovaţie, care vine să revoluţioneze realmente modul de transmisie a poate celui mai
vechi şi încetăţenit mod de comunicare verbală la distanţă între oameni, am numit aici
telefonia clasică, s-a lovit încă din prima clipă de suspiciunea utilizatorilor, problemele
reţelelor de tip IP, noul suport de transmisie a vocii, dar, poate cel mai important obstacol,
nivelul uriaş al investiţiilor făcute în reţeaua de telefonie deja dezvoltată.
În tot acest context, VoIP a trebuit să-şi facă loc pe piaţă, oferind cel puţin la fel de
ieftin aceleaşi calitate a serviciilor de voce, să se integreze în sistemul de comunicaţie şi să-şi
pună la punct metode de colaborare, în principal, tocmai cu reţeaua telefonică, ale cărei
servicii i le concurează şi cărora le oferă alternativă. Acest lucru trebuie realizat datorită
faptului că, oricât de mare va fi amploarea dezvoltării VoIP, nu va reuşi să înlocuiască
serviciile de telefonie clasică.
Obiectivele de realizat pentru o bună funcţionare ar fi:
Controlul apelului şi al semnalizărilor diferite în cele 2 reţele de transport, astfel încât
utilizatorului obişnuit să-i fie indiferent pe ce suport se transmite semnalul vocal.
Intercomunicarea şi interoperabilitatea echipamentelor celor 2 reţele, PSTN (Reţeaua
telefonică de telefonie publică cu comutare de circuite) şi reţeaua de pachete, de tip IP. Acest
lucru implică folosirea unor punţi ( gateway ), care au rolul de a realiaza trecerea de la modul
diferit de trasmisie a datelor în cele 2 reţele.
Managementul sistemelor, adresarea, securitatea şi permisiunea de acces care trebuie
asigurate din ambele părţi.
Odată începută cursa de proiectare şi implementare de produse VoIP, care să se
muleze pe o mare varietate configuraţii deja existente, au trebuit concepute şi publicate o
multitudine de noi standarde care aveau în vedere mai ales noua tehnologie apărută. Toate
acestea au făcut ca sistemele VoIP să conţină mai multe plane funcţionale.
Aceste plane nu fac altceva decât să aducă soluţii structurate transportului de voce şi
interoperabilităţii cu celelalte reţele de date.
M e s a je
SNM P
M o d u lu l d e
S e m n a liz ã ri m anagem ent
a l re te le i
M o d u lu l d e
s e m n a liz a r e
te le fo n ic ã
P a c h e te
de voce
Voce M o d u lu l d e M o d u lu l d e
p a c h e tiz a re a a p r o to c o a le d e
v o c ii re te a
DSP
M IC R O P R O C E S O R
regulă semnalizări E&M de tipul I, II, III, IV, V, FXO, FXS, ISDN acces de bază şi acces
primar.
Modulul de protocoale de reţea – procesează informaţiile de semnalizare şi le
converteşte din semnalizări specifice reţelei telefonice în protocoale de semnalizare în mod
pachet, folosite la stabilirea conexiunilor în reţeaua IP ( ex: Q.933 ). De asemenea, adaugă
headere pacheteleor de voce şi de semnalizare înainte de a fi transmise.
Modulul de management a reţelei – asigură interfaţa de gestiune a vocii, pentru
menţinerea şi configurarea celorlalte module ale sistemului. Toate informaţiile de gestiune
sunt definite în ANSI.1 şi sunt compatibile cu sintaxa protocolului SNMP v.1 ( Signalling
network-management protocol ).
Pachetul software este partiţionat pentru a asigura o bine definită interfaţă către
aplicaţia ce rulează în DSP, utilizabilă pentru mai multe aplicaţii şi protocoale de pachetizare.
DSP-ul procesează eşantioanele de voce şi pasează pachetele de voce microprocesorului
însoţite de header-ele generice de voce.
Microprocesorul este responsabil de transferul pachetelor şi adaptarea header-elor
generice în header-ele specifice protocolului de transport în timp real al pachetelor de voce
( ex: Real Time Protocol - RTP ). De asemenea, tot microprocesorul realizează şi procesarea
informaţiilor de semnalizare şi le converteşte din protocoalele de semnalizare telefonică în
protocoale de semnalizare în reţeaua de pachete ( ex: H.323 ).
După cum şi titlul anuţă, acest modul al arhitecturii software a unui sistem VoIP are în
principal rolul de a procesa eşantioanele de voce. De obicei, aceste funcţiuni sunt realizate cu
ajutorul unui DSP ( Digital Signal Processor ). Raportul calitate/preţ al acestor dispozitive a
înregistrat o evoluţie vertiginoasă în ultima vreme, performanţele sale, dar mai ales preţul în
pe reţeaua IP. Prin această procedură se produc reduceri semnificative ale benzii inutil
utilizate.
Unitatea de redare a vocii – buffer-ează pachetele de voce sosite din reţea şi le trimite
codorului de voce pentru redare. Asigură în acelaşi timp:
un buffer de tip FIFO ( First In, First Out ) care menţine eşantioanele de voce înainte
ca să fie realizată înlăturarea jitter-ului datorat reţelei.
un mecanism de măsurare a jitter-ului care permite un control adaptiv al întârzierii de
tip FIFO.
Protocoalele de pachetizare a vocii folosesc un câmp ce conţine numere de secvenţă
în interiorul fluxului de pachete pentru menţinerea temporară a integrităţii vocii de-a lungul
redării. Folosind această metodă, transmiţătorul inserează în fiecare pachet conţinutul unui
contor ce evoluează modulo 216, permiţând receptorului să detecteze pierderea de pachete şi
să reproducă intervalele de linişte într-o redare corectă.
Protocolul de pachete de voce – este în care se încapsulează vocea compresată şi
datele de fax pentru a fi transmise celuilalt capăt pe suportul reţelei de date.
Controlol interfeţei – coordonează schimbul de informaţii de monitorizare şi control
dintre DSP şi sistemul gazdă, prin intermediul unui mecanism de cutie
D e te c to r d e
to n u ri U n ita te a
DTM F d e re d a re
a d a p tiv ã
G e s tiu n e a
C o n tr o lu l
p a c h e te lo r
c â s tig u lu i p ie r d u te
C o d o re
voce
G .7 1 1
In te rfa ta D e te c tia
G .7 2 2
PC M E lim in a r e e c o u G .7 2 8
a c t iv itã tii P r o to c o a le
G .1 6 5 /G .1 6 8 G .7 2 3
v o c a le G .7 2 9 de pachet
G e n e r a to r
d e to n u r i c ã tre
D TM F A s a m b la r e m ic ro p ro c e s o r
G e n e r a to r D e z a s a m b la r e
to n d e p a u z ã
R e e s a n tio n a r e S e c v e n ta re
VO C E
In te r fa ta s e r v ic iilo r d e fa x
M odem
V .2 1 P ro to c o l
V .2 2 D r iv e r
d e fa x
V .1 7 re te a P ro cesarea
T .3 0
V .2 9 m e s a je lo r
În ciuda inconvenienţelor de ordin tehnic în faţa cărora s-a aflat, datorită problemelor
de asigurare a QoS-ului de către reţelele IP, tehnologia VoIP a avut o mare şi rapidă
dezvoltare. Ea are rolul de a integra serviciile de transport de voce în reţelele de tip IP şi de a
realiza o bună comunicare cu reţeaua publică de telefonie PSTN.
Figura 1.4.1:
Integrarea serviciilor de
voce în reţelele IP. [14].
În modul
tradiţional de funcţionare
al serviciilor de telefonie publică, până acum apelurile aveau se realizau prin stabilirea unor
canale virtuale comunicaţie de-a lungul reţelei de comutaţei de circuite, care erau apoi
folosite pentru transmiterea vocii. Semnalul vocal urma acelaşi traseu stabilit în faza de
iniţializare a apelului, traseu virtual care la sfârşitul comunicaţiei este eliminat din
funcţionarea sistemului.
Noua tehnologie VoIP, datorită tendinţei de integrare şi necesităţilor de comunicare,
oferă mai multe modalităţi de conexiune pentru realizarea apelului şi transferului de voce.
Figura următoare prezintă variantele de realizare conexiunilor amintite. Ele pot fi:
PC–PC – legătură telefonică între 2 calculatoare echipate cu software adecvat
comunicaţiilor de voce în timp real (ex: Microsoft NetMeeting) şi cu hardware specializat
pentru comunicaţii de voce ( placă de sunet, microfon, căşti audiţie ). Conexiunea se poate
realiza folosind numai Intranet-ul privat al companiei, sau reţeaua publică de pachete IP.
M u lt im e d ia P C
M u lt im e d ia P C
M u l t im e d i a P C
M u lt im e d ia P C
In t r a n e t
In t r a n e t
PBX
R e te a p u b lic ã IP F u n c tie d e
in te rc o n e c ta re
F u n c tie d e
in te rc o n e c ta re
V o IP G a t e w a y
P S T N /IS D N
V o IP G a t e w a y
P S T N /IS D N
PBX
standarde. Totul a culminat însă, în 1996 cu apariţia primei versiuni a specificaţiilor H.323.
Au urmat apoi în 1998 versiunea 2, în 2000 versiunea 3, actualmente funcţionând versiunea
4.
Intitulate generic “Audiovisual and multimedia systems”, H.323 reprezintă un
standard care specifică protocoalele, componentele şi procedurile care furnizează serviciile de
comunicare multimedia – audio, video şi date în timp real, peste o reţea de pachete bazată pe
protocolul IP. H.323 este parte a recomandărilor ITU-T, denumite generic H.32x care descriu
funcţionarea comunicaţiilor peste diverse tipuri de reţele de pachete.
R e te a d e p a c h e te
(e x : IP )
H .3 2 3
T e rm in a l H .3 2 3 T e r m in a l H .3 2 3
Specificaţiile H.323 v.1 emise de către ITU-T Study Group 16 în octombrie 1996
aveau ca obiect sistemele de tip video-telefon şi echipamente pentru reţelele LAN care să
furnizeze un QoS negarantat. Rapiditatea dezvotării aplicaţiilor VoIP şi a telefoniei prin
Internet a pavat drumul spre o revizuire a specificaţiilor H.323. Inconsistenţa standardelor
deja adoptate a fost scoasă la lumină de produsele oferite care erau incompatibile. Odată cu
evoluţia VoIP, noi cerinţe au apărut la orizont, ca, de exemplu, asigurarea comunicaţiei între
un multimedia-PC (terminal H.323) şi un telefon obişnuit funcţionând în reţeaua PSTN.
Aceste cerinţe au dus la necesitatea unui standard pentru telefonia prin Internet. Astfel, în
ianuarie 1998 a fost publicată versiunea 2 H.323-ului – sisteme de comunicaţie multimedia
bazate pe comutaţia de pachete.
G .7 1 1
H .2 6 1
G .7 2 9
H .2 6 3 H .2 2 5 H .2 4 5
G .7 2 3 .1 H .2 2 5
RTCP s e m n a liz a r e s e m n a liz a re T .1 2 0
RAS apel c o n tro l
RTP
P r o t o c o a le d e tr a n s p o r t s i in te r f a t ã c u r e t e a u a
Terminal Terminal
H.323 H.323
Terminal H.323
S e r v ic ii d e
ta x a re
C o n tr o lu l a p e lu lu i
G e s tiu n e a p e lu r i g a te w a y S e m n a liz a r e P S T N
C o n tro lu l a p e lu lu i
(e x . Q .9 3 1 )
H .2 2 5 .0 H .2 2 5 .0 H .2 4 5
RTCP RTCP RAS s e m n a liz a r e s e m n a liz a re S e m n a liz a r e P S T N
(c lie n t) apel c o n tro l C o n t r o lu l le g ã t u r ii
(e x . L A P D )
P r o to c o a le d e tr a n s p o r t s i in t e r f a t a c u S e m n a liz a r e P S T N
re te a u a In te r fa ta f iz ic ã
serviciile oferite de ele. Standardele H.323 specifică serviciile precise care trebuie asigurate şi
alte funcţionalităţi opţionale ce pot fi asigurate.
O facilitate opţională este rutarea semnalizării apelului. Terminalele trimit mesaje
pentru semnalizare apel gatekeepr-ului, iar acesta le rutează către celălalt terminal. O altă
variantă ar fi ca acest lucru să se facă fără tranzitarea gatekeeper-ului. Această funcţie este cu
atât mai valoroasă cu cât monitorizarea apelurilor de către gatekeeper asigură un control mai
bun al apelurilor din reţea, de vreme ce deciziile de rutare luate de GK sunt bazate pe o mare
varietate de factori.
M a n a g e m e n e tu l G K
S e rv ic ii d e ta x a r e
H .2 2 5 .0 H .2 2 5 .0 H .2 4 5
RAS S e r v ic ii d ir e c to a r e
s e m n a liz a r e s e m n a liz a r e
(s e rv e r) apel c o n tro l
S e r v ic ii d e
s e c u rita te
P r o to c o a le d e tr a n s p o rt s i M a n a g e m e n tu l
in te r fa ta c u r e te a u a p o litic ii/a p e lu lu i
translateze adresele telefonice E.164 în adrese de transport din reţeaua IP. Ca şi gateway-ul,
este o componentă logică, iar ea poate fi implementată ca parte a unui gateway, sau MCU.
Translaţia adreselor – Apelurile efectuate din interiorul reţelei H.323 pot folosi un
înlocuitor al adresei terminalului destinaţie, în timp ce apelurile realizate din afara reţelei
H.323 şi primite de un gateway pot folosi numere de telefon conform specificaţiei E.164
asupra numerotaţiei PSTN, pentru a adresa un terminal. Gatekeeper-ul este cel care
translatează numerele de telefon E.164, sau înlocuitorii lor în adrese de reţea (ex:
205.255.195.89:5004 pentru o reţea IP) pentru terminalele destinaţie.
Controlul accesului – GK poate controla accesul terminalelor în reţeaua H.323. El
foloseşte pentru aceasta mesaje RAS, cereri de admisie(ARQ), confirmări(ACF) şi respingeri
(ARJ). Un caz simplu ar fi ca controlul admisiei să fie o funcţie nulă, care să admită toate
terminalele din reţeaua H.323.
Controlul lăţimii de bandă – GK asigură suport pentru controlul benzii prin
intermediul folosirii mesajelor de tip RAS, cereri de alocare de bandă(BRQ),
confirmări(BCF) şi refuzuri(BRJ). Spre exemplu, dacă un gestionar de reţea semnalizează o
depăşire a unui număr de comunicaţii simultane în reţeaua H.323, gatekeeper-ul poate refuza
ulterioare conexiuni odată atins un prag. Rezultatul este limitarea benzii totale alocate la o
anumită fracţiune din banda disponibilă. La fel ca şi în cazul anterior, controlul benzii poate
fi o funcţie nulă ce acceptă toate cererile de bandă.
Managementul zonei – gatekeeper-ul are rolul de a asigura funcţiile mai sus amintite
pentru terminalele, gateway-urile şi unităţile MCU ce se găsesc în zona sa de control.
Semnalizarea de control a apelului – GK poate ruta mesajele de semnalizare a
apelului dintre terminale. Într-o comunicaţie punct-la-punct, GK poate procesa
Unitatea centrală este realizată cu două procesoare care lucrează paralel, tratarea
apelurilor fiind distribuită în mod egal între ele. În cazul defectării unuia dintre procesoare,
Procesorul Central de Tratare Apeluri ( PCTA ) este cel care gestionează resursele
centralei. Procesoarele de grup sunt interogate periodic de către procesoarele centrale asupra
stării liniilor. La iniţierea unui apel procesorul central stabileşte conexiunea prin câmpul de
comutaţie şi asigură sincronizarea proceselor ce cooperează la tratarea apelului. Tot
procesorul central asigură taxarea convorbirilor.
Procesoarele de grup ( PG ) gestionează abonaţii locali şi trunchiurile. Ele comunică
procesorului central informaţii privind starea liniilor şi gestionează resurele locale care permit
accesul la câmpul de comutaţie central. Procesoarele de grup comunică cu Unitaăţile de
Abonat (UA) şi cu Unităţile de Trunchi Digital (UTD) pe o magistrală serială. Fiecare
procesor de grup gestionează două magistrale seriale (Bus0 şi Bus1). Bus0 este folosită
pentru a comunica cu unitaţile de abonat proprii, iar Bus1 este folosit pentru a prelua unităţile
de abonat ale unui procesor de grup defect.
Unităţile de abonat ( UA )conţin opt interfeţe de linie de abonat. Acestea sunt
supravegheate de un procesor local care comunică procesorului de grup evenimentele apărute
pe linie.
Unităţile de trunchi digital ( UTD ) conţin o interfaţă de trunchi digital. Aceasta este
controlată de un procesor local care comunică procesorului de grup evenimentele de pe
fiecare canal.
Comunicaţia între procesoarele centrale şi procesoarle de grup se relizează prin
fluxurile PCM pe două canale rezervate pentru comunicaţie.
Fiecare procesor de grup este conectat printr-un flux PCM la fiecare din cele două
procesoare centrale. În funcţionarea normală apelurile sunt tratate alternativ de un PCTA sau
de altul. Dacă unul din procesoarele centrale se defectează atunci procesorul rămas funcţional
va prelua tratarea tuturor apelurilor, capacitatea de realizare a convorbirilor înjumătăţindu-se.
Procesorul Central de Tratare Apeluri este cel care gestionează activitatea întregii
centrale.
Comutatorul spaţio-temporal este folosit pentru a dirija canalele din fluxurile PCM
locale grupului spre fluxurile PCM care merg la câmpul de comutaţie. În afară de funcţia de
comutaţie, comutatorul spaţio-temporal mai asigură comunicaţia cu procesoarele centrale.
Fluxurile PCM 0 la 3 sunt folosite local pentru semnalele de convorbire de la abonaţi.
O interfaţă foloseşte acelaşi canal temporal atât pentru emisie cât şi pentru recepţie.
Circuitul de sincronizare este realizat cu un circuit integrat specializat de tip TSAC şi este
comandat de către microprocesor prin doi biţi ai unui port de ieşire.
În cadrul unui grup fiecare unitate de abonat are o adresă unică codificată pe 5 biţi.
Această adresă este folosită pentru identificare în cadrul comunicaţiei cu procesorul de grup.
Adresa este cablată pe fundul de sertar şi este citită prin circuitul de citire a adresei.
Rolul UCP de pe unitatea de abonat este de a degreva procesorul de grup de
prelucrarea evenimentelor rapide care apar pe linia de abonat. UCP detectează închiderea şi
deschiderea telefonului precum şi cifrele formate în mod puls şi trimite spre procesorul de
grup mesaje de notificare. La comanda procesorului de grup UCP poate conecta o interfaţă la
un canal temporal şi poate trimite curent de sonerie.
Unitatea de abonat este interogată periodic de către procesorul de grup pe una din
magistralele seriale 0 şi răspunde cu evenimentele apărute. Dacă unitatea nu primeşte mesaj
de interogare un anumit timp va selecta automat cealaltă magistrală pe care este interogată de
alt procesor de grup.
În figura 2.2.3.2 este prezentată schema bloc a unei interfeţe de linie analogică.
Interfaţa conţine 3 relee: releu pentru testul liniei de abonat, releu pentru testul interfeţei de
abonat şi reşeu de apel. În figură releele sunt desenate în poziţia normală de funcţionare.
Linia este alimentată în curent continuu prin două generatoare de curent care au o impedanţă
mare în curent alternativ. Semnalul de convorbire este aplicat printr-un transformator unui
circuit de trecere de la 2 la 4 fire şi apoi spre CODEC. Rolul circuitului de trecere de la 2 la 4
fire este de a separa calea de emisie de cea de recepţie.
Unitatea de trunchi digital conţine o interfaţă de trunchi digital. Schema bloc a uităţii
de trunchi digital este cea din figura 12. Interfaţa de trunchi este controlată de unitatea
centrală de prelucrare realizată în jurul unui microprocesor din familia Intel 8051.
numai 30 de canale temporale pentru canale telefonice ( canalele 1-15 şi canalele 17-31 )
rămânând două canale folosite unul pentru semnalele de sincronizare de cadru şi multicadru
(canalul temporal 0) şi altul pentru semnalizare de linie pentru canalele telefonice ( canalul
temporal 16 ).
taxare
comanda conexiunilor
eliberarea ressurselor
stabilirea/menţinerea/eliberarea apelurilor cu cereri de servicii adiţionale
Idependenţa faţă de sistemul de semnalizări şi de hardware este realizată de software-
ul de semnalizare şi suport.
Acesta realizeză:
tratarea semnalizărilor
detecţia evenimentelor de semnalizare
virtualizarea evenimentelor ( independenţa de harware-ul de semnalizare)
translatarea evenimentelor de semnalizare în mesaje cu semnificaţie telefonică.
alocarea/eliberarea resurselor de semnalizare
- gestiunea şi alocarea resurselor pentru apel
comanda interfeţelor telefonice
A m p la s a r e a c a r te le i în a r h ite c tu r a s tr u c tu r a lã a c e n tr a le i
M e n te n a n tã s i
P ro c e s o r c e n tra l d e P ro c e s o r c e n tra l d e
a d m in is tr a r e
tr a ta r e a p e lu r i tr a ta re a p e lu r i
16 x 16 16 x 16
Gen
Gen
ceas
ceas
0 1 ... 1 4 1 5 0 1 ... 1 4 1 5
U A U A U A U A
par im p a r par im p a r
P CM 0
0
P r o c e s o r1 PCM 1
Sbus0
g ru p Sbus1
a b o n a ti 2
3
0
P ro c e s o r1
g ru p S
S
b
b
u s1
u s0
a b o n a ti 2 P C M 1
P C M 0
3
U A U A U A
im p a r par im p a r
R etea IP V o IP G a te w a y
F ig u r a 3 . 2 . 1
succes îndeplinite apeluri de intrare sau apeluri de ieşire ale centralei telefonice în
reţeaua H.323.
La stabilirea unui apel telefonic de către un abonat local, acesta va fi pus în faţa
următoarelor variante, iar în funcţie de opţiunea abonatului telefonic, are loc în Unitatea
Centrală analiza şi decizia asupra interfeţei de ieşire a apelului:
Unitatea de Abonat (UA), pentru apeluri locale.
Joncţiune digitală, pentru apeluri de ieşire prin reţeaua telefonică.
VoIP card, pentru apeluri de ieşire prin reţeaua IP.
Prezintă interes varianta în care opţiunea abonatului este de a folosi ca poartă de ieşire
a apelului gateway-ul VoIP. În această situaţie, prima măsură ce va fi luată este de a
semnaliza PG-ului intenţia de realizare a unui apel. Cel din urmă îi va aloca pe fluxul TDM
de comunicare cu UA-urile un canal temporal pentru transmiterea eşantioanelor de voce. În
acelaşi timp va anunţa gateway-ul de opţiunea de efectuare a unui apel şi va aloca de
asemenea un canal temporal pe fluxul PCM cu care comunică cu gateway-ul, canal pe care în
PG vor fi comutate apoi eşantionalele de voce. “VoIP card”-ul, prin modulul său ce
realizează interfaţarea şi comunicarea cu reţeaua telefonică va prelua conţinutul canalului
corespunzător şi buffer-a în memoria sistemului. De acolo, vor intra în sarcina modulului de
procesare a vocii, iar modulul de interfaţă şi comunicare cu reţeaua H.323 va iniţia şi stabilii
funcţionarea unui apel în reţeaua de pachete.
În cazul apelurilor de intrare, detectate de către modulul de interfaţă şi comunicare cu
reţeaua H.323 al “VoIP card”, celălalt modul de interfaţă cu reţeaua telefonică semnalizează
operaţia PG-ului, care alocă un canal temporal pe fluxul TDM prin intermediul căruia
comunică. Acest canal va permite transportul eşantioanelor recuperate, furnizate de către
modulul de procesare a vocii, către PG, locul unde vor fi comutate către un abonat local, sau
pe flux PCM la PCTA şi apoi către joncţiunea digitală de ieşire, în cazul unui apel de tranzit.
decât pe 16 biţi în acest spaţiu,. El mai poate folosi insă alte 4 zone de memorie
externe: de date, de program, I/O şi byte memory. Pentru lucrul cu aceste zone de memorie,
sunt furnizate semnale de selecţie a fiecăreia din cele 4 zone.
În aplicaţia de faţă nu este folosită decât memoria de octeţi (“byte memory”), ca zonă
de memorie externă. Deşi volumul de memorie ce poate fi adresat şi folosit de DSP ca
memorie de octeţi este de 4Mbytes, ce sunt organizaţi în 256 pagini a câte 16Kx8 biţi, se
foloseşte doar un singur chip de memorie de 512Kx8 biţi.
Pentru o bună comunicare cu procesorul gazdă, AD2181 are 4 porturi: [5]
2 porturi seriale, configurabile prin intermediul unor regiştrii interni de control.
Portulul de acces BDMA (Byte-memory Direct Memory Access), ce poate fi folosit
pentru “boot”-are şi acces pe 8 biţi la memoria externă.
Portul IDMA(Internal Direct Memory Access) – port paralel ce poate fi folosit pentru
“boot”-are, sau accese din partea procesorului gazdă. DSP-ul asigură 6 pini de control pentru
buna funcţionare a portului IDMA.
Host PC [19]– este folosit un embedded PC/104 cu un procesor de 40MHz,
compatibil 386SX şi 8Mb memorie RAM. Pentru interfaţa cu reţeaua Ethernet lucrează un
chipset Realtek 8139 şi portul fizic compatibil 10Base-T NE2000.
Pentru stocarea datelor, suportul fizic este un DiskOnChip cu capacitatea de 2 Mb,
existând porturi pentru legătură cu HDD şi FDD.
Pe lângă portul de reţea, placa mai beneficiază de 4 porturi seriale, port paralel şi,
poate cel mai important, mai ales privit din direcţia comunicaţiei cu “VoIP card”, portul ISA,
cu 104 pini. Aceştia furnizează semnalele de control, bus-ul de date, bus-ul de adrese,
semnalul de ceas ISA (8MHz), cererile de întrerupere venite din partea DSP-urilor.
Logica de interfaţă – alcătuită dintr-o multitudine de componente digitale, are rolul a
realiza decodificarea adreselor, obţinerea unor semnale de control, cererea de întrerupere de 2
ms şi interfaţa de acces la DSP-urile şi procesorul gazdă, PC/104.
Schema hardware de principiu a “VoIP card” care prezintă componentele mai sus
amintite şi modul lor de intercomunicare este prezentată în figura 4.1.1:
A d a p to r fu n d d e s e rta r
DSP 0 DSP 2
DSP 1 DSP 3
Date, adrese, comenzi, IRQ
D a te D a te
A d re s e A d re s e
C om enzi C om enzi
L O G IC Ã D E IN T E R F A T Ã
Em bedded PC 104
E th e rn e t
Datorită complexităţii unui gateway, de orice fel ar fi el, trebuie să aibă mai multe
plane de funcţionare, unele specifice celor 2 reţele la graniţa cărora se doreşte acţiunea sa şi
unul de translaţie a celor 2 formate diferite de date cu care se lucrează.
F u n c tii
C o n v e r s ie d e
s p e c ific e F u n c tii
p r o to c o a le s i tra n z la tia SCN
unui s p e c ific e
fo r m a te lo r d e
te r m in a l r e te le i S C N
tr a n s m is ie
H .3 2 3
PSTN
C o m p u te r
T e le fo n
de date, semnale de control, cereri de întrerupere, etc. Nu este obligatorie folosirea tuturor
acestora, acest lucru rămânând la latitudinea proiectantului.
Toate aceste facilităţi mai sus amintite îl fac foarte potrivit pentru sarcina sa de
procesor gazdă în cazul aplicaţiei noastre, unde pe lângă cele 3 module trebuiesc
implementate controlul şi gestiunea celor 4 DSP-uri şi a matricii de comutaţie.
Întreg software-ul aplicaţiei se află stocat pe un DiskOnChip cu capacitatea de 2MB.
S-a folosit un sistem de operare Microsoft DOS 6.22, care, deşi nu conţine stivă
TCP/IP, este de mici dimensiuni şi reprezintă un bun suport al aplicaţiilor implementate în
limbajul C++, mai ales celor dezvoltate cu mediul Borland C++ 3.1.
Inconvenientul reprezentat de lipsa suportului de comunicare cu reţeaua IP a fost
înlăturat prin folosirea stivei TCP/IP “WATTCP” ( [4], [20] ) folosibilă în aplicaţii de
comunicare, chiar şi de timp real, sub sistemul de operare MS-DOS. Dacă ar trebui să o
raportam la nivelul OSI, atunci trebuie spus că funcţionează la nivelele 3 şi oferă interfaţa
pentru funcţii specifice nivelului 4 (sockeţi, porturi, etc.)
Pentru funcţionarea stivei WATTCP trebuie mai întâi încărcat “packet driver”-ul
specific fiecărui chip-set de reţea. Acesta este furnizat de către producătorul NIC-ului
(Network Interface Card – placa de reţea) şi reprezintă interfaţa dintre stiva software şi
mediul fizic de transmitere a pachetelor de date(nivel 2 OSI simplificat). În aplicaţia de faţă,
“packet driver”-ul este conţinut în fisierul “pktdrv.com” şi este încărcat la pornirea hardware-
ului printr-un instrucţiunea “c:\pktdrv.com 0x60”, aflată în fisierul “autoexec.bat”.
Odată încărcat driverul, care instalează o întrerupere de DOS pentru lucrul cu placa de
reţea, utilizarea software-ului TCP/IP se face posibilă prin copierea a 7 fişiere
existe un fişier de configurare cu numele “Wattcp.cfg”. Acesta, scris în mod text, trebuie să
aibă următoarea formă:
print="Packet-driver incărcat…"
my_ip=194.156.176.99
netmask=255.255.254.0
nameserver=194.156.176.1
nameserver=149.97.167.134
nameserver=156.198.51.231
gateway=194.156.176.1
domainslist="topex.rdsnet.ro"
Ca un sprijin al folosirii stivei Wattcp în aplicaţia de faţă, trebuie spus că ea reprezintă
principalul mijloc al realizării comunicaţiilor în reţelele de tip IP pentru sistemele ce folosesc
DOS-ul ca sistem de operare şi, poate şi datorită distribuirii ei gratuite, este la baza unei
multitudini de aplicaţii utilitare de tip telnet, ssh, client ftp, client POP3, web browsing, etc.,
de asemenea accesibile gratuit.
Aplicaţiile de voce, indiferent pe ce suport de transport, sau sistem de operare în care
rulează sunt aplicaţii de timp real. O implementare secvenţială, cu un singur fir de execuţie
(single thread) nu este suficientă unor situaţii în care timpul reprezintă un factor esenţial în
buna lor funcţionare. De aceea am preferat folosirea unui kernel de timp real, numit (/COS II
(MicroController Operating System, versiunea 2). ( [3], [21] ).
(/COS II, evoluţie a lui (/COS, este un “sistem de operare” cu kernel de timp-real
destinat aplicaţiilor integrate. Cea mai mare parte a lui este scrisă în ANSI-C, iar anumite
componente, dorite cât mai puţine datorită dorinţei de portabilitate, sunt scrise în limbajul de
asamblare dedicat microprocesorului folosit.
(/COS II poate fi portat pe o mare varietate de procesoare, cu condiţia ca ele să
asigure “stack pointer” şi regiştrii CPU, care pot fi introduşi şi scoşi din stivă. De asemenea,
compilatorul C trebuie să permită scrierea de scrierea de porţiuni de cod în limbaj de
asamblare. (/COS II poate rula pe cele mai multe procesoare de 8, 16 32, sau 64 de biţi,
microprocesoare şi DSP-uri.
µ /COS II este o soluţie foarte scalabilă, această reflectându-se în posibilitatea de a
alege doar acele servicii care sunt necesare aplicaţiei proiectate, lucru care reduce volumul de
M ic r o C o n tr o lle r
S o ftw a r e T C P /IP
O p e ra tin g S y s te m
"W A TTC P "
v .2
P a c k e t D r iv e r
M S -D O S 6 .2 2 ( c :\p k td r v .c o m
0x60 )
P ro c e s a re C o m u n ic a r e
După ce a fost încărcat “packet driver”-ul, modulul hardware PC/104 este pregătit
pentru rularea aplicaţiei. Se lansează în execuţie executabilul rezultat în urma compilării
proiectului “rtp_ucos.prj”. Pentru dezvoltarea şi compilarea acestuia s-a folosit mediul
Borland C++ 3.1, iar codul sursă a fost scris în limbajul C++ cea mai mare parte a sa,
anumite fragmente fiind scrise în limbaj de asamblare 8086.
Fişierul “rtp_ucos.prj” se va încărca la deschiderea mediului de dezvoltare în
directorul ce conţine aplicaţia, iar el conţine fişierele care vor fi compilate, create legăturile,
rezultând fişierul executabil. Proiectul ce va fi compilat conţine următoarele:
Fişiere pentru funcţionarea µ /COS II-ului. [3].
Ucos_II.c – include la compilare codul sursă pentru asigurarea tuturor serviciilor
oferite de µ C/OS II(mailbox, semafoare, gestiunea task-urilor şi a timpului, etc.), servicii
care în funcţie de valorile atribuite variabilelor din fişierul de configurare “OS_cfg.h” sunt
sau nu incluse în aplicaţia dorită.
OS_Cpu_C.c – defineşte o funcţie de creare a stivei de lucru a fiecărui task şi funcţii
ce sunt apelate la crearea unui task, la ştergerea lui, la schimbarea de context, sau la fiecare
tick.
Pc.c – defineşte funcţii legate de interfaţa de afişare şi folosirea tastaturii, salvarea
contextului DOS la pornirea µ C/OS II-ului, restabilirea sistemului de operare la finalul
aplicaţiei µ C/OS, instalarea de noi vectori de întrerupere şi stabilirea frecvenţei de “tick”.
OS_Cpu_A.asm – scris în întregime în limbaj de asamblare, conţine funcţii privitoare
la punerea în funcţiune a task-ului cu prioritatea cea mai mare în momentul pornirii µ C/OS-
ului, efectuarea de “task switch”, servirea întreruperii de “tick”.
Wattcphg.lib – este compilat împreună cu celelalte fişiere ale proiectului şi realizează
interfaţa dintre funcţiile de bibliotecă ale stivei WATTCP şi “packet driver”, pentru
asigurarea suportului de comunicaţie în reţeaua IP. Este
IDMA. Toate cele 4 DSP-uri de pe placă sunt configurate pentru boot-area prin IDMA. În
secvenţa de boot-are, DSP-ul opreşte execuţia până când procesorul gazdă încarcă Program
Memory folosind portul IDMA. Execuţia programului începe în momentul în care, la sfârşitul
încărcării, este scrisă şi locaţia PM 0x0000.
Portul de IDMA (Internal DMA) ( [5] ) este un port paralel de intrare/ieşire, care
permite citirea/scrierea memoriei interne, mai puţin direct regiştrii interni, de către un
procesor gazdă. DSP-ul asigură 5 pini pentru controlul transferului prin IDMA.
Citirea/scrierea din/în memoria internă se face în 2 paşi: întâi se face înscrierea în
IDMA Control Register a adresei din memoria de date/program la/de la care se va realiza
transferul, iar apoi, prin folosirea pinilor de control se comandă scrierea sau citirea la/de la
adresa mai inainte încărcată.
Încărcarea programelor în DSP-uri se face apelând funcţia “dsp_install( )”, definită în
fişierul “2181.c”. Ea efectuează următoarele operaţii: resetează chipul şi dezactivează
întreruperile pentru a salva pointerul către funcţia dată ca argument la apelare. După
eliberarea semnalului reset şi activarea întreruperilor se apelează funcţia “load_prg( )” care
este descrisă în fişierul “exe2idma.c” şi care are ca argumente adresa unui port de ieşire
corespunzator DSP-ului în care se face încărcarea şi numele fişierului ce conţine programul
compilat, cu extensia “.dat”. După înscrierea prin portul de IDMA a anumitor linii din fişierul
respectiv în zona de memorie de program PM a DSP-ului (Program memory), nu toate având
semnificaţie utilă, este înscrisă apoi la adresa PM 0x0000 adresa de la care DSP-ul să înceapă
rularea programului.
Urmează operaţia de instalare a noilor întreruperi, efectuată de
“instalare_intreruperi( )”, care este descrisă în “Interrs.c”. Această funcţie, după ce apelează
alte 3 funcţii ce descriu în limbaj de asamblare rutina de execuţie a noilor întreruperi dorite
(întreruperea de DSP, de 2 ms şi int_arb), salvează vechii vectorii de întrerupere pentru a
putea fi restabiliţi la ieşirea din program şi instalează noile întreruperi pe IRQ 7, IRQ 5 şi
IRQ 15.
Dacă până acum s-au efectuat etapele de iniţializare, încărcare a programelor în DSP-
uri şi instalare a noilor întreruperi, generic spus punerea în funcţiune a cartelei, în cele ce
urmează are loc iniţializarea µ C/OS –ului.
µ C/OS II-ul este un kernel de timp-real care, deşi lucrează în MS-DOS, pe durata
funcţionării aplicaţiilor sale, salvează contextul acestuia, urmând ca la revenirea din aplicaţie
să fie restabilit.
El se constituie dintr-un programator de procese (task-uri), conform anumitor
priorităţi. Datorită scalabilităţii sale, permite includerea la compilare doar a anumitor servicii,
în funcţie de dorinţă utilizatorului. Aceasta se realizează prin setarea anumitor variabile în
fişierul de configurare “Ucos_cfg.h” [3] (numărul de task-uri dorite, prioritatea minimă,
includerea serviciilor de semafor, mailbox, facilitatea de creare de task-uri, de distrugere sau
suspendare a lor, de schimbare a priorităţilor, etc.).
Ca orice programator de procese, µ C/OS-ul la rândul lui are un IdleTask, un task pus
în execuţie atunci când nici un altul nu este în starea “ready to run” (“gata de execuţie”). În
cazul faţă, el se numeşte “OSTaskIdle( )” ( [3] ), este setat pe prioritatea minimă
(OS_LOWEST_PRIO) şi nu face altceva decât să incrementeze un contor de 32 de biţi,
OSIdleCtr, care este folosit de un alt task,OSTaskStat( ), la determinarea încărcării
procesorului. OSIdleTask nu poate fi niciodată şters de către o aplicaţie sotfware.
(C/OS II-ul conţine un task ce asigură statistici de-a lungul funcţionării. Numit
“OSTaskStat( )” ( [3] ), el este folosit dacă variabila OS_TASK_STAT_EN este setată pe
valoarea 1, în fişierul OS_Cfg.h. Acest task se execută la fiecare secundă şi determină
încărcarea procesorului, iar prioritatea sa este OS_LOWEST_PRIO-1.
Revenind la aplicaţia noastră, după etapa de iniţializare este apelată funcţia
“OSInit( )”, care are pe lângă rolul de a iniţializa funcţionarea µ C/OS II-ului, rolul de a crea
cele 2 task-uri mai sus descrise: OSTaskStat( ) şi OSTaskIdle( ).
Următorul pas este acela de salvare a contextului de lucru al sistemului de operare,
MS-DOS, prin apelarea “PC_DOSSaveReturn( )”, pentru a putea fi reinstalat la ieşirea din
aplicaţie, urmat de instalarea unui vector în tabela de întreruperi
încheie, punând în funcţiune kernelul (C/OS-ului, întreaga gestiune a proceselor fiind lăsată
în seama lui.
“TaskStart( )”-ul are ca primă sarcină dezactivarea întreruperilor pentru a instala
rutina de întrerupere pentru “clock tick” şi de a seta valoarea frecvenţei sale de apariţie la
OS_TICK_PER_SEC, valoare modificabilă în fişierul de configurare “Os_cfg.h”. Sunt
activate apoi întreruperile şi apelată OSStatInit( ), funcţia de punere în funcţiune a
TaskStat( ).
Din punctul de vedere al programatorului, un task este o buclă infinită care este pusă
în execuţie în funcţie de politica trasată ( prioritate, perioadă de suspendare, autosuspendare,
etc. ). El poate fi suspendat, se poate autosuspenda, i se poate schimba prioritatea, poate fi
şters, etc. În aplicaţia de faţă, TaskStart( ) are rolul de a crea task-urile de comunicare
(trimitere, recepţie de pachete, etc.), după care, partea sa repetitivă este constituită din
afişarea pe ecran a numărului de task-uri funcţionale, a numărului de schimbări de context ce
au loc în fiecare secundă, a procentului de încărcare a procesorului şi a verificării dacă nu s-a
manifestat dorinţa de oprire a aplicaţiei, ce se poate realiza prin apăsarea tastei “Esc”. După
îndeplinirea acestor sarcini, “TaskStart( )”-ul este suspendat o secundă, de către programator
datorită apelului “OSTimeDlyHMSH(0,0,1,0)”.
În situaţia opririi aplicaţiei, sunt efectuate toate operaţiile de revenire în starea iniţială
a sistemului. Acestea sunt închiderea tuturor socket-ilor deschişi de procesele de trimitere şi
recepţie de pachete IP( “RTPclose( )” ), restabilirea vechilor vectori de întrerupere
( “revenire_intreruperi_initiale( )” ), “dezinstalarea” celor 2 DSP-uri folosite
( “dsp_unistall( )” ) şi restabilirea contextului de lucru al MS-DOS, salvat la începutul
funcţionării µ C/OS-ului (“PC_DOSReturn( )”).
Înainte de a intra în secţiunea repetitivă, sunt create celelalte task-uri, prin apelul
funcţiei “initiere_comunicare( )”.
Task-urile vor fi create în funcţie de anumite variabile de configurare ce se găsesc în
fişierul “Ts_cfg.h”. De-a lungul dezvoltării aplicaţiei până în stadiul actual, s-au realizat teste
de transmisie şi recepţie de pachete de tip RTP cu 3 maşini pereche: o maşină aflată în
reţeaua IP locală, o alta în reţeaua ISP-ului (RDSnet) (IP: 193.231.233.156), iar cea de-a 3-a
din Internet (IP: 193.41.127.218), toate rulând un sistem de operare Linux. Din această cauză,
în fişierul mai sus amintit sunt definite 3 variabile, pentru fiecare adresă IP cu care se doreşte
comunicare. În funcţie de valorile lor ( 0/1 ), se crează sau nu câte o pereche de task-uri, de
pentru DSP-ul cu numărul dsp_no de pe placă pinul IACK\, ce indică transfer IDMA
complet. În cazul în care funcţia întoarce valoarea “0”, task-ul apelează
“OSTimeDlyHMSM(0,0,0,5)”, iar programatorul suspendă execuţia sa pentru 5 milisecunde.
La reprogramarea task-ului, acesta revine în starea de test şi, presupunând că procesorul
gazdă poate de această dată avea acces la memoria internă a DSP-ului prin portul de IDMA,
începe etapa de preluare de eşantioane. Prima măsură este aceea de a opri funcţionarea
programatorului de timp-real al task-urilor, pentru a evita o posibilă situaţie în care, în timpul
preluării eşantioanelor din memoria DSP-ului, task-ul de preluare să fie suspendat şi pus în
funcţiune altul mai prioritar, care să intervină în zona de interes şi căreia să-i schimbe
modificări, programatorul este repus în funcţiune, iar task-ul suspendat pentru 5ms,
după care este reluată partea sa repetitivă. În cazul în care între locaţia citită acum şi cea
anterior citită sunt modificări, înseamnă că DSP-ul a completat cele 160 de locaţii ale unui
buffer, iar ele pot fi preluate prin portul de IDMA în buffer-ul de recepţie a lor din “host”,
folosind funcţia “dsp_rdbloc( )”, căreia i se dau ca argumente de acestă dată adresa de început
a buffer-ului din DM ce se doreşte transferat corespunzător canalului de voce transmis,
numărul de citiri prin IDMA (160) şi “dsp_no”.
La sfârşitul transferului prin IDMA al eşantioanlelor de voce din DM, programatorul
µ C/OS-ului este deblocat şi repus în funcţiune de funcţia “OSSchedUnlock( )”. Pentru
transmiterea lor în reţeaua IP se apelează mai întâi funcţiile “initializare_packet_rtp( )” şi
“RTPpacket_data( )”. Prima dintre ele completează câmpurile headerului pachetului RTP
care va fi transmis, iar cea de-a doua completează câmpul de date al pachetului, după ce
înainte va fi păstrată doar partea mai puţin semnificativă a conţinutului locaţiilor de 16 biţi
transferate din memoria DM. Odată completate câmpurile structurii, pentru transmiterea
pachetului se apelează “sock_fastwrite( )”, funcţie specifică stivei WATTCP.
Înainte de a termina partea repetitivă a task-ului, este incrementat modulo 216 un
contor care va completa numărul de secvenţă al pachetului RTP următor ce va fi transmis,
după care task-ul este suspendat pentru 14 ms.
din ciclu “while”, odată cu terminarea preluării, acestea sunt transferate într-un buffer
cu 64 locaţii, reprezentate de structuri de genul:
typedef struct{
unsigned short indicator_locatie;
unsigned short seq_num;
char es_voce[160];
} LocatieBuffer;
Acest buffer “LocatieBuffer buffer[64];“ este folosit ca un buffer circular, în fiecare
locaţie memorându-se un indicator de ocupare, numărul de secvenţă al pachetului RTP în
care a fost primit blocul de eşantioane şi datele propriu-zise. El are un “pointer” de citire
(următoarea locaţie de unde va fi trimis la DSP-ul corespunzător un bloc de 160 de
eşantioane ) şi unul de scriere care reprezintă următoarea locaţie liberă în care se poate pune
un bloc, în funcţie şi de numărul de secvenţă al pachetului RTP din care provine, dar mai ales
de ordinea pachetelor primite.
Primul ciclu efectuat de tesk-ul “Task_recv_XXX( )” preia din buffer-ul de recepţie al
“sock_recv( )” pachetele primite, iniţializează buffer-ul circular, completează un număr de
locaţii egal cu numărul de pachete primite şi se autosuspendă pentru 80 ms.
Următoarele 3 parcurgeri ale ciclului au rolul de a prelua la rândul lor din acelaşi
buffer de recepţie pachetele primite şi completate noi locaţii din tabloul de structuri de tip
“LocatieBuffer”, după care task-ul se autosuspendă tot câte 80ms.
Mecanismul de completare a locaţiilor are, pe lângă rolul de a reface secvenţialitatea
pachetelor RTP primite, şi rolul de a permite reintegrarea în fluxul de date a pachetelor
întârziate. Buffer-ul va conţine blocurile de eşantioane, într-o strânsă legătură cu numărul de
secvenţă al pachetelor RTP în care au fost transportate. Astfel pachetele care au sosit înaintea
celor aşteptate, dar nu mai mult decăt o limită stabilită, sunt introduse în buffer. La fel se
întâmplă cu cele întârziate în cazul în care poziţia în care ar trebui introduse în bufferul
circular ar fi ulterioară pointerului de citire.
După cele 4 parcurgeri ale ciclului de lucru, parcurgeri în care nu s-a realizat altceva
decât completarea unor locaţii din buffer-ul circular, are loc procesul de iniţializare. El
urmăreşte să detecteze locaţia corespunzătoare numărului minim de secvenţă al unui pachet
RTP primit, care reprezintă începutul unei secvenţe de
Concluzii
La momentul apariţiei sale, VoIP a fost o tehnologie care pe toată lumea a încântat, a
atras atenţia tuturor proiectanţilor şi marilor producători de echipamente de telecom, dar mai
ales furnizorilor de servicii de telecomunicaţii, în general, şi telefonie în special. În condiţiile
în care Internet-ul şi era “e-commerce” sunt într-o nebănuit de vertiginoasă ascensiune, iar
reţelele de pachete de tip IP par că vor reprezenta suportul telecomunicaţiilor de “mâine”,
ideea de a transporta una din cele mai vechi şi încetăţenite modalităţi de comunicare între
oameni oferite de operatorii telecom folosind suportul reprezentat de reţelele de pachete a dat
mari speranţe tuturor celor interesaţi.
Tehnologia s-a lovit încă de la început de o ostilitate destul de mare din partea unora,
iar acest lucru s-a datorat în cea mai mare măsură nivelului uriaş de investiţii care au fost
realizate în reţeaua pentru telefonia clasică, bazată pe comutaţia de circuite. Un al doilea
motiv ar fi acela de “refuz” venit din partea utilizatorului obişnuit de telefon clasic, care era
destul de reticent în a se familiariza cu noua tehnologie.
Marii proiectanţi şi producători de echipamente au investit sume considerabile în
dezvoltarea de produse care să aibă la bază noua tehnologie. Ei au demarat proiecte ample,
folosind soluţii proprietare care să ajute la evoluţia rapidă a produselor. În tot acest cadru,
organismele internaţionale pentru standardizare au intervenit pentru aducerea la un numitor
comun a caracteristilor funcţionale.
Însă, odată început lucrul, s-a ajuns la concluzia că problemele de transport prezentate
în capitolul I, datorate suportului de comunicaţie, am numit aici reţeaua de pachete IP
(Intranet, MAN, WAN, Internet), sunt destul de serioase şi împiedică dezvolarea rapidă care
era anunţată.
Au apărut o mulţime de protocoale mulate pe cererile venite din partea transportului
de date de timp real, în general, şi de voce în particular, şi care au rezolvat într-o măsură mai
mare sau mai mică problemele. În ciuda lor, deşi la început se anunţa o mare revoluţie în
transportul serviciilor, s-a ajuns la concluzia că mai este destul de mult de lucru până la
obţinerea unor produse performante.
Una din cele mai mari probleme a fost realizarea intercomunicaţiei cu reţeaua PSTN
deja existentă, pe care, în nici un caz nu o poate înlocui. Pentru asta au fost create porţi de
transfer de la reţeaua H.323 la PSTN sau orice alt tip de reţea transportoare de voce.
“VoIPcard” face parte din entuziastmul reprezentat de VoIP. Ca şi în cazul altor
producători şi s-a confruntat cu rezolvarea problemelor specifice de care am tot vorbit pe
larg. “VoIP card” este un gateway şi reprezintă poarta de ieşire a vocii pentru transportul
peste o reţea de pachete IP. Dezvoltarea unui gateway de voce trebuie să aibă în vedere atât o
mulţime de probleme specifice celor 2 reţele între care realizează comunicaţia, cât şi să
respecte standardele de translaţie a formatelor diferite de date.
Procesul de dezvoltare a unui astfel de echipament este destul de îndelungat şi
necesită un anumit grad de experienţă.
Dezvoltarea unui gateway implică implementarea celor 4 module, care rulează atât în
procesorul gazdă, cât şi în DSP-uri. Aplicaţia prezentată în capitolul 4 a fost dezvoltată pe
parcursul unui semestru, iar pentru realizarea unei etape de test este necesară şi dezvoltarea
software-ului pentru rularea în DSP-uri. Timpul necesar s-a dovedit a fi insuficient şi
experienţa avută în proiectare destul de mică. Am încercat să-mi focalizez atenţia spre o
anumită porţiune, care să poată fi continuată ulterior, chiar şi de către altcineva care n-a
participat la proiectarea iniţială.
Rezultatul de până acum a fost prezentat pe larg în capitolele 3 şi 4, însă această a fost
doar temelia pentru dezvoltarea ulterioară. Aplicaţia a fost dezvoltată în urma unei munci de
documentare asupra componentelor folosite şi a tehnologiei VoIP. Materialele folosite pentru
aceasta sunt prezentate în bibliografie.
Cu speranţa aprecierii muncii depuse şi a prezentării generale efectuate, vom prezenta
în cele ce urmează o parte din codul sursă al aplicaţiei descrise în capitolul 4.
ANEXE
A
N
E
X
A
A
.
D
i
c
ţ
i
o
n
a
r
d
e
a
c
r
o
n
i
m
e
A
AAA Authentication Authorization and Accounting
AAL2 ATM Adaptation Layer type 2
B
BER Bit Error Rate
B-ISDN Broadband ISDN
BNC British Naval Connector
BRI Basic Rate Interface (2B+D)
BSC Base Station Controller
BSS Base Station Subsistem
BTS Base Transceiver Subsystem
C
CBR Constant Bit Rate
CEPT Conference Europeene des Administrations des Postes et des
Telecomunications
CERT Computer Emergency Response Team
CES Circuit Emulation Services
CHAP Challenge Handshake Authentication Protocol
CLI Command Line Interface
CLP Connectionless Protocol
CODEC Coder & Decoder
COP Connection-oriented Protocol
CPU Central Processing Unit
CRC Cyclic Redundancy Code
CSPDN Circuit Switched Public Data Network
CSU Channel Service Unit
D
DCE Data Communications Equipment
DES Digital Encryption Standard
DiffServ Differrentiated Services
DLC Data Layer Control
DNS Domain Name Server
DSU Data Service Unit
DTE Data Terminal Equipment
DTMF Dual Tone Multifrequency
DVB-T Digital Video Broadcasting
E
EN Enterprise Network
ETSI European Telecommunications Standards Institute
F
FAXoIP Fax over IP
FCS Frame Check Sequence
FDDI Fiber Distributed Data Interface
FDT Formal Description Technique
FIFO First In First Out
G
GSM Global System for Mobile
GSTN General Switched Telephone Network
GUI Graphical User Interface
H
HDLC High-level Data Link Control
HDSL High bit-rate Digital Subscriber Line
HTTP Hypertext Transfer Protocol (RFC2068)
K
KBPS KiloBytes Per Second
L
LAN Local Area Network
LANE LAN Emulation
LCP Link Control Protocol (a component from PPP)
LIFO Last In-First Out
LLC Logical Link Connection
LMI Local Management Interface
LSB Less Significant Bit
M
MAC 1. Medium Access Control 2. Message Authentication Code
MAN Metropolitan Area Network
MCU Multipoint Control Unit
MGCP Media Gateway Control Protocol
MHz MegaHertzs
MIB Management Information Base
O
OAM Operations, Administration and Maintenance
OMS Operation and Maintenance Subsystem
OSI Open Systems Interconnection
OUI Organizationally Unique Identifier
O&M Operations And Maintenance
P
PABX Private Automatic Branch eXchange
PC Personal Computer
PCM Pulse Code Modulation
PCTA Procesor Central de Tratare Apeluri
PDC Personal Digital Communication
PDCP Packet Data Convergence Protocol
PDH Plesiochronous Digital Hierarchy
PDN Packet Data Network
PDU Protocol Data Unit
PG Procesor de Grup
PID Process IDentifier
PLMN Public Land Mobile Network
POTS Plain Old Telephone Service
PRI Primary Rate Interface
PSPDN Packet Switched Public Data Network
PSTN Public Switched Telephone Network
PVC Permanent Virtual Circuit
Q
QoS Quality of Service
R
RAND RANDom number
RAS 1. Registration, Admisions, and Status; 2. Remote Access Server;
RSVP Resource Reservation Protocol
RTCP Real Time Control Protocol
RTP Real Time Protocol
RTSP Real Time Stream Protocol
RTT Round Trip Time
S
SAP 1. Session Announciament Protocol; 2. Services Access Point
SAR Segmentation & Reassembling
SCCP Signaling Connection Control Part (ITU-T Q.711-714)
SCN Switched Circuit Network
SCTP Stream Control Transmission Protocol
SDH Synchronous Digital Hierarchy
SDLC Synchronous Data Link Control
SGMP Simple Gateway Control Protocol
SID Security ID
SIM Subscriber Identity Module
SIP Session Initiation Protocol
SLIP Serial Line Internet Protocol
SMTP Simple Mail Transfer Protocol
SNA Serial Number Arithmetic (RFC 1982)
SNMP Simple Network Management Protocol
SOHO Small Office Home Office
SONET Synchronous Optical Network
SPID Service Profile IDentifier
SS7 Signaling System Number 7
SSH Secure SHell
SSL Secure Socket Layer
T
TCAP Transactional Capabilities Application Part
TCP Transmission Control Protocol
TDMA Time Division Multiple Access
TE Terminal Equipment
TMN Telecommunications Management Network
TOS Type Of Service
TTL Time To Live
TUP Telephone User Part
U
UA Unitate Abonaţi
UBR Unspecified Bit Rate
UDP User Datagram Protocol
UMTS Universal Mobile Telecommunication System
UNI User-Network Interface
URL Universal Resource Locator
UTD Unitate de Trunchi Digital
V
VCC Virtual Channel Connection
VLAN Virtual LAN
VoD Video on Demand
VoFR Voice over Frame Relay
VoIP Voice over IP
VON Voice On the Network
VPC Virtual Path Connection
VPN Virtual Private Network
VToA Voice Telephony over ATM
Includes.h
/************************** MASTER INCLUDE FILE
**************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <setjmp.h>
#include <tcp.h>
#include "Ts_Cfg.H"
#include "os_cpu.h"
#include "os_cfg.h"
#include "pc.h"
#include "ucos_ii.h"
OS_cfg.h
/****************************** uC/OS-II The Real-Time Kernel
***************
uC/OS-II CONFIGURATION
*********************************************************************
*******/
RTP_Ucos.h
#include <stdio.h>
#include <tcp.h>
Stacks.h
#include "os_cpu.h"
Targtype.h
#ifndef __TARGET_TYPES_H__
#define __TARGET_TYPES_H__
#endif
Ts_cfg.h
//variabile de configurare a task-urilor...
#define COMUNIC_INCREMENTAL 1
#define COMUNIC_ONIX 1
#define COMUNIC_FServ 1
#define TCP_TICK_ON_OFF 1
//prioritati task-uri
#define TASK_TICK_PRIO 7
#define TASK_RECV_INC_PRIO 1
#define TASK_RECV_ONIX_PRIO 2
#define TASK_RECV_FServ_PRIO 3
#define TASK_SEND_ONIX_PRIO 4
#define TASK_SEND_INC_PRIO 5
#define TASK_SEND_FServ_PRIO 6
#define ERR_CONECTARE -1
#define ERR_DESCH_FISIER -2
#define ERR_NO_TASKS -10
#define INIT_OK 99
2181.h
#include "dsptargt.h"
void dsp_isr(void);
void init_dsps(void);
DSP.h
#include <stdio.h>
#include <conio.h>
#include "2181.h"
#include "mat.h"
#define MAXDSP 4
DSPtargt.h
#include <dos.h>
#include "targtype.h"
Interrs.h
#include <conio.h>
#include <stdio.h>
#include "mat.h"
#include "2181.h"
#define ERR_INT_2MS -1
#define ERR_INT_ARG -2
#define ERR_INT_DSP -3
void instalare_intreruperi(void);
void revenire_intreruperi_initiale(void);
Tks_com.h
#include <stdio.h>
#include <tcp.h>
#include "ts_cfg.h"
#define DSP_0 0
#define DSP_1 1
#define DSP_2 2
#define DSP_3 3
//packet RTP
typedef struct {
unsigned char cc:4; // CSRC count
unsigned char extension:1; // header extension flag
unsigned char padding:1; // padding flag
unsigned char version:2; // protocol version, de obicei 2
unsigned char payloadtype:7; // payload type
unsigned char marker:1; // marker bit
unsigned short seqnum; // sequence number
unsigned long timestamp; // timestamp
unsigned long ssrc; // synchronization source
unsigned char data[RTP_MAXPACKETSIZE]; // date efective.
} RTPpacket;
typedef struct{
unsigned short indicator_locatie;
unsigned short seq_num;
char es_voce[160];
}LocatieBuffer;
int initiere_comunicare(void);
void RTPclose();
Rtp_UCOS.C
/******************************** uC/OS-II
********************************/
#include "includes.h"
#include "Tks_com.h"
#include "Rtp.h"
#include "Interrs.h"
#include "Dsp.h"
#include "Stacks.h"
#include "Dsptargt.h"
/******************************* VARIABILE
********************************/
OS_EVENT *RandomSem;
//initializare DSP-uri...
init_dsps();
//validare bufferi simetrici
asm{
mov dx, 0x5e0;
mov al, 0x5f;
out dx, al;
}
return 0;
}
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); // Install uC/OS-II's clock tick ISR
PC_SetTickRate(OS_TICKS_PER_SEC); // Reprogram tick rate
OS_EXIT_CRITICAL();
OSStatInit(); // Initialize uC/OS-II's statistics
initiere_comunicare();
PC_DispStr( 0, 23, "#Tasks : xxxxx CPU Usage: xxx #Task switch/sec: xxxxx ",
DISP_FGND_WHITE);
PC_DispStr(28, 24, "<-PRESS 'ESC' TO QUIT->", DISP_FGND_WHITE +
DISP_BLINK);
for (;;) {
sprintf(s, "%5d", OSTaskCtr); // Display #tasks running
PC_DispStr(17, 23, s, DISP_FGND_BLUE + DISP_BGND_CYAN);
sprintf(s, "%3d", OSCPUUsage); // Display CPU usage in %
OSCtxSwCtr = 0;
if (PC_GetKey(&key) == TRUE)
{ // See if key has been pressed
if (key == 0x1B)
{ // Yes, see if it's the ESCAPE key PC_DispStr(35, 15, "Ma opresc...",
DISP_FGND_BLUE + DISP_BGND_CYAN);
RTPclose();//inchiderea socketilor...
revenire_intreruperi_initiale();
//dezinstalarea celor 2 DSP-uri...
dsp_uninstall(dspno);
dsp_uninstall(dspno1);
OSTimeDlyHMSM( 0, 0, 0, 250 );
PC_DOSReturn(); // Return to DOS }
}
OSTimeDlyHMSM(0, 0, 1, 0); // Wait one second
}
}
/******************************** TASKS
************************************/
//Afiseaza in coltul din stanga-jos a ecranului ceasul curent...
void AfisareCeas_Task( void *data )
{
UBYTE err;
static char timp_curent[25];
data=data;
for(;;)
{
PC_GetDateTime(timp_curent); // Get and display date and time
PC_DispStr(0, 24, timp_curent, DISP_FGND_BLUE + DISP_BGND_CYAN);
OSTimeDly( OS_TICKS_PER_SEC);
}
}
2181.C
#include <stdio.h>
#include <conio.h>
#include "2181.h"
#include "mat.h"
#include "dsp.h"
FPTR fp[MAXDSP];
u_int16 far bb1[0x400],bb2[0x400];
u_int16 far bb1_[MAXDSP][0x400],bb2_[MAXDSP][0x400];
u_int16 bstart[MAXDSP],page[MAXDSP];
u_int16 flag[MAXDSP];
void trt_dsp0(u_int16 w)
{
flag[0]=1;
flag[2]=1;
#pragma argsused
} //trt_dsp0
void trt_dsp1(u_int16 w)
{
flag[1]=1;
flag[3]=1;
#pragma argsused
} //trt_dsp0
Exe2IDMA.C
#include <stdio.h>
#include "dsptargt.h"
state=0;
_w1=0x1800;
_w2=0x000F;
prg_file=fopen(fname,"r");
if(!prg_file)
{
IDMA_ADDR(port,0);
IDMA_WR(port,_w1);
IDMA_WR(port,_w2);
return 0;
} //endif
prg_len=0;
crt_addr=0;
while(fgets(line,80,prg_file))
{
switch(state){
case 0:
trt_state0:
if(line[0]!='@')
{
//unrecognized line
fputs(line,stderr);
break;
} //endif
if(line[1]=='P')
{
state=1;
break;
} //endif
if(line[1]=='D')
{
state=2;
break;
} //endif
break;
case 1:
if(!sscanf(line,"%04X",&addr))
{
state=0;
break;
} //endif
addr&=0x3fff;
if(!addr)
{
state=5;
break;
} //endif
IDMA_ADDR(port,addr);
crt_addr=addr;
state=3;
break;
case 2:
if(!sscanf(line,"%04X",&addr))
{
state=0;
break;
} //endif
addr&=0x3fff;
addr|=0x4000;
IDMA_ADDR(port,addr);
crt_addr=0;
state=4;
break;
case 3:
if(!sscanf(line,"%04X%02X",&w1,&w2)) goto trt_state0;
IDMA_WR(port,w1);
IDMA_WR(port,w2);
crt_addr++;
break;
case 4:
if(!sscanf(line,"%04X",&w1)) goto trt_state0;
IDMA_WR(port,w1);
break;
case 5:
if(!sscanf(line,"%04X%02X",&_w1,&_w2)) goto trt_state0;
IDMA_ADDR(port,1);
state=3;
break;
default:
state=0;
break;
} //endswitch
if(crt_addr>prg_len) prg_len=crt_addr;
line[0]=0;
} //endwhile
fclose(prg_file);
IDMA_ADDR(port,0);
IDMA_WR(port,_w1);
IDMA_WR(port,_w2);
return prg_len;
} //load_prg
Interrs.C
#include "mat.h"
#include "2181.h"
#define INT2ms
#define INT_arg
#define INT_dsp
void instalare_intreruperi();
void revenire_intreruperi_initiale();
asm{
mov dx,0x5F8;
mov al,0;
out dx,al;
}
flag2ms=1;
for(i=0;i<8;i++)
{
MATWR(CML,i<<5,xmsg[i]);
rmsg[i]=MATRD(DMEM,i<<5);
} //endfor i
//EOI
asm{
mov al,0x20;
//out 0xA0,al; //necesar pt IRQ8..IRQ15
out 0x20,al;
}
} //int2ms
asm{
mov dx,0x5F8;
mov al,0;
out dx,al;
}
flag_arb=1;
//EOI
asm{
mov al,0x20;
out 0xA0,al; //necesar pt IRQ8..IRQ15
out 0x20,al;
}
} //int_arb
void instalare_intreruperi()
{
#ifdef INT2ms
oldvect0d=getvect(0x0d);
setvect(0x0d, int2ms); //instaleaza intreruperea de 2ms pe INT5
asm{
cli;
}
outport( 0x21, inport( 0x21 ) & 0xDF ); //porneste interuperea
asm{
sti;
}
#endif
#ifdef INT_arg
oldvect0f=getvect(0x0f);
setvect( 0x0f, irqdsp); //instaleaza intreruperea de DSP pe INT7
asm{
cli;
}
outport( 0x21, inport(0x21)&0x7F ); //porneste interuperea
asm{
sti;
}
#endif
#ifdef INT_dsp
oldvect77=getvect(0x77);
setvect( 0x77, int_arb ); //instaleaza intreruperea int_arb pe INT15
asm{
cli;
}
outport( 0xA1, inport(0xA1) & 0x7F ); //porneste interuperea
asm{
sti;
}
#endif
} //instalare_intreruperi
void revenire_intreruperi_initiale()
{
#ifdef INT2ms
outport( 0xA1, inport(0xA1)|0x80 );
setvect( 0x77, oldvect77 );
#endif
#ifdef INT_arg
outport( 0x21, inport(0x21)|0x80 );
setvect( 0x0F, oldvect0f );
#endif
#ifdef INT_dsp
outport( 0x21, inport(0x21)|0x20 );
setvect( 0x0D, oldvect0d );
#endif
}
Ucos_II.C
#define OS_GLOBALS
#include "includes.h"
Tks_com.C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <time.h>
#include <tcp.h>
#include "Tks_com.h"
#include "Ts_cfg.h"
#include "os_cpu.h"
#include "os_cfg.h"
#include "ucos_ii.h"
#include "pc.h"
#include "RTP_Ucos.h"
#include "Stacks.h"
#include "Dsp.h"
#include "Rtp.h"
char timp_curent[25];
//stacks
OS_STK TaskStk_tcpTick[2048];
OS_STK TaskStk_send_FServ[TASK_STK_SIZE];
OS_STK TaskStk_recv_FServ[TASK_STK_SIZE];
OS_STK TaskStk_send_INC[TASK_STK_SIZE];
OS_STK TaskStk_recv_INC[TASK_STK_SIZE];
OS_STK TaskStk_send_ONIX[TASK_STK_SIZE];
OS_STK TaskStk_recv_ONIX[TASK_STK_SIZE];
pck->seqnum=htons( seq_num );
pck->timestamp=htonl( timestamp );
pck->ssrc=htonl( 0 );
}
poz=0;
while(poz<nr_pckt)
{
minim=pck_recep[poz]->seqnum;
for(cnt=poz;cnt<nr_pckt;cnt++){
if(minim>pck_recep[cnt]->seqnum)
{
minim=pck_recep[cnt]->seqnum;
pck_temp=pck_recep[poz];
pck_recep[poz]=pck_recep[cnt];
pck_recep[cnt]=pck_temp;
}
}
poz++;
}
return minim;
}
i+=1;
}
printf("Sursa nu poate fi initializata !\n");
OSTimeDly(10);
return NO_INIT;
}
init_seq(s, pck[i]->seqnum);
return SEQ_INIT_OK;
}
data=data;
randomize();
//initializarea random a numarului de secventa si timestamp-ului
seq_num=random( 0x10000 );
time_stamp=random( 0x10000 );
for(;;)
{
while( poll(DSP_0) ) OSTimeDlyHMSM(0,0,0,5);
OSSchedLock();//suspenda functionarea programatorului...
indic_buffer_citire_anterioara=indic_buffer_citire;
OSSchedUnlock();//repune in functiune programatorul..
lun_pack=12+160;
RTPpacket packete_recept[10];
data=data;
gasit=0;indic_loc=0;
pointer_scriere=10;
nr_rulari=0;
for(;;)
{
cnt=0;
while( sock_recv( &RTPsocket_inc, &packete_recept[cnt] ,sizeof( RTPpacket ), 0 )
>0 )
{
fprintf( fisier_inc, "Primit \tsecv %d\n", ntohs(packete_recept[cnt].seqnum) );
cnt+=1;
}
if(cnt>0) {
if( nr_rulari==0) {
ordonare_packete_recept(packete_recept, cnt);
completare_locatieBuffer(&packete_recept[0], &buffer[pointer_scriere]);
pointer_scriere+=1;
seqnum_exp=packete_recept[0].seqnum;
for(i=1;i<cnt;i++)
{
dif_seqnum=(packete_recept[i].seqnum-seqnum_exp);
if(dif_seqnum>0)
{
if (dif_seqnum==1)
{
pointer_scriere+=1;
seqnum_exp+=1;
goto completare0;
}
if(dif_seqnum<MAX_DROPOUT)
{
completare0:
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
} //dif_seqnum>0...
else //dif_seqnum<0...pachete intarziate
{
if( (-10)<dif_seqnum<0 )
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
}//for
nr_rulari+=1;
OSTimeDly(8);//suspenda pe 8 ticks
}//nr_rulari=0...
if(nr_rulari<4)
{
for(i=0;i<cnt;i++)
{
dif_seqnum=(packete_recept[i].seqnum-seqnum_exp);
if(dif_seqnum>0)
{
if (dif_seqnum==1)
{
pointer_scriere+=1;
seqnum_exp+=1;
goto completare;
}
if(dif_seqnum<MAX_DROPOUT)
completare:
{
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
}//dif_seqnum>0...
else //dif_seqnum<0 pachete intarziate...
{
completare_locatieBuffer(&packete_recept[i], &buffer[pointer_scriere+dif_seqnum]);
}
}//for
nr_rulari+=1;
OSTimeDly(8);//suspenda pe 8 ticks
}//nr_rulari<4
}
if(gasit==0) indic_loc=10;
pointer_citire=indic_loc;
while(nr_pcks_consec<MIN_SEQ)
{
if(buffer[indic_loc+1].indicator_locatie==1)
{
nr_pcks_consec+=1;
indic_loc+=1;
pointer_citire=indic_loc;
}
else//detectie gaura in secventa
{
nr_pcks_consec=0;
for(i=0;;i++)
if(buffer[indic_loc+i].indicator_locatie==1)
{
indic_loc+=i;
pointer_citire=indic_loc;
break;
}
}
}//while... detectat secv de MIN_SEQ pcks...
goto trs_pkt;
}//initializare la a 4-a rulare...
trs_pkt: //transmitere bloc 160 esantioane al DSP
if(pointer_scriere<=pointer_citire)
{
while(poll(dsp_0)) OSTimeDlyHMSM(0,0,0,5);
OSSchedLock();
dsp_wrbloc(dsp_0, &buffer[pointer_scriere], 160, 0x5400);
OSSchedUnlock();
OSTimeDlyHMSH(0,0,0,17);
}
else //pointer citire ajunge din urma pointer scriere
{
dsp_wrbloc(dsp_0, &buffer_liniste, 160, 0x5400);
}
}//if cnt=0...
else OSTimeDly( 4 );//nu s-au primit packete...
}
data=data;
randomize();
seq_num=random( 0x10000 );
time_stamp=random( 0x10000 );
for(;;)
{
while( poll(DSP_0) ) OSTimeDlyHMSM(0,0,0,5);
OSSchedLock();//suspenda functionarea programatorului...
indic_buffer_citire_anterioara=indic_buffer_citire;
OSSchedUnlock();//repune in functiune programatorul..
lun_pack=12+160;
short i,j,k;
short dif_seqnum, seqnum_exp;
short nr_pcks_consec, indic_loc, gasit;
RTPpacket packete_recept[10];
data=data;
gasit=0;indic_loc=0;
pointer_scriere=10;
nr_rulari=0;
for(;;)
{
cnt=0;
while( sock_recv( &RTPsocket_inc, &packete_recept[cnt] ,sizeof( RTPpacket ), 0 )
>0 )
{
fprintf( fisier_inc, "Primit \tsecv %d\n", ntohs(packete_recept[cnt].seqnum) );
cnt+=1;
}
if(cnt>0) {
if( nr_rulari==0) {
ordonare_packete_recept(packete_recept, cnt);
completare_locatieBuffer(&packete_recept[0], &buffer[pointer_scriere]);
pointer_scriere+=1;
seqnum_exp=packete_recept[0].seqnum;
for(i=1;i<cnt;i++)
{
dif_seqnum=(packete_recept[i].seqnum-seqnum_exp);
if(dif_seqnum>0)
{
if (dif_seqnum==1)
{
pointer_scriere+=1;
seqnum_exp+=1;
goto completare0;
}
if(dif_seqnum<MAX_DROPOUT)
{
completare0:
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
} //dif_seqnum>0...
else //dif_seqnum<0...pachete intarziate
{
if( (-10)<dif_seqnum<0 )
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
}//for
nr_rulari+=1;
OSTimeDly(8);//suspenda pe 8 ticks
}//nr_rulari=0...
if(nr_rulari<4)
{
for(i=0;i<cnt;i++)
{
dif_seqnum=(packete_recept[i].seqnum-seqnum_exp);
if(dif_seqnum>0)
{
if (dif_seqnum==1)
{
pointer_scriere+=1;
seqnum_exp+=1;
goto completare;
}
if(dif_seqnum<MAX_DROPOUT)
completare:
{
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
}//dif_seqnum>0...
else //dif_seqnum<0 pachete intarziate...
{
completare_locatieBuffer(&packete_recept[i], &buffer[pointer_scriere+dif_seqnum]);
}
}//for
nr_rulari+=1;
OSTimeDly(8);//suspenda pe 8 ticks
}//nr_rulari<4
if(gasit==0) indic_loc=10;
pointer_citire=indic_loc;
while(nr_pcks_consec<MIN_SEQ)
{
if(buffer[indic_loc+1].indicator_locatie==1)
{
nr_pcks_consec+=1;
indic_loc+=1;
pointer_citire=indic_loc;
}
else//detectie gaura in secventa
{
nr_pcks_consec=0;
for(i=0;;i++)
if(buffer[indic_loc+i].indicator_locatie==1)
{
indic_loc+=i;
pointer_citire=indic_loc;
break;
}
}
}//while... detectat secv de MIN_SEQ pcks...
goto trs_pkt;
}//initializare la a 4-a rulare...
}
else //pointer citire ajunge din urma pointer scriere
{
dsp_wrbloc(dsp_0, &buffer_liniste, 160, 0x5C00);
}
}//if cnt=0...
else OSTimeDly( 4 );//nu s-au primit packete...
}
}
data=data;
randomize();
//initializarea random a numarului de secventa si timestamp-ului
seq_num=random( 0x10000 );
time_stamp=random( 0x10000 );
for(;;)
{
while( poll(DSP_1) ) OSTimeDlyHMSM(0,0,0,5);
OSSchedLock();//suspenda functionarea programatorului...
indic_buffer_citire_anterioara=indic_buffer_citire;
OSSchedUnlock();//repune in functiune programatorul..
lun_pack=12+160;
RTPpacket packete_recept[10];
data=data;
gasit=0;indic_loc=0;
pointer_scriere=10;
nr_rulari=0;
for(;;)
{
cnt=0;
while( sock_recv( &RTPsocket_inc, &packete_recept[cnt] ,sizeof( RTPpacket ), 0 )
>0 )
{
fprintf( fisier_inc, "Primit \tsecv %d\n", ntohs(packete_recept[cnt].seqnum) );
cnt+=1;
}
if(cnt>0) {
if( nr_rulari==0) {
ordonare_packete_recept(packete_recept, cnt);
completare_locatieBuffer(&packete_recept[0],\ &buffer[pointer_scriere]);
pointer_scriere+=1;
seqnum_exp=packete_recept[0].seqnum;
for(i=1;i<cnt;i++)
{
dif_seqnum=(packete_recept[i].seqnum-seqnum_exp);
if(dif_seqnum>0)
{
if (dif_seqnum==1)
{
pointer_scriere+=1;
seqnum_exp+=1;
goto completare0;
}
if(dif_seqnum<MAX_DROPOUT)
{
completare0:
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
} //dif_seqnum>0...
else //dif_seqnum<0...pachete intarziate
{
if( (-10)<dif_seqnum<0 )
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
}//for
nr_rulari+=1;
OSTimeDly(8);//suspenda pe 8 ticks
}//nr_rulari=0...
if(nr_rulari<4)
{
for(i=0;i<cnt;i++)
{
dif_seqnum=(packete_recept[i].seqnum-seqnum_exp);
if(dif_seqnum>0)
{
if (dif_seqnum==1)
{
pointer_scriere+=1;
seqnum_exp+=1;
goto completare;
}
if(dif_seqnum<MAX_DROPOUT)
completare:
{
completare_locatieBuffer(&packete_recept[i],\
&buffer[pointer_scriere+dif_seqnum]);
}
}//dif_seqnum>0...
else //dif_seqnum<0 pachete intarziate...
{
completare_locatieBuffer(&packete_recept[i], &buffer[pointer_scriere+dif_seqnum]);
}
}//for
nr_rulari+=1;
OSTimeDly(8);//suspenda pe 8 ticks
}//nr_rulari<4
pointer_citire=indic_loc;
while(nr_pcks_consec<MIN_SEQ)
{
if(buffer[indic_loc+1].indicator_locatie==1)
{
nr_pcks_consec+=1;
indic_loc+=1;
pointer_citire=indic_loc;
}
else//detectie gaura in secventa
{
nr_pcks_consec=0;
for(i=0;;i++)
if(buffer[indic_loc+i].indicator_locatie==1)
{
indic_loc+=i;
pointer_citire=indic_loc;
break;
}
}
}//while... detectat secv de MIN_SEQ pcks...
goto trs_pkt;
}//initializare la a 4-a rulare...
int initiere_comunicare(void)
{
if( COMUNIC_INCREMENTAL ){
PC_GetDateTime( timp_curent );
fisier_inc = fopen( "rez_incr.txt", "wt" );
if( !fisier_inc )
{
printf("Nu s-a putut deschide fisierul 'rez_inc.txt' pentru salvarea rezultatelor...\n");
goto com_onix;
}
fprintf(fisier_inc,"Fisier deschis cu succes...la ora %s\n", timp_curent);
rtp_ret_inc=RTPinit( LOCALIP,REMOTEIP_INC, RTP_PORT_INC,
RTP_LOCALPORT_INC, &RTPsocket_inc, buf_adresa_inc, fisier_inc );
fprintf( fisier_inc, "RTPinit=%d\nLet's begin...\n", rtp_ret_inc);
com_onix:
if( COMUNIC_ONIX ){
PC_GetDateTime( timp_curent );
fisier_onix = fopen( "rez_onix.txt", "wt" );
if( !fisier_onix )
{
printf("Nu s-a putut deschide fisierul 'rez_onix.txt' pentru salvarea rezultatelor...\n");
goto com_FServ;
}
fprintf(fisier_onix,"Fisier deschis cu succes...la ora %s\n", timp_curent);
rtp_ret_onix=RTPinit( LOCALIP,REMOTEIP_ONIX, RTP_PORT_ONIX,
RTP_LOCALPORT_ONIX, &RTPsocket_onix, buf_adresa_onix, fisier_onix );
fprintf( fisier_onix, "RTPinit=%d\nLet's begin...\n", rtp_ret_onix);
fprintf(fisier_onix,"Sock_recv_init %d\tBuffer %d\tRTPpacket_size %d\n",\
sock_recv_init( &RTPsocket_onix, buf_onix, sizeof( buf_onix ) ), sizeof( buf_onix ),
sizeof( RTPpacket ) );
OSTaskCreate(Task_recv_ONIX, (void *)0, (void
*)&TaskStk_recv_ONIX[TASK_STK_SIZE - 1], TASK_RECV_ONIX_PRIO );
OSTaskCreate(Task_send_ONIX, (void *)0, (void
*)&TaskStk_send_ONIX[TASK_STK_SIZE - 1], TASK_SEND_ONIX_PRIO );
}
else
{
printf("Nu s-a dorit comunicatie cu Onix...\n");
goto com_FServ;
}
com_FServ:
if( COMUNIC_FServ ){
PC_GetDateTime( timp_curent );
fisier_FServ = fopen( "rez_FServ.txt", "wt" );
if( !fisier_FServ )
{
printf("Nu s-a putut deschide fisierul 'rez_FServ.txt' pentru salvarea rezultatelor...\n");
goto tcp_tick;
}
fprintf(fisier_FServ,"Fisier deschis cu succes...la ora %s\n", timp_curent);
rtp_ret_FServ=RTPinit( LOCALIP,REMOTEIP_FServ, RTP_PORT_FServ,
RTP_LOCALPORT_FServ,&RTPsocket_FServ, buf_adresa_FServ, fisier_FServ );
fprintf( fisier_FServ, "RTPinit=%d\nLet's begin...\n", rtp_ret_FServ);
fprintf(fisier_FServ, "Sock_recv_init %d\tBuffer %d\tRTPpacket_size %d\n",\
sock_recv_init( &RTPsocket_FServ, buf_FServ, sizeof(buf_FServ) ),
sizeof(buf_FServ), sizeof(RTPpacket) );
OSTaskCreate(Task_recv_FServ, (void *)0, (void
*)&TaskStk_recv_FServ[TASK_STK_SIZE - 1], TASK_RECV_FServ_PRIO );
OSTaskCreate(Task_send_FServ, (void *)0, (void
*)&TaskStk_send_FServ[TASK_STK_SIZE - 1], TASK_SEND_FServ_PRIO );
}
else
{
printf("Nu se doreste comunicatie de nici un fel...\n");
tcp_tick:
if(TCP_TICK_ON_OFF)
return INIT_OK;
}
void RTPclose(void)
{
sock_close(&RTPsocket_inc);
sock_close(&RTPsocket_onix);
sock_close(&RTPsocket_FServ);
}