Upload
vukiet
View
229
Download
1
Embed Size (px)
Citation preview
UNIVERZITET U NOVOM SADU
FAKULTET TEHNIČKIH NAUKA
UNIVERZITET U NOVOM SADU
FAKULTET TEHNIČKIH NAUKA
NOVI SAD
Departman za računarstvo i automatiku
Odsek za računarsku tehniku i računarske komunikacije
Diplomski – Master rad
Кandidat: Milovan Vidović
Broj indeksa: 11083
Тema rada: Jedno rešenje TCP mrežnog protokola za Texas Instruments DSP procesore tipa C6000
Мentor rada: prof.dr. Nikola Teslić
Novi Sad, jul 2009.
UNIVERZITET U NOVOM SADU FAKULTET TEHNIČKIH NAUKА
21000 NOVISAD, Trg Dositeja Obradovića 6
КLjUČNA DOKUMENTACIJSKA INFORMACIJА
Redni broj, RBR:
Identifikacioni broj, IBR:
Tip dokumentacije, TD: Мonografska dokumentacija
Тip zapisa, ТZ: Текstualni štampani materijal
Vrsta rada, VR: Diplomski Master rad
Аutor, AU: Milovan Vidović
Мentor, MN: Prof. Dr. Nikola Teslić
Naslov rada, NR: Jedno rešenje TCP mrežnog protokola za Texas Instruments DSP procesore tipa C6000
Јеzik publikacije, ЈP: Srpski / Latinica
Јеzik izvoda, ЈI: Srpski
Zemlja publikovanja, ZP: Republika Srbija
Uže geografsko područje, UGP: Vojvodina
Godina, ГО: 2009
Izdavač, IZ: Autorski reprint
Мesto I adresa, МА: Novi Sad, Trg dositeja Obradovića 6
Fizički opis rada, FО: (poglavlja/strana)
Naučna oblast, NO: Elektrotehnika i računarstvo
Naučna disciplina, ND: Računarska tehnika
Predmetna odrednica/Kljucne reči, PO:
UDK
Čuva se, ČU: U biblioteci Fakulteta Tehničkih Nauka, Novi Sad
Važna napomena, VN:
Izvod, IZ:
Datum prihvatanja teme, DP: 24.06.2009
Datum odbrane, DO: 17.07.2009
Članovi komisije, КО: Predsednik: dr. Katona Mihajlo
Član: dr. Nebojša Pjevalica Потпис ментора
Član, mentor: prof.dr. Nikola Teslić
UNIVERSITY OF NOVI SAD FACULTY OF TECHNICAL SCIENCES
21000 NOVI SAD, Trg Dositeja Obradovića 6
KEY WORDS DOCUMENTATION
Accession number, ANO:
Identification number, INO:
Document type, DT: Monographic publication
Type of record, TR: Textual printed material
Contents code, CC: Master Thesis
Author, AU: Milovan Vidovic
Mentor, MN: PhD Nikola Teslić
Title, TI: One solution of TCP network protocol for Texas Instruments DSP processors series C6000
Language of text, LT: Serbian
Language of abstract, LA: Serbian
Country of publication, CP: Republic of Serbia
Locality of publication, LP: Vojvodina
Publication year, PY: 2009
Publisher, PB: Author’s reprint
Publication place, PP: Novi Sad, Dositeja Obradovica sq. 6
Physical description, PD: (chapters/pages/ref./tables/pictures/graphs/appendixes)
Scientific field, SF: Electrical Engineering
Scientific discipline, SD: Computer Engineering, Engineering of Computer Based Systems
Subject/Key words, S/KW:
UC
Holding data, HD: The Library of Faculty of Technical Sciences, Novi Sad, Serbia
Note, N:
Abstract, AB:
Accepted by the Scientific Board on, ASB: 24.06.2009
Defended on, DE: 17.07.2009
Defended Board, DB: President: PhD. Mihajlo Katona
Member: PhD. Nebojša Pjevalica Menthor's sign
Member, Mentor: PhD. Nikola Teslić
1
Sadržaj
Skraćenice .................................................................................................................................. 2
1 Uvod ................................................................................................................................... 4
2 Opis platforme i razvojnog okruženja ................................................................................ 5
2.1 Opis fizičke arhitekture ............................................................................................... 5
2.1.1 Razvojna ploča TMS320C6455 DSK ................................................................. 5
2.1.2 Procesor TMS 320C6455 ................................................................................... 7
2.2 Programski paketi ........................................................................................................ 9
2.2.1 Programski paket Code Composer Studio .......................................................... 9
2.2.2 Operativni sistem DSP/BIOS ........................................................................... 10
3 Metodologija izrade .......................................................................................................... 11
3.1 Više protokola ........................................................................................................... 11
3.5 Dve granice u TCP/IP modelu .................................................................................. 14
4 Opis rešenja ...................................................................................................................... 28
4.1 BSD programska podrška.......................................................................................... 28
4.3.1 S-funkcija bloka ............................................................................................... 38
4.3.2 Simulink blok ................................................................................................... 39
4.3.3 TLC skripta ...................................................................................................... 40
4.4 Skaler slike (Resizer) ................................................................................................ 43
4.4.1 S-funkcija bloka ............................................................................................... 43
4.4.2 Simulink model ................................................................................................ 44
4.4.3 TLC skripta ...................................................................................................... 45
4.5 H3A blok ................................................................................................................... 47
4.5.1 S-funkcija bloka ............................................................................................... 48
4.5.2 Model bloka ...................................................................................................... 48
4.5.3 TLC skripta ...................................................................................................... 51
2
4.6 Histogram blok .......................................................................................................... 53
4.6.1 S-funkcija bloka ............................................................................................... 54
4.6.2 Model bloka ...................................................................................................... 54
4.6.3 TLC skripta ...................................................................................................... 55
5 Ispitivanje ......................................................................................................................... 58
5.1 Ispitivanje CMOS senzor bloka ................................................................................ 59
5.2 Ispitivanje skalera slike ............................................................................................. 61
5.3 Ispitivanje H3A bloka ............................................................................................... 61
5.4 Ispitivanje histogram bloka ....................................................................................... 62
6 Zaključak .......................................................................................................................... 63
7 Literatura .......................................................................................................................... 64
8 Dodatak ............................................................................................................................. 65
8.1 Podizanje sistema iz NAND memorije ..................................................................... 65
8.2 Primer modela za prenosa slike preko LAN-a ......................................................... 66
Skraćenice
CCD - Charge-Coupled Device
CCS - Code Composer Studio
CMOS - Complementary Metal–Oxide Semiconductor
CSL - Chip Support Library
DDR - Double Data Rate
DAC - Digital to Analog Converter
DRAM - Dynamic RAM
DSP - Digital Signal Processor
EMIF - External Memory Interface
EPROM - Erasable Programmable ROM
EVM - Evaluation module
I2C - Inter-Integrated Circuit
IDE - Integrated Development Enviroment
ISRAM - Internal SRAM, Interna statička RAM memorija (unutar DSP)
JTAG - Joint Test Action Group
LAN - Local Area Network
LED - Light Emitting Diode
NTSC - National Television System(s) Committee
OSD - On Screen Display
PAL - Phase Alternation Line
PC - Personal Computer
PCI - Periferal Component Interconect
PCM - Pulse Code Modulation
PWM - Pulse Width Modulation
RAM - Random Access Memory
RGB - Red-Green-Blue output
ROM - Read-Only Memory
SRAM - Static Random Access Memory
TI - Texas Instruments
4
1 Uvod
Sa porastom upotrebe računara raste potreba i korišćenje digitalne obrade signala.
Digitalna obrada signala (DSP) je nauka koja se bavi signalima u digitalnoj reprezentaciji i
metodima njihove obrade. Algoritmi koji se koriste kod digitalne obrade signala se često
implementiraju na specijalizovanim mikroprocesorima koji se zovu “procesori za digitalnu
obradu signala” (takođe DSP). Kod njih se obrada signala izvršava u realnom vremenu.
Programiranjem DSP procesora u asembleru je najpribližnije mašinskom jeziku, ali
mane takvog programiranja su loša čitljivost, kompleksnost koda i nemogućnost
konvertovanja na drugu procesorsku platformu. Zbog toga se koriste viši programski jezici
kao što je C programski jezik. Pisanje u višem programskom jeziku za DSP procesore
donekle je oslobođeno vođenje računa o svakom registru i toku podataka ali još uvek je
potrebno poznavanje platforme zbog specifičnih načina rada i korišćenja resursa.
Za pisanje programske podrške za određenu platformu potrebno je poznavati
podržani programski jezik i arhitekturu platforme.
Zadatak ovog projekta je realizacija transportnog servisa pouzdanog toka podataka
(TCP) , na Texas Instruments DSP C6000 platformi procesora . Pored protokola potrebno je
realizovati i korisničku programsku spregu, po uzoru na BSD socket API (Berkeley socket
aplication programming interface). Protokol treba da poseduje i mehanizme poboljšanja
performansi prenosa podataka kao sto su klizni prozori, kontrole zagušenja itd.
5
2 Opis platforme i razvojnog okruženja
2.1 Opis fizičke arhitekture
2.1.1 Razvojna ploča TMS320C6455 DSK
Razvojna platforma TMS320C6455 DSK samostalna razvojna platforma, koja omogućava
korisnicima razvoj i ispitivanje aplikacija za TI (eng.Texas Instruments) C64xx DSP familiju
procesora. Razvojna ploča takođe služi i kao referentni hardverski dizajn za TMS320C6455
DSP. Šeme, logičke jednačine i aplikacione stavke omogućavaju lakši hardverski razvoj i
time utiču na smanjenje vremena izlaska uređaja na tržište (eng. TTM Time To Market ) .
Slika 1 – Izgled DM6437 EVM ploče
Glavni elementi koje ploča sadrži su:
• Texas Instruments TMS320C6455 procesor koji radi na frekvenciji 1 Ghz.
• AIC23 stereo kodek
• Softverska konfiguracija ploče kroz registre implemenetirane unutar CPLD-a
• 128 MB DDR2 DRAM memorije
• 4 MB spolja ne promeljive fleš memorije
• I2C sprega
• 10/100 MBS mrežna sprega
• Podesive opcije za podizanje (eng. Boot ) sistema
• Ugrađena JTAG sprega
6
• 4 LED i 4 preklopnika za potrebe korisnika
• Napajanje (+5V)
• Priključci za dodatne kartice i proširivanje mogućnosti
Slika 2 – Dijagram TMS320C6455 EVM ploče
DSP processor koji se nalazi na C6455 DSK razvojnoj ploči je sa periferijom spregnut
preko 64’bitne magistrale EMIFA (engl. External Memory Interface). CPLD i konektor za
dodatnu karticu su takođe vezani za EMIFA magistralu. DDR2 memorija poseduje zasebnu
magistralu za vezu sa procesorom. AIC23 kodek omogućava procesoru da šalje i prima
analogne signale. I2C magistrala se koristi za kontrolu kodeka i periferije dok se MCBSP
(engl. Mullti Chanel Buffered Serial Port ) koristi za podatke. Ploča poseduje četiri analogna
priključka od 3.5mm koji predsavljaju linijski ulaz i ulaz za mikrofon, kao i linijski izlaz i
izlaz za slušalice. Aktivni ulaz može biti bilo mikrofon bilo linijski ulaz u zavisnosti od
selekcije na kodeku. Oba izlaza su u svakom trenutku aktivna sa raylikom što izlaz na
slušalicama može biti promenljivog pojačanja. MCBSP magistrale mogu biti prerutirane na
periferijski konektor programski. CPLD (engl. Complex Programmable Logic Device)
implementira logiku koja omogućava povezivanje komponenti na ploči. CPLD poseduje
korisničku spregu preko registara čijim pisanjem i čitanjem se vrši konfiguracija ploče. Fleš
memorija je mapirana u CE3 prostor. Razvojna ploča poseduje 10/100 Mb mrežni
priključak.Takođe na ploči postoje četiri LE (engl. Light Emitted) diode i četiri DIP (engl.
Dual in Package) prekidača koji predstavljaju prost način interakcije sa korisnikom. I
diodama i prekidačima se pristupa čitanjem ili pisanjem CPLD registara.
7
Za napajanje se koristi spoljni izvor od 5V. Naponski regulatori na ploči omogućavaju
1.2 V za jezgro procesora, 1.8 V za DDR memoriju. Ploča se održavau reset stanju dok se ne
obezbede potrebni naponski nivoi. Code Composer komunicira sa razvojnom pločom preko
JTAG USB emulatora. Takodje može se koristiti i eksterni JTAG emulator koji se sa pločom
povezuje preko 60-pinskiog ili 14-pinskog konektora.
2.1.2 Procesor TMS 320C6455
Sam procesor serije TMS320C6455 pripada TMS320C64x+ DSP generaciji procesora
najviših performansi u nepokretnom zarezu.
Slika 3 – Funkcionalni blok dijagram C6455 procesora
8
C6455 pripada trećoj generaciji procesora visokih performansi sa VLIW(engl. Very
Long Instruction Word) arhitekturom razvijenom od strane TI (engl. Texas Instruments), i
kao takav predstavlja odličan izbor za aplikacije sa video obadom, u telekomunikacijam,
bežičnim vezama itd. Baziran na 90 nm tehnilogiji izrade i sa mogučnostima sa preko 9600
milona instrukcija u sekundi pri taktu od 1.2 GHz, omogućava programska rešenja visokih
performansi.
C6455 DSP koristi osam funkcionalnih jedinica, dve registarske datoteke, i dva toka
podataka. Kao i prethodni C6000 procesori dve od osam funkcionalnih jedinica su množači.
Svaki C6455 množač udvostručava propusnu moć jezgra izvršavajući četiri 16b x 16b MAC
instrukcije u jednom taktu.
C6455 ukljucuje i serijski RapidIO. Ova brza periferija dramatično uvećava
performanse sistema i redukuje cenu sistema koji zahteva više DSP procesora na ploči.
C6455 DSP objedinjuje veliku količinu memorije organizovanu u memrijski sistem sa
dva nivoa. Na nivou 1 i programska i memorija podataka su po 32KB. Ova memorija može
biti konfigurisana kao mapirana RAM ili skrivena (engl. casche), ili kombinacija ove dve.
Konfigurisana kao skrivena, L1 programska je direktno mapirana skrivena dok je L1 sa
podacima u stvari asocijativna skrivena memorija. L2 memorija je deljena između
programskog i prostora podataka a veličine je 2096KB. L2 memorija takođe može biti
konfigurisana kao mapirani RAM, skrivena ili kombinacija ove dve. C6255 megamodul
takođe ima 32-bitni periferni konfiguracioni port, interni DMA kontroler, sistemsku
komponentu sa reser/boot kontrolom, kontrolu prekida i izuzetaka, kontrolu pada napona
napajanja i 32-bitni brojac za vremenske pečate.
Pod periferijom se podrazumeva: I2C (engl. Inter integrated circuit) magistrala, dva
MCBSP porta, 8-bitnu spregu za asihroni transfer, dva 64-bitna opšte namenska brojača
(moguće ih podesiti da rade kao četiri 32-bitna), PCI magistrala, 16 bitni opšte namenski
ulazno izlazni port, 10/100 Mb/s mrežni kontroler.
I2C port na C6455 procesoru omogućava laku kontrolu perifernih uredjaja, odnosno
komunikaciju procesora i periferije. MCBSP se može koristiti za komunikaciju sa serijski
periferijskim interfejsom (SPI).
C6455 procesor poseduje dva ko-procesora visokih performansi VCP2 i TCP2 koji
značajno ubrzavaju operacije dekodiranja na čipu.
C6455 poseduje kompletan set razvojnih alata koji uključuju C kompajler,
asemblersku optimizaciju i Windows alat za otkrivanje grešaka.
9
2.2 Programski paketi
2.2.1 Programski paket Code Composer Studio
Code Composer Studio (Slika 7) je integrisano okruženje za razvoj IDE (eng. Integrated
Development Enviroment) koje donosi alate za sve platforme i podršku za razvoj projekata
na bazi TMS320 DSP procesora.
IDE uključuje podršku za DSP/BIOS, mogućnost analize u realnom vremenu, alate za
kontrolisano izvršavanje programa i optimizaciju, C/C++ prevodilac, asemplerski prevodilac,
vizualno upravljanje projektom i razne simulatore i emulacione rukovaoce uređaja.
Slika 4 – Programski paket Code Composer Studio
10
2.2.2 Operativni sistem DSP/BIOS
DSP/BIOS operativni sistem je sistem za rad realnom vremenu i podrškom za paraleno
izvršavanje više niti, specijano projektovan za platforme na bazi procesora TMS320C6000™,
TMS320C5000™, and TMS320C28x™. DSP/BIOS donosi standardizovane API (eng.
Application Programming Interface) funkcije za C6000, C5000 i C28x DSP platforme i
optimizovan je za koriščenje na DSP jezgrima u OMAP (eng. Open Multimedia Application
Platform) uređajima. DSP/BIOS je moguće koristiti samostalano ili kao integralni deo Code
Composer Studio IDE i uključuje grafičko podešavanje elemenata sistema. Namenjen je za
rad u realnom vremenu, kreiranju, raspodeli, sa alatima za analizu u realnom vremenu
fokusiran na otkrivanje grešaka i podešavanje sinhronizacije niti(eng. Thread).
11
3 Metodologija izrade
3.1 Više protokola
Protokol omogućuje da se definiše ili razme komunikacija pri čemu nije neophodno
poznavanje detalja mrežmnog hardvera određenog proizvođača. Protokoli su za računarsku
komukikaciju ono što su programski jezici za računarsku obradu. Složeni sisemi za prenos
podataka ne koriste jedan protokol za obavljanje svih poslova prenosa. Oni zahtevaju skup
protokola koji sarađuju i koji se ponekada nazivaju familijom protokola. Zašto je ovo ovako
vidi se iz problema koji nastaju prilikom komuniciranja računara preko mreže za prenos:
Kvar hardvera. Računar ili usmerivač mogu da otkažu zbog kvara hardvera ili
pada operativnog sistema. Mrežna veza za prenos podataka može da otkaže ili
da se slučajno prekine. Softver protokola treba da detektuje takve kvarove ili
ako je moguće da ih otkloni
Zagušenje mreže. Čak i kada hardver i softver pravilno rade, mreža ima
ograničen kapacitet koji može da bude prekoračen. Softver protokola treba da
se pobrine za slučaj da zagušeni računar onemogući dalji tok saobraćaja.
Kašnjenje ili gubitak paketa. Ponekad paketi mogu izuzetno mnogo da kasne
il da se izgube. Softver protokola treba da bude upoznat sa neuspelim
prenosima ili da se prilagodi dugim kašnjenjima.
Oštećenje podataka. Električne ili magnetne smetnje ii kvarovi hadvera mogu
da izazovu greške u prenosu koje kvare sadržaj podataka koji se prenose.
Softver protokola treba da otkrije i otkloni takve greške.
Dupliranje podataka ili prenos obrnutim redom. Mreže koje sadrže više
puteva mogu da prenesu podatke izvan redosleda ili da prenesu duplicate
paketa. Softver protokola treba da preuredi pakete i da ukloni duplicate.
Ako se posmatraju svi zajedno, ovi problemi izgledaju nesavladivo. Teško je razumeti
kako može da se napiše jedan protokol koji će se pobrinuti za sve ove probleme. Podelom
ovih problema na koncepcijske potprobleme moguće je doći do rešenja. Ova podela
omogućuje da se projektant usredsredi na jedan potproblem i da realizator nezavisno napiše i
testira svaki deo programske podrške.
12
3.2 Koncept slojeva protokola
Softverski moduli protokola su po konceptu na svakom računaru složeni vertikalno u
slojeve kao na slici 5.
Slika 5 – Koncepcijska organizacija softvera protokola u slojevima
Koncepcijski, slanje poruke iz aplikacije na jednom računaru u aplikaciju na drugom
računaru ynači prenos poruke nadole, kroz uzastopne slojeve protokola na računaru
pošiljaocu, prosleđivanje poruke kroz mrežu i prenos poruke nagore kroz uzastopne
slojeve protokola na računaru primaocu. Svaki sloj donosi odluke o ispravnosti poruke i
bira odgovarajuću akciju zasnovanu na tipu poruke ili odredišnoj adresi.
3.3 Petoslojni TCP/IP referentni model
TCP/IP protokol stek je organizovan u pet koncepcijskih slojeva – četiri softverska
sloja koji se nadograđuju na peti, hardverski sloj. Na slici 6 su prikazani koncepcijski
slojevi kao i oblik podataka koji se prenose između njih.
Slika 6. Koncepcijski slojevi TCP/IP protokol steka
Aplikacija
Transport
Internet
Mreža
Hardver
Poruke ili tokovi
Segmenti
IP datagrami
Okvir svojstveni mreži
Sloj 2
.....
Sloj n
Pošiljalac
Sloj 1
Sloj 2
.....
Sloj n
Primalac
Sloj 1
Mreža
13
3.3.1 Sloj aplikacija
Na najvišem nivou, korisnik poziva aplikacije koje pristupaju servisima raspoloživim
preko TCP/IP interneta. Aplikacija komunicira sa jednim od protokola transportnog sloja
da bi poslala ili primila podatke. Svaka aplikacija bira odgovarajući stil transporta koji
može da bude niz pojedinačnih poruka ili kontinualan tok bajtova. Aplikacija predaje
podatke u zahtevanom obliku transportnom sloju da bi podaci bili preneseni.
3.3.2 Transportni sloj
Glavna dužnost transportnog sloja jeste da obezbedi komunikaciju od jedne do druge
aplikacije. Takva komunikacija se često naziva komunikacijom od jednog do drugog
kraja veze. Transportni sloj može da reguliše protok informacija. On takođe može da
obezbedi pouzdan transport osiguravajući da podaci stižu bez greškei po redu. Da bi se
ovo postiglo, softver transportnog protokola omogućuje da prijemna strana vrača potvrde
prenosa i da predajna strana ponovo šalje izgubljene pakete. Transportni softver deli tok
podataka koji se prenose u pakete i svaki paket zajedno sa odredišnom adresom predaje
sledećem sloju radi prenosa. Iako je na Slici 6. za predstavljanje sloja aplikacije
upotrebljen jedan blok, računar opšte namene može da ima više aplikacija koje
istovremeno pristupaju internetu. Transportni sloj može da prihvati podatke iz nekoliko
korisničkih programa i da ih pošalje u sledeći niži sloj. Da bi to učinio, on svakom paketu
dodaje dopunske informacije, ukjljučujući kodove koji identifikuju koja aplikacija ga je
poslala i koja aplikacija treba da ga prim, kao i kontrolni zbir. Prijemni računar koristi
kontrolni zbir da bi proverio da li je paket stigao neoštećen, a oderedišni kod da bi
identifikovao aplikaciju koja treba da primi paket.
3.3.3 Internet sloj
Internet sloj upravlja komunikacijom od jednog do drugog računara. Ovaj sloj
prihvata zahtev za slanje paketa iz transporntog sloja zajedno sa identifikacijom računara
na koji paket treba da bude prenesen. On enkapsulira paket u IP datagram, popunjava
zaglavlje datagrama, koristi algoritam usmeravanja kako bi odredio da li da datagram
prenese direktno ili da ga pošalje na usmerivač i prosleđuje datagram odgovarajućem
mrežnom interfejsu kako bi bio dalje prenesen. Internet sloj takođe upravlja dolaznim
datagramima proveravajući njihovu punovažnost i koristi algoritam usmeravanja kako bi
odlučio da li datagram treba a bude lokalno obrađen ili prosleđen. Za datagrame koji su
adresirani nalokalni računar, softver u internet sloju briše zaglavlje datagrama i između
nekoliko transportnih protokola bira onaj koji će rukovati paketom. Konačno, internet sloj
po potrebi prima i šalje ICMP poruke o greškama i kontrolne poruke.
3.3.4 Sloj Mreže
Najniži nivo TCP/IP softvera čini sloj mrežnog interfejsa koji je odgovoran za
prihvatanje IP datagrama i njihov prenos preko određene mreže. Mrežni interfejs može da
se sastoji od upravljačkog programa uređaja (na primer kada je mreža lokalna računarska
mreža na koju se računari direktno priključuju) ili složeni podsistem koji koristi sopstveni
14
protokol za veze podataka (na primer kada se mreža sastoji od komutatora paketa koji
komuniciraju sa računarima koristeći HDCL).
3.4 Princip uslojavanja
Protokoli uslojavanja su osmišljeni tako da sloj n na odredištu prima tačno isti onaj
objekat koji je poslao sloj n na izvoru. Uslojavanje omogućuje projektantu protokola da
usmeri pažnju samo na jedan sloj, ne brinući o ponašanju drugih slojeva. Projektaktanti
pretpostavljaju da aplikacija na jednom računaru prima tačno one podatke koje šalje
aplikacija na drugom računaru:
Računar A Računar B
Slika 7. Putanja poruke prilikom njenog prolaska iz aplikacije
na jednom računara do aplikacije na drugom računaru
3.5 Dve granice u TCP/IP modelu
Koncepcijsko uslojavanje protokola obuhvata dve granice :
Adresnu granicu protokola koja odvaja adresiranje visokog nivoa od
adresiranja niskog nivoa
Granica operativnog sistema koja odvaja sistem od aplikacija
Slika 8. Granice TCP modela
Aplikacija
Transport
Internet
Mreža
Aplikacija
Transport
Internet
Mreža
Fizička mreža
Identična poruka
Identičan paket
Identičan datagram
Identičan okvir
Transport
Internet
Mreža
Hardver
Koriste se samo fizičke adrese
Koriste se samo IP adrese
Softver unutar operativnog sistema
Aplikacija Softver van operativnog sistema
15
3.5.1 Adresna granica protokola visokog nivoa
Ova granica deli softver koji koristi fizičke adrese niskog nivoa od softvera koji
koristi adrese visokog nivoa.
3.5.2 Granica operativnog sistema
Ova granica predstavlja podelu između softvera koji se po pravilu smatra delom
operativnog sistema i softvera koji to nije.
3.6 Transportni servis pouzdanog toka podataka (TCP)
TCP (engl. Transmission Control Protocol) predstavlja nezavistan protokol opšte
namene koji može da se prilagodi za korišćenje sa ostalim sistemima prenosa. Na primer,
pošto TCP pravi veoma malo pretpostavki o mreži na kojoj se zasniva njegov rad, on može
da se koristi za prenos preko jedne mreže kao što je eternet, kao i preko složenijeg interneta.
Na najnižem nivou, računarske komunikacione mreže obezbeđuju nepouzdan prenos
paketa. Paketi mogu da budu izgubljeni ili oštećeni kada se greške u prenosu pomešaju sa
podacima, kada otkaže mrežni hardver ili kada mreže postanu toliko preopterećene da ne
mogu da prihvate ceo saobraćaj koji se u njih upućuje. Mreže koje dinamički usmeravaju
pakete mogu da ih predaju izvan redosleda , da ih prenesu sa znatnim zakašnjenjem ili da
prenesu duplikate. Štaviše, mrežne tehnologije mogu da diktiraju optimalnu veličinu paketa
ili da postave druga ograničenja kako bi se postigle efikasne brzine prenosa.
3.6.1 Svojstva servisa pouzdanog toka
Sprega između aplikacija i TCP/IP protokola može da se okarakteriše pomoću pet
svojstava:
Orijentacija na tok. Kada dve aplikacije prenose velike količine podataka,
podatke posmatramo kao tok bitova, podeljen u 8 bitne oktete (bajtove). Servis
prenosa toka na odredišnom računaru predaje primaocu potpuno isti niz okteta
koji pošiljalac predaje ovom servisu na izvornom računaru
Veza preko virtuelnog kola. Uspostavljanje prenosa toka analogno je
upućivanju telefonskog poziva. Da bi prenos mogao da započne, predajna i
preijemna strana sarađuju sa svojim operattivnim sistemim, obaveštavajući ih
o nameri prenosa toka. Koncepcijski, jedna aplikacija upućuje poziv koji
druga aplikacija mora da prihvati. Softverski moduli protokola u dva
operativna sistema komuniciraju slanjem poruka preko interneta,
proveravajući da li postoji ovlašćenje za prenosi da li su obe strane spremne.
Kada svi detalji budu dovedeni u red, moduli protokola obaveštavaju
16
aplikacije da je veza uspostavljena i da prenos može da počne. Za vreme
prenosa, softver protokola na dva računara nastavlja da komunicira da bi
proverio da li su podaci pravilno primljeni. Ako komunikacija iz bilo kog
razloga ne uspe, oba računara detektuju kvar i obaveštavaju o njemu
odgovarajuće aplikacije. Takve veze nazivamo virtuelno kolo, jer je
pouzdanost samo privid koji obezbeđuje servis prenosa toka, iako aplikacije
vide vezu kao namensko hardversko kolo.
Prenos uz korišćenje bafera. Aplikacije šalju tok podataka preko virtuelnog
kola neprekidno prenoseći oktete podataka softveru protokola. Prilikom
prenosa podataka svaka aplikacija koristi onu veličinu delova poataka koja je
podesna za tu aplikaciju, što može da bude i samo jedan oktet. Na prijemnom
kraju , softver protokola predaje oktet iz toka podataka tačno istim redosledom
kojim su poslati, stavljajući ih na raspolaganje prijemnoj aplikaciji odmah
posle prijema i proveravanja. Softver protokola može slobodno da podeli tok u
pakete, nezavisno od veličine delova koje prenosi aplikacija. Da bi prenos bio
efikasniji i da bi se minimizovao mrežni saobraćaj, implementacije obično
sakupljaju dovoljno podataka iz toka da bi popunile datagram razumne
veličine pre nego čto ga pošalju preko interneta. Prema tome, čak i ako
aplikacija proizvodi tok generišući jedan po jedan oktet, prenos preko
interneta može da bude sasvim efikasan. Slično tome, ako se aplikacija
opredeli za generisanje izuzetno velikih blokova podataka, softver protokola
može da izabere da svaki blok podeli na manje delove koji će se prenositi. Za
one aplikacije kod kojih podaci treba da se prenesu čak i ako ne popune bafer,
servis pouzdanog toka obezbeđuju mehanizam prisilnog prenosa koji
aplikacije koriste da bi nametnule prenos. Na predajnoj strani, mehanizam
prisilnog prenosa koji aplikacije koriste da bi nametnule prenos. Na predjanoj
strani, mehanizam prisilnog prenosa primorava softver protokola da prenese
sve podatke koji su generisani, bez čekanja da se bafer popuni. Kada podaci
stignu na prijemnu stranu, ovaj mehanizam prouzrokuje da ih TCP stavi na
raspolaganje aplikaciji bez kašnjenja. Međutim, čak i kad je prenos nametnut,
softver protokola može da izabere da podeli tok na neočekivane načine.
Nestruktuirani tok. Servis pozdanog toka podataka ne poštuje tokove
srtruktuiranih podataka. Aplikacije koje koriste servis toka moaju da razumeju
sadržaj toka i da se salase o formatu toka pre nego što započnu vezu.
Puna dupleks veza. Veze koje obezbeđuju TCP/IP servis toka omogućuju
istovremeni prenos u oba smera. Iz perspektive aplikacionog procesa, puna
dupleksna veza se sastoji se od dva nezavisna toka koji protiču u suprotnim
smerovima, bez vidljive interakcije.Servis toka omogućuje aplikacionom
procesu da prekine protok u jednom smeru dok podaci nastavljaju da protiču u
drugom smeru, što vezu čini polu dupleksom. Prednost pune dupleksne veze
je u tome što softver odgovarajućeg protokola može da izvoru vraća kontrolne
informacije za jedan tok u datagramima koji prenose podatke u suprotnom
17
smeru. Ova tehnika šlepovanja (engl. piggybacking) datagrama jednog smera
za prenos informacija o drugom smeru smanjuje mrežni saobraćaj.
3.6.2 Pouzdanost u prenosu
Servis pouzdanog prenosa toka garantuje prenos toka podataka poslatih sa jednog
računara na drugi bez dupliranja ili gubitka paketa. Većina pouzdanih protokola koristi
osnovni postupak poznat kao pozitivno potvrđivanje sa pouzdanim prenosom. Ovaj
postupak zahteva od primaoca da komunicira sa izvorom, vraćajući mu poruku potvrde
prenosa (engl. acknowledgement) kada primi podatke. Pošiljalac čuva zapis o svakom
paketu koji pošalje čeka na potvrđivanje prenosa pre nego što pošalje sledeći paket. On
takodje aktivira brojač vremena kada počalje paket i ponovo šalje paket ako vreme
brojača istekne pre nego što potvrda prenosa stigne. Sledeća slika prikazuje
nejjednostavniji protokol pozitivnog potvrđivanja:
Slika 9. Protokol koji koristi pozitivno potvrđivanje
Na slici 9 događaji na strani pošiljaoca i primaoca su levo i desno, respektivno.
Svaka dijagonalna linija koja prolazi kroz sredinu prikazuje prenos jedne poruke preko
mreže. Na slici 10 je prikazano šta se dešava kad se paket izgubi ili ošteti. Posle slanja
paketa pošiljalac pokreće brojač vremena. Kada vreme brojača istekne, pošiljalac smatra
da je paket izgubljen i ponovo ga šalje. Isprekidana linija pokazuje vreme koje bi bilo
potrebno za prenos paketa i njegovog potvrđivanja u slučaju da paket nije izgubljen.
Događaji na strani pošiljaoca Mrežne poruke Događaji na strani primaoca
Slanje pakta 1
Prijem paketa 1
Slanje potvrde 1
Prijem potvrde 1
Slanje paketa 2 Prijem paketa 2
Slanje potvrde 2
Prijem potvrde 2
18
Slika 10. Vreme obustavljanja čekanja i ponovnog prenosa
Poslednji problem pouzdanosti nastaje kada sistem prenosa duplira pakete. Duplikati
mogu takođe da nastanu kada se u mreži javljaju velika kašnjenja koja izazivaju
povremeni ponovni prenos. Rešavanje problema dupliranja zahteva pažljivo razmatranje
jer mogu da budu duplirani i paketi i potvrde. Pouzdani protokoli obično detektuju
dupliranje paketa dodeljivanjem rednog broja svakom paketu i zahtevom da primalac
pamti koji redni broj je primio. Da bi se izbegla zabuna koju izazivaju potvrđivanja koja
kasne ili su duplirana, protokol pozitivnog potvrđivanja vraća redne brojeve u potvrdama
prenosa tako da primalac može tačno da ih pridruži paketima.
3.6.3 Klizni prozori
Postupak kliznih prozora predstavlja složeniji oblik pozitivnog potvrđivanja i
ponovnog prenosa. Protokoli kliznih prozora bolje koriste mrežni opseg, jer omogućavaju
pošiljaocu da pošalju više paketa dok čeka na potvrđivanje. Ako je paket poslat, ali za
njega nije primljena potvrda prenosa, kažemo da je paket nepotvrđen. Tehnički, broj
paketa koji može da bude ne potvrđen u bilo kom vremenu ograničen je veličinom
prozora i obično prestavlja mali celibroj. Na primer u nekom protokolu gde je veličina
kliynog prozora 8, pošiljaocu je dozvoljeno da prenese 8 paketa pre nego što primi
potvrdu prenosa. Rad protokola kliznog prozora zavisi od veličine prozora i brzine kojom
mreža prihvata podatke. Na slici 11 je prikazan primer funkcionisanja protokola kliznog
prozora prilikom slanja tri paketa. Sa veličinom prozora 1, protokol kliznog prozora je
potpuno isti kao jednostavan protokol pozitivnog potvrđivanja. Povećanjem veličine
prozora moguće je potpuno eliminisati vreme mirovanja mreže. Drugim rečima, u
stabilnom stanju pošiljalac može da šalje pakete onom brzinom kojom mreža može daih
prenosi. Osnovna zamisao je da dobro podešen protokol kliznog prozora održava mrežu
potuno zasićenu paketima i samim tim obezbeđuje znatno veću propusnu moć nego
Događaji na strani pošiljaoca Mrežne poruke Događaji na strani primaoca
Slanje pakta 1
Paket bi trebalo da stigne
Trebalo bi da bude poslata
poruka Potvrda bi trebalo da
stigne u ovom trenutku
Slanje paketa 2
Prijem paketa 1
Slanje potvrde 1 Prijem potvrde 1
Izgubljen paket
Pokretanje brojača
Ponovno slanje paketa 1
Pokretanje brojača
Zaustavljanje brojača
19
jednostavan protokol koji za slanje sledećeg paketa obavezno čeka na potvrdu prijema
prethodnog.
Slika 11. Klizni prozor veličine 3
TCP korisiti specijalizovan mehanizam kliznog prozora da bi rešio dva važna
problema: efikasan prenos i kontrolu protoka. TCP mehanizam kliznog prozora radi na nivou
okteta, a ne na nivou segmenta ili paketa. Okteti toka podataka numerisani su redom , a
pošiljalac održava tri pokazivača pridružena svakoj vezi. Pokazivači definišu klizni prozor.
TCP dozvoljava da se veličina prozora menja u toku vremena. Svako potvrđivanje prenosa u
kome se navodi koliko je okteta primljeno sadrži oglašavanje prozora u kome se navodi
koliko dodatnih okteta podataka je primalac spreman da prihvati. Oglašavanje prozora
možemo posmatrati kao da određuje trenutnu veličinu bafera primaoca. Kao odgovor na
oglašavanje povećanog prozora, pošiljalac povećava svoj klizni prozor i nastavlja da šale
oktete čiji prijem nije potvrđen. Kao odgovor na oglašavanje smanjenog prozora, pošiljalac
smanjuje svoj prozor i prekida slanje okteta van granice. Prednost korišćenja prozora
promenljive veličine je to što on obezbeđuje kontrolu protoka kao i pouzdan prenos. Da bi
izbegao prijem više podataka nego što može da prihvati, primalac šalje oglašavanja manjeg
prozora za vreme dok se njegov bafer puni. U ekstrenom slučaju primalac oglašava veličinu
prozora nula da bi potpuno prekinuo prenos. Kasnije kad se prostor u baferu oslobodi,
primalac oglašava veličinu prozora različitu od nule kako bi ponovo pokrenuo prenos.
Postojanje mehanizma kontrole protoka je od suštinske važnosti u internet okruženju, gde
računari različitih brzina i veličina komuniciraju preko mreža i usmerivača različitih brzina i
kapaciteta. Postoje dva nezavisna problema protoka. Prvo, internet protokolima je potrebna
kontrola protoka od jednog do drugog kraja veze, odnosno između izvorišta i odredišta.
Drugo, internet protokolima je potreban mehanizam za kontrolu protoka koji dozvoljava da
posredni sistemi kontrolišu izvor koji zalje više saobraćaja nego što to mašina može da
podnese.
Događaji na strani pošiljaoca Mrežne poruke Događaji na strani primaoca
Slanje paketa 1
Prijem potvrde 1
Slanje paketa 2
Slanje paketa 3
Prijem potvrde 2
Prijem potvrde 3
Prijem paketa 1
Slanje potvrde 1
Prijem paketa 2
Slanje potvrde 2
Prijem paketa 3
Slanje potvrde 3
20
3.6.4 Pasivna i aktivna otvaranja
Za razliku od UDP-a, TCP je protokol orijentisan ka uspostavljanju veze koji zahteva
da se krajnje tačke sporazumeju o učešću. Drugim rečima da bi TCP saobraćaj mogao da
prođe preko interneta, aplikacije na oba kraja veze treba da se sporazumeju oko
uspostave veze. Da bi to učinile, aplikacija na jednom kraju izvršava akciju pasivnog
otvaranja obraćajuči se svom operativnom sistemu i ukazujući da će prihvatiti dolaznu
vezu. Tada operativni sistem dodeljuje broj TCP porta za svoj kraj veze. Aplikacija na
drugom kraju, da bi uspostavila vezu, mora zatim da se obrati svom operativnom sistemu
koristeći zahtev za aktivno otvaranje. Ova dva TCP softverska modula operativnog
sistema zatim komuniciraju da bi uspostavili i proverili vezu. Kada veza bude
uspostavljena , aplikacije treba da započnu prenos podataka.
Slika 12. UDP i TCP iznad IP-a.
3.6.5 Format TCP segmenta
Jedinica prenosa između TCP softvera dva računara naziva se segmentom. Segmenti
se razmenjuju da bi se uspostavile veze, preneli podaci, poslale potvrde prenosa, oglasile
veličine prozora i prekinule veze. Pošto TCP koristi tehniku šlepovanja datagrama,
potvrđivanje koje se šalje sa računara A na računar B može da se prenosi u istom
segmentu kao podaci koji se prenose sa računara A na računar B, iako se potvrđivanje
odnosi na podatke poslate sa računara B na računar A. U praksi se tehnika šlepanja retko
koristi jer većian aplikacija ne šalje podatke u oba smear istovremeno. Na sledećoj slici se
vidi format TCP segmenta. Svaki segment je podeljen na dva dela, zaglavljei podatke koji
dolaze iza njega. Zaglavlje poznato kao TCP zaglavlje,prenosi očekivane identifikacione
podatke i kontrolne informacije.
Koncepcijsko uslojavanje
Aplikacija
Internet (IP)
Mrežni interfejs
TCP UDP
21
IZVORNI PORT ODREDIŠNI PORT
REDNI BROJ
BROJ POTVRDE
PROZOR
POPUNA
REZERVIS. BITOVI KODA
OPCIJE
PODACI
............
POKAZIVAČ HITNIH PODATAKAKONTROLNI ZBIR
DŽAG
Slika 13. Format TCP segmenta
Polja izvorni port i odredišni port sadrže brojeve TCP portova koji identifikuju
aplikacije na krajevima veze. Polje redni broj identifikuje položaj podatak
asegmentapošiljaoca u toku bajtova. Polje broj potvrde identifikuje broj sledećeg okteta koji
izvor očekuje da primi. Obratite pažnju na to da se redni broj odnosi na tok koji se kreće u
istom smeru kao segment, dok se broj potvrde odnosi na tok koji se kreće u suprotnom smeru
od segmenta.
Polje džag sadrži ceo broj koji sadrži veličinu zaglavlja izraženu u umnošciam od 32
ita. Ono je potrebno zato što se dužin apolja opcije menja u zavisnosti od obuhvaćenih opcija.
Prema tome, veličina TCP zaglavlja menja se u zavisnosti od izabranih opcija. Šestobitno
polje koje je označeno kao rezervisano, rezervisao je za buduću upotrebu. Neki segmenti
prenose samo potvrde prenosa a neki samo podatke.Drugi prenose zahteve za uspostavljanje i
prekidanje veze. TCP softver koristi 6-bitno polje sa oynakom bitovi koda da bi odredio
namenu i sadržaj segmenta. Ovih šest bitova određuju kako treba interpretirati ostala polja u
šaglavlju u skladu sa sledećom tabelom:
Bitovi Značenje ako je bi postavljen na 1
URG Hitni podaci
ACK Potvrda uspešnog prenosa
PSH Prisilan prenos
RST Nasilno prekinuti vezu
SYN Usaglasiti redne brojeve
FYN Kraj toka bitova
Slika 14. Bitovi polja Kod u zaglavlju
Svaki put kada pošalje segment, TCP softver oglašava koliko podataka je spreman da
primi navodeći vličinu svog bafera u polju prozor. Ovo polje sadrži 16.bitni ceo broj bez
22
predznaka u standardnom mreznom redosledu bajtova. Oglašavanje prozora predstavlja još
jedan primer tehnike šlepovanja, jer oglašavanje prozora prati sve segmente, uključujući i one
koji prenose podatke kao i one koji prenose samo potvrđivanje prenosa.
3.6.6 Podaci van uobičajenog redosleda
Iako je TCP protokol orijentisan na tokove, ponekad je za program na jednom kraju
veze važno da pošalje podatke izvan uobičajenog redosleda, ne čekajući da program na
drugom kraju veze prihvati sve okteet koji se već nalaze u toku. Takvi signali su najčešće
potrebni kada program na udaljenom računaru ne radi pravilno. Ovi signali se moraju
poslati bez čekanja da bi program na drugom kraju veze pročitao sve oktete koji se već
nalaze u TCP toku.
Da bi omogućio slanje signala izvan uobičajenog redosleda, TCP omogućuje
pošiljaocu da označi podatkekako hitne, što znači da prijemni program treba što brže da
bude obavešten o njihovom dolasku, bez obzira na njihovu poziciju u toku podataka.
Kada se otkriju hitni podaci, protokol nalaže da prijemni TCP obavesti sve aplikacije koje
su pridružene vezi da pređu u hitni režim. Naravno, tačni detalji o tome kako TCP
obaveštava aplikaciju o hitnim podacima zavise od operativnog sistema rašuanra.
Mehanizam koji se koristi za označavanje hitnih podataka prilikom njihovog slanja u
segmentu sastoji se od URG bita koda i polja pokazivač hitnih podataka. Kad je URG bit
uključen, pokazivač hitnih podataka određuje poziciju kraja ovih podataka u segmentu.
3.6.7 Opcija maksimalne vličine podataka
Svi segmenti koji se šalju preko neke veze neće biti iste veličine. Međutim, oba kraja
trba da se sporazumeju o maksimalnoj veličini segmenta koji će se prenositi. TCP koristi
polja opcije kako bi pregovarao sa TCP softverom na drugom kraju veze. Jedna od opcija
omogućuje da TCP softver navede maksimalnu veličinu segmenta koju je spreman da
primi. Na primer, ako jedan ugrađeni sistem koji ima samo nekoliko stotina bajtova
prostora u baferu uspostavi vezu sa velikim super razunarom, on može da ugovori MSS
koji ograničava segmente tako da mogu da stanu u bafer. Posebno je važno da računari
koji su povezani lokalnim računarskim mrežama velike brzine izaberu maksimalnu
veličinu paketa tako da rezultujući IP datagrami odgovaraju mrežnoj MTU veličini.
Ukoliko se krajnje tačke ne nalaze u istoj fizičkoj mreži, one mogu da pokušaju da otkriju
minimalnu MTU veličinu duž putanje između njih ili da izaberu maksimalnu veličinu
segmenta od 736 bajta (podrazumevana veličina IP datagrama, 576, umanjena za veličinu
iIP i TCP zaglavlja).
3.6.8 Izračunavanje TCP kontrolnog zbira
Polje kontrolni zbir u TCP zaglavlju sadrži 16-bitni celobrojni kontrolni zbir koji se
koristi za preoveravanje integriteta podatakakao i TCP zaglavlja. Da bi izračunao
kontrolni zbir, TCP softver na računaru pošiljaocu ispred segmenta dodaje pseudo
zaglavlje, dopunjava segment dovoljnim brojem bitova da bi segment bio bio umnožak od
16 bitova i zatim izračunava16-bitni kontrolni zbir nad ukupnim rezultatom. TCP ne
ubraja pseudo zaglavlje ni bitove za popunu u dužinu segmenta i ne prenosi ih. Pored
23
toga, za potrebe izračunavanja on pretpostavlja da je samo polje kontrolnog zbira jednako
nuli. Kao i kod drugih kontrolnih zbirova, TCP koristi 16-bitnu aritmetiku i uzima
komplement jedinice zbira komplemenatat jedinice. Na prijemnom sajtu, TCP softver
obavlja isto izračunavanje da bi proverio da li je segment stigao čitav. Svrha korišćenja
pseudo zaglavlja je da omogući primaocu da proveri da li je segment stigao na tačno
odredište, što obuhvata IP adresu računara kao i broj porta protokola. Na sledećoj slici se
vidi format pseudo šaglavlja koje se koristi u izračunavanju kontrolnog zbira.
NULA PROTOKOL TCP DUŽINA
ODREDIŠNA ADRESA
IZVORNA ADRESA
Slika 15. Format pseudo zaglavlja
Predajni TCP dodeljuje polju protokol vrednost koju će odgovarajući sistem prenosa
koristiti u svom polju tipa protokola. Za IP datagrame koji prenose TCP, ova vrednost je 6.
Polje TCP DUŽINA određuje ukupnu dužinu TCP segmenta uključujući i TCP zaglavlje. Na
prijemnom kraju, informacije koje se koriste u pseudo zaglavlju izdvajaju se iz datagrama
koji je preneo segment i uključuju u izračunavanje kontrolnog zbira da bi se proverilo da li je
segment stigao čitav na tačno odredište.
3.6.9 Potvrđivanje prenosa i ponovni prenos
Zato što TCP prenosi podatke u segmentima promenljive dužine, kao i zbog toga što
ponovo preneseni segmenti mogu da sadrže više podataka od prvobitnih, potvrde prenosa ne
mogu lako da ukazuju na datagrame i segmente. Umesto toga, oni pokazuju na poziciju u
toku koristeći redne brojeve toka. Primalac prikuplja oktete podataka iz segmenata koji stižu i
ponovo konstruiše tačnu kopiju toka koji se šalje. Pošto se segmenti prenose u IP datagamu,
oni mogu da se izgube ili da budu preneseni van redosleda. Primalac koristi redne brojeve
kako bi ponovouredio segmente. U bilo kom trenutku, primalac će imati nula ili više
rekonstruisanih susednih okteta od početka toka, ali može da ima dodatne delove toka iz
datagrama koji su stigli izvan redosleda. Primalac uvek potvrđuje najduži neprekidni prefiks
toka koji je tačno primljen. Tako pošiljalac prima stalnu povratnu informaciju od primaoca
dok napreduje kroz tok podataka. Šema TCP potvrđivanja naziva se kumulativnom jer
izveštava o tome koliki deo toka je akumuliran. Kumulitivna potvrđivanja prenosa imaju
svoje prenosti i mane. Jedna prednost je to što se ova potvrđivanja lako generišu i
nedvosmislena su. Druga prednost je to što izgubljena potvrđivanja ne moraju obavezno da
nametnu ponovni prenos. Glavni nedostatakje to što pošiljalac ne prima informacije o svim
uspešnim prenosima, nego samo o jednoj poziciji u toku podataka koji je primljen.
24
3.6.10 Uspostavljanje TCP veze
Da bi uspostavio vezu TCP koristi upoznavanje u tri koraka. Na sledećoj slici je
prikzan najjednostavniji slučaj.
Slika 16. Niz poruka u trosmernom upoznavanju
Prvi segment upoznavanja u tri koraka može da da se identifikuje zato što ima
postavljen bit SYN u polju koda. Druga poruka ima postavljene bitove SYN i ACK, što
pokazuje da ona potvrđuje prenos prvog SYN segmenta i ujedno nastavlja upoznavanje.
Poslednja poruka upoznavanja je samo potvrđivanje prenosa i korisi se samo za obaveštenje
odredišta da se obe stane slažu da je veza uspostavljena. Obično, TCP softver na jednom
računaru pasivno čeka na upoznavanje, a TCP softver na drugom računaruga započinje.
Međutim, upoznavanje je pažljivo projektovano tako da radi čak i ako oba računara
istovremeno pokušaju da započnu vezu. Prema tome veza može da se uspostavi sa bilo kojeg
kraja ili sa oba kraja istovremeno. Kada se veza uspostavi, podaci mogu da protiču
podjednako dobro u oba smera. Ne postoji glavni ili podređeni računar. Upoznavanje u tri
koraka je potrebno i dovoljno za tačnu sinhronizaciju između dva kraja veze.
3.6.11 Početni redni brojevi
Upoznavanje u tri koraka obavlja tri važne funkcije. Ono garantuje da su obe strane
spremne za prenos podataka i omogućuje da se obe strane sporazumeju o početnim rednim
brojevima. Redni brojevi se šalju i njihov prenos se potvrđuje za vreme upoznavnja. Svaki
računar mora nasumice da odabere početni redni broj koji će koristiti za identifikaciju bajtova
u toku podataka koji šalje. Redni brojevi ne mogu uvek da započnu sa istom vrednošću.
Važno je da se obe strane saglase o početnom brojui kako bi se brojevi okteta koji se koriste
u potvrdama prenosa slagali sa onima koji se koriste u segmentima podataka.
Događaji na strani pošiljaoca Mrežne poruke Događaji na strani primaoca
Slanje SYN red.br. = x
Prijem SYN segmenta
Slanje SYN red.br.=y, ACK x+1
Prijem SYN+ACK segmenta
Slanje ACK y+1
Prijem ACK segmenta
25
3.6.12 Zatvaranje TCP veze
Dva programa koji koriste TCP za komuniciranje mogu propisni da završe
komunikaciju koristeći operaciju zatvaranja. Interno za zatvaranje veze TCP koristi
modifikovano upoznavanje u tri koraka. Setite se da se TCP veze odlikuju punim
dupleksnim prenosom i da ih posmatramo kao da sadrže dva nezavisna toka prenosa, po
jedan u svakom smeru. Kada aplikacija ukaže TCP-u da nema više podataka za slanje,
TCP ćezatvoriti vezu u jednom smeru. Da bi zatvorio svoju polovinu veze, predajni TCP
završava prenos preostalih podataka, čeka da primalac to potvrdi a zatim šalje segment sa
postavljenim bitom FYN. Prijemni TCP potvrđuje prenos FYN segmenta i obaveštava
aplikaciju na svom kraju da nema više podataka na raspolaganju. Kada se veza zatvori u
datom smeru, TCP odbija da prihvati dodatne podatke za taj smer. U međuvremenu
podaci mogu i dalje da protiču u suprotnom smeru dok ga pošiljalac ne zatvori. Naravno
potvrđivanja prenosa nastavljaju da se vraćaju pošiljaocu čak i nakon zatvaranja veze.
Kada oba smera budu zatvorena, TCP softver u svakoj krajnjoj tački briše svoj zapis veze.
Na sledećoj vezi je prikazan postupak zatvaranja veze.
Slika 17. Modifikovano upoznavanje u tri koraka koje se koristi za zatvaranje veze
3.6.13 Nasilno prekidanje veze
U normalnim okolnostima , aplikacija koristi operaciju zatvarnja da bi zatvorila vezu
kada prestane da je koristi. Dakle, zatvaranje veze smatra se normalnim delom upotrebe,
analogno zatvaranju datoteka. Ponekad postoje vanredni uslovi koji preimoravaju
aplikacije da prekinu vezu. Da bi nasilno prekinula vezu jedna strana započinje okončanje
veze slanjem segmenta sa postavljenimbitom RST u polju kod. Druga strana odmah
odgovara na takav segment prekidanjem veze. TCP takođe obaveštava aplikaciju da je
došlo do prekida veze. Nasilan prekid je trenutan prekid koji znači da prenos u oba smera
trenutno prestaje i da se oslobađaju resursi kao što su baferi.
Događaji na strani pošiljaoca Mrežne poruke Događaji na strani primaoca
Aplikacija zatvara vezu
Slanje FIN red. Br. =x Prijem FIN segmenta
Slanje ACK x+1
Prijem ACK
segmenta
Prijem FIN + ack segmenta
Slanje ACK y + 1 Prijem ACK
segmenta
Aplikacija zatvara vezu
Slanje FIN red. Br. =y
26
3.6.14 Mašina stanja TCP-a
Na sledećoj slici je prestavljena TCP mašina konačnih stanja sa krugovima i
strelicama koje predstavljaju prelaze između njih.
Slika 18. Mašina konačnih stanja TCP-a
3.6.15 Nametanje prenosa podataka
TCP može slobodno da podeli tok podataka na segmente kako bi tok bio prenet, bez
obzira na obim prenosa koji aplikacija itvršava. Glavna prednost dozvoljavanja da TCP
izabere podelu jeste efikasnost. On može da akumulira dovoljno okteta u bafer da bi
napravio razumno velike segmente, smanjujući veliko opterećenje do kojeg dolazi kad
segmenti sadrže samo nekoliko okteta podataka. Da bi se prilagodio interaktivnim
korisnicima tcp obezbeđuje operaciju prisilnog prenosakoju aplikacija može da upotrebi
za nametanje prenosa okteta koji se trenutno nalaze u toku podataka ne čekajući da se
Zatvo
-reno
SYN
poslat
Zatvo
-reno
Sluša
-nje
SYN
prim.
Uspos
-stavl.
FIN
čeka1
FIN
čeka2
Zatvar-
anje Posledn
ji ACK
Ogr.
čekanje
Početak
27
bafer popuni. Operacija prisilnog prenosa obavlja više od jednostavnog primoravanja
TCP-a da pošalje segment. Ona takođe traži da TCP postavi PSH bit u polje koda
segmenta da bi podaci bili isporučeni aplikaciji na prijemnom kraju. Dakle, prilikom
slanja podtaka sa interaktivnog terminala, aplikacija koristi funkciju prisilnog prenosa
posle svakog pritiska na taster. Slično tome aplikacije posle ispitivanja jednog znaka ili
reda mogu da nametnu njihovo brzo slanje i prikazivanje na terminalu pozivanjem
funkcije prisilnog prenosa.
28
4 Opis rešenja
Realizovano rešenje pored funkcija vezanih za sam TCP mrežni protokol, sadrži i
funkcije koje odgovaraju referentnom BSD soket API-ju (engl. Berkeley sockets
application programming interface). U narednim poglavljima će detaljno biti opisane
svaka od realizovanih funkcija.
4.1 BSD programska podrška
BSD soket API (engl. Berkeley sockets application programming interface) se sastoji
od biblioteke za razvoj programske podrške u programskom jeziku C, koja obavlja IPC
(engl. Inter-process communication), najčešće za komunikaciu preko računarskih mreža.
BSD predstavlja standardnu apstrakciju za mrežne utičnice. BSD programska podrška
omogućava komunikaciju između dva računara ili između procesa na jednom računaru,
koristeći koncept internet utičnica. Takođe omogućava rad sa mnogim ulazno izlaznim
uređajima i drajverima, iako podrška za njih zavisi od implementacije na operativnom
sistemu. Sprežna implementacija je za TCP implicitno. Programska podrška je prvi put
predstavljena od strane univerziteta Berkli u Kaliforniji za korišćenje na UNIX
operativnim sistemima. Danas, svi moderni operativni sistemi imaju podršku za BSD
spregu, i one je postao standardna sprega za konekciju na internet. Programskoj podršci je
moguće pristupiti na tri različita nivoa. Sasvim nekoliko aplikacija ima potrebu da
pristupa nižim nivoima BSD programske sprege koji su dostupni, tako da se najniži nivo
koristi samo prilikom razvoja internet baziranih tehnologija.Većina novijih operativnih
sistema ima podršku za pristup nižim nivoima, uključujući i windows XP.
4.1.1 BSD soket API funkcije
Sledeća lista predstavlja funkcije i metode podržane od strane BSD soket API-ja:
socket() kreira novi soket i identifikuje ga sa celobrojnom vrednošću.
bind() se obično koristi na strani poslužioca i povezuje utičnicu sa lokalnim portom i
IP adresom računara.
listen() se koristi na strain poslužioca I prebacuje utičnicu u stanje osluškivanja.
connect() koristi se na strani klijenta I prouzrokuje pokušaj da se ostvari TCP
konekcija.
accept() se koristi na strani poslužioca. Funkcija prihvata dolazni pokušaj da se
ostvari TCP konekcija.
send() i recv(), ili write() i read(), ili recvfrom() i sendto(), se koriste za
slanje i primanje podataka .
close() se koristi za oslobađanje resursa alociranjih uz utičnicu. U slučaju TCP-a
konekcija se prekida.
29
gethostbyname() i gethostbyaddr() se koriste za otkrivanje imena i adrese
računara.
select() se koristi da uprosti dostupnu listu utičnica samo na one koji su spremni za
pisanje, čitanje ili imaju grešaka.
poll() se koristi za proveru stanja utičnice. Utičnica se može testirati da bi se videlo
da li je spremna za pisanje čitanje ili ima grešaka.
getsockopt() se koristi za iščitavanje tekućih vrednosti utičnice.
setsockopt() se koristi za postavljanje pojedinačnih opcija utičnice.
Realizovani BSD soket API ne sadrži sve funkcije kao referentni. Od prethodno
navedenih realizovane su sledeće:
void SocketLayerInit(void)
Opis:
Funkcija inicijalizuje utičnice čiji broj je ograničen vrednošću osam.
#define MAX_SOCKET 8
Utičnice imaju oblik strukture sa sledećim poljima:
struct MCSocket{
int SocketType;
AckListPkt *pTCPListHead;
AckListPkt *pTCPListTail;
TCP_STATE smState;
DWORD remoteIP;
WORD remotePort;
DWORD localIP;
WORD localPort;
int AckListCount;
int SocketID;
DWORD TcpSEQ;
DWORD TcpACK;
BYTE RetryCount;
DWORD TCPACKNum;
int TCPAppClosed;
int dataOffset;
WORD window;
};
Polja strukture:
SocketType – tip utičnice, na početku inicijalizovan na na vrednost:
#define TCP_SOCK_DGRAM 110
pTCPListHead – adresa početka reda za retransmisiju
pTCPListtail – adresa kraja reda za retransmisiju
smState – stanje utičnice, na početku inicijalizovano na stanje
TCP_CLOSED
remoteIP – adresa udaljenog računara
remotePort – port udaljenog računara
30
localIP – lokalna IP adresa
localPort – lokalni port
AckListCount – broj paketa u redu za retransmisiju
SocketID – identifikator utičnice
TcpSeq – tekući redni broj paketa
TcpAck – tekući broj potvrde
RetryCount – broj pokušaja retransmisije
TCP_SOCKET tcp_socket( int af, int type, int protocol )
Opis:
Funkcija kreira utičnicu i vraća identifikator iste. Suštinski, u funciji se
pronalazi slobodna utičnica, odnosno ona koja je u stanju zatvorena
(SKT_CLOSED). U slučaju ispravnih parametara vraća se identifikator
utičnice, a u slučaju greške povratna vrednost je (-1). Pre nego li se kao
povratna vrednost postavi identifikator utičnice, potrebno je utičnicu prevesti u
stanje kreirana (SKT_CREATED):
socket->smState = SKT_CREATED;
Parametri:
af – specificira familiju adresa.U realizovanoj implementaciji vrednost koja
se očekuje je dva. Vrednost dva simboliše IPv4 familiju adresa. Ova vrednost
je definisana imenskom konstantom:
#define AF_INET 2
type - specificira tip utičnice. Realizovano rešenje očekuje vrednost 100, koja
definiše sekvencijalni, pouzdani, pun dupleks, konekcijski orijentisani tok
podataka koji poseduje mehanizam slanja van normalnog redosleda (engl.
OOB Out of Band). Odgovarajuća imenska konstanta je :
#define TCP_SOCK_STREAM 100
protocol – specificira tip protokola. U našem slučaju koristi se TCP koji
prema preporuci ima vrednost 6. Odgovarajuća imenska konstanta je:
#define TCP_IPPROTO_TCP 6
Poziv funkcije:
connectSocket = tcp_socket( TCP_AF_INET, TCP_SOCK_STREAM, TCP_IPPROTO_TCP );
int tcp_bind( TCP_SOCKET s, DWORD IpAddr, WORD port )
31
Opis:
Funkcija povezuje prethodno kreiranu utičnicu sa navedenim portom i IP
adresom. U slučaju da prosleđeni identifikator identifikuje utičnicu koja nije
kreirana povratna vrednost je (-1). U slučaju da je navedena vrednost porta
nula, generiše se automatska vrednost koja je u opsegu od 1024 do 5000. Posle
poziva funkcije utičnica je u stanju SKT_BOUND.
Parametri:
s – identifikator utičnice, identifikuje utičnicu koja je kreirana
IpAddr – lokalna adresa računara
port – lokalni port računara
Poziv:
iResult = tcp_bind(connectSocket,0xF001A8C0,27015);
int tcp_listen( TCP_SOCKET s )
Opis:
Funkcija prevodi utičnicu u stanje osluškivanja na zahtev za vezu. U slučaju
da prosleđeni identifikator utičnice identifikuje utičnicu koja nije u stanju
SKT_BOUND vraća se poruka o greški i vrednost (-1). Ako je prevođenje u
stanje SKT_LISTEN uspešno povratna vrednost je nula.
Parametri:
s – identifikator utičnice, identifikuje utičnicu koja je kreirana
Poziv:
iResult = tcp_listen(connectSocket);
TCP_SOCKET tcp_accept( TCP_SOCKET s)
Opis:
Funkcija prihvata dolazni poziv za vezu. U pitanju je blokirajući poziv. U
slučaju uspešno uspostavljene veze povratna vrednost je jednaka identifikatoru
utičnice preko koje je veza ostvarena. Ukoliko se desi greška, povratna
vrednost funkcije je (-1). Posle uspešnog poziva utičnica je u stanju
TCP_EST.
Parametri:
32
s – identifikator utičnice, identifikuje utičnicu koja je kreirana
Poziv:
acceptSocket = tcp_accept(connectSocket);
int tcp_connect(TCP_SOCKET s, DWORD remoteIpAddr, WORD port )
Opis:
Funkcija pokušava da uspostavi konekciju na specificiranoj utičnici. Na
osnovi IP adrese i porta, šalje se paket koji sadrži samo zaglavlje. U datom
paketu postavljen je bit SYN. Ova vrednost označava da je u pitanju paket koji
predstavlja zahtev za ostvarenje veze. Broj paketa je postavljen na inicijalnu
vrednost ISS (eng. Initial Send Sequence Number). Posle uspešnog slanja
postavlja se stanje utičnice na TCP_SYN_SENT. Pored toga povratna
vrednost funkcije je SOCKET_CNXN_IN_PROGRESS i predstavlja
obaveštenje da je proces uspostavljanja veze u toku. Imenske konstante od
značaja su:
#define SOCKET_CNXN_IN_PROGRESS -6
#define SYN 0x02
Parametri:
remoteIpAddr – adresa udaljenog računara sa kojim želi da se uspostavi veza
port – port udaljenog računara na kome se očekuje zahtev
int tcp_send( TCP_SOCKET s, BYTE* buf, int len)
Opis:
Funkcija šalje podatke preko konektovane utičnice. Ukoliko nema grešaka
funkcija vraća broj poslatih bajta. Ukoliko je veličina bafera za slanje veća od
1460 bajta (ovaj broj je dobijen tako što je od MTU vrednosti umanjena
veličina zaglavlja za TCP i IP nivo od po 20 bajta ) potrebno je segmentirati
bafer. Ovakvi paketi se šalju sa postavljenim bitom PUSH. Svaki sledeći broj
paketa je veći od prethodnog za njegovu veličinu. Imenska konstanta za PUSH
je:
#define PSH 0x08
Parametri:
s – identifikator utičnice, identifikuje utičnicu koja je kreirana
buf – adresa početka podataka namenjenih za slanje
len - broj bajtova koji se šalju (veličina bafera)
33
Poziv funkcije:
sentBytes = tcp_send(connectSocket, gpucImage, 1000);
int tcp_recv( TCP_SOCKET s, char * buf, int len, int flags )
Opis:
Funkcija prima podatke preko konektovane utičnice. Ukoliko nema grešaka
funkcija vraća broj primljenih bajtova. U slučaju greške povratna vrednost je
-1. Ako je veličina bafera za prijem veća od 1460, funkcija će čekati dok se u
prijemnom baferu ne akumulira dovoljno podataka.
Parametri:
s – identifikator utičnice, identifikuje utičnicu koja je kreirana
buf – adresa početka podataka namenjenih za slanje
len - broj bajtova koji se šalju (veličina bafera)
Poziv finkcije:
bytesRecved = tcp_recv(connectSocket,gpucImage,15000,0)
4.2 Prijemna strana
Posmatrajući TCP mrežni protokol, njegovu ulaznu tačku predstavlja IP sloj, odnosno
funkcija koja prima podatke na IP nivou i koja ih na osnovu polja protocol u zaglavlju IP
paketa dalje usmerava. Zadatak funkcije koja prima podatke na IP nivou je da pored
usmeravanja odgovarajućem protokolu na višem protokol stek nivou i proveri kontrolnu
sumu primljenog paketa. Pogrešna kontrolna suma uzrokuje odbacivanje datog paketa.
Realizacija u našem slučaju izgleda ovako:
switch (pIpPkt->ipHdr.protocol) {
case IP_PROT_UDP:
return (NetUdpRcv(pIpPkt, ntohs(pIpPkt->ipHdr.length) -
IP_HEADER_LEN));
case IP_PROT_ICMP:
return (NetIcmpRcv(pIpPkt, ntohs(pIpPkt->ipHdr.length) -
IP_HEADER_LEN));
case IP_PROT_TCP:
34
return (NetTcpRcv(pIpPkt,ntohs(pIpPkt->ipHdr.length) -
IP_HEADER_LEN));!
default:
return 0; // nepodržan protokol
}
U slučaju da je funkcija prijema na IP nivou prepoynala da se radi o TCP mrežnom
protokolu, poziva se funkcija NetTcpRcv kojoj se prosleđuje adresa paketa i veličina paketa
oduzeta za vrednost veličine zaglavlja IP paketa (20 bajta). Deklaracija NetTcpRcv funkcije
je :
void TCP_RxHandler( NetTCPPkt *RxPkt,unsigned short usLen )
Prvi parametar funkcije je tipa NetTCPPkt. Definicija tipa je sledeća struktura:
typedef struct {
NetIpHdr ipHdr;
NetTcpHdr tcpHdr;
unsigned char data[1];
} NetTCPPkt;
Struktura sadrži polja koja predstavljaju IP zaglavlje (NetIpHdr), TCP zaglavlje
(NetTcpHdr) i adresu odakle počinju podaci u paketu. TCP zaglavlje je sledećeg oblika:
typedef struct _TCP_HEADER{
WORD SourcePort;
WORD DestPort;
DWORD SeqNum;
DWORD AckNum;
BYTE HdrLen;
BYTE Flags;
WORD Window;
WORD Checksum;
WORD UrgentPointer;
} NetTcpHdr;
Pored paketa funkciji NetTcpRcv se prosleđuje veličina pakata, koja je jednaka zbiru
veličine TCP zaglavlja i veličini podataka. Najpre se provera kontrolni zbir, i ukoliko je došlo
do greške paket se odbacuje. Za ove potrebe je realizovana funkcija:
WORD CalcTcpChecksum( DWORD SrcIP,DWORD DestIP, BYTE* PktBfr, WORD BfrLen )
Ukoliko je povratna vrednost funkcije jednaka 0xFFFF paket je prihvaćen bez
grešaka. Zatim se podaci parsiraju i na osnovu IP adrese i izvorišnih i odredišnih portova se
pronalazi odgovarajuća utičnica. Za ove potrebe je realizovana funkcija:
TCP_SOCKET FindTargetSocket(int SockType,DWORD SrcIP,DWORD DestIP,WORD
DestPort )
Na osnovu prosleđenih parametara funkcija pronalazi utičnicu i kao povratnu vrednost
vraća identifikator iste.
35
Sa pronađenom utičnicom i veličinom paket se prosleđuje funkciji koja realizuje i u
potpunosti odgovara TCP mašini stanja. Realizovana funkcija ima sledeću deklaraciju:
void HandleTCPSegment( TCP_SOCKET s, NetTCPPkt* pNetPkt, WORD len )
Funkcija na osnovu stanja utičnice pokreće odgovarajuće akcije. Moguća stanja su
definisana sledećom enumeracijom:
typedef enum _TCP_STATE{
SKT_CLOSED,
SKT_CREATED,
SKT_BOUND,
TCP_LISTEN,
TCP_SYN_RCVD,
TCP_SYN_SENT,
TCP_EST,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_FIN_WAIT_1,
TCP_RESET_RCVD,
TCP_CLOSE,
TCP_INVALID
} TCP_STATE;
Stanje SKT_CLOSED je inicijalno stanje utičnice. Posle poziva funkcije za kreiranje
utičnice prelazi se u stanje SKT_CREATED. Posle poziva funkcije tcp_bind() utičnica je u
stanju SKT_BOUND. U stanju TCP_LISTEN očekuje se zahtev za vezom. Ukoliko zahtev
stigne poziva se funkcija za procesiranje zahteva:
case TCP_LISTEN:
if ( pTCP->Flags & SYN ){
ProcessSYN( pSocket, pNetPkt );
}
U funkciji ProcessSYN se šalje ogovor u vidu postavljenih bitova SYN I ACK.
Takođe se setuje broj paketa n ainicijalnu vrednost dok se broj potvrde dobija tako što se broj
paketa iz primljenog paketa uveća za jedan.
U stanje SYN_RCVD se prelazi posle slanja odgovora na primljeni paket za ostvarenje
veze. Ukoliko se dok je utičnica u ovom stanju primi paket potvrde, to znači da je ostvaren
princip rukovanja (engl. handshaking) odnosno da je ostvarena veza. Posle toga prelazi se u
stanje ostvarenosti veze (TCP_EST) u kome je omugućena razmena paketa sa podacima. Na
svaki paket koji sadrži podatke, se po uspešnom prijemu u prijemnom baferu šalje paket
potvrde. Ukoliko se u stanju TCP_EST primi paket koji sadrži setovan bit FIN to je signal da
pošiljalac nema na raspolaganju više podataka za slanje i da se veza može sporazumno
prekinuti. Sve što ostaje je da se pošalje paket potvrde i da se oslobode resursi.
Prethodno opisane funkcije su pozadinske, što znači da krajnji korisnik nema
mogućnost manipulacije istim. Jedina funkcija koja korisniku omogućava prihvat dolazećih
podataka je prethodno opisana tcp_recv() iz BSD soket API-ja.
36
4.3 Slanje podataka
Gledano sa strane protokola, slanje podataka može biti inicirano od strane korisnika
kao i od strane pozadinskih procesa. Korisnik može da inicira prenos preko funkcije
tcp_send(). Iza tog poziva se krije poziv funkcije:
int TransmitTcpPkt(DWORD remoteIP, WORD localPort, WORD remotePort, DWORD tseq, DWORD tack, BYTE flags, NetTCPPkt *sbfr, WORD DataLen, struct MCSocket* pSock )
Parametri:
remoteIP – adresa odredišnog računara
localPort – port sa kog se šalju podaci na izvorišnom računaru
remotePort – port na kom odredišni računar osluškuje
tseq – broj paketa
tack – broj potvrde
flags – definiše kog je tipa paket. Moguće vrednosti ovog parametra su:
#define FIN 0x01 - kraj slanja #define SYN 0x02 - usaglašavanje rednih brojeva
#define RST 0x04 - nasilan prekid veze
#define PSH 0x08 - prisilan prenos
#define ACK 0x10 - polje potvrde uspešnog prijema
#define URG 0x20 - slanje hitnih podataka
sbfr – adresa paketa koji se šalje
DataLen – veličina podataka u bajtovima
pSock – adresa utičnice
Unutar funkcije se najpre vrši popunjavanja polja TCP i IP zaglavlja. Ukoliko je paket
koji se šalje sinhronizacioni, iza TCP zaglavlja se lepe opcije. Opcije sadrže maksimalnu
veličinu segmenta koja u našem slučaju iznosi 1460 bajta. Dužina polja opcije je četiri.
Relizacija je sledeća:
if( flags & SYN ){
options.Kind = TCP_OPTIONS_MAX_SEG_SIZE;
options.Length = 0x04;
options.MaxSegSize = htons(0x05b4);
memcpy( sbfr->data , (BYTE*)&options, sizeof(options));
hLen += sizeof(options);
}
37
Na kraju je potrebno na ukupnu dužinu dodati i dužinu opcija. Ukoliko paket sadrži
podatke za slanje potrebno ga je uvezati u red za retransmisiju. Ovo je potrebno da ukoliko se
paket izgubi izvrši njegova retransmisija. Za dodavanje paketa u red za retransmisiju je
realizovana funkcija:
void TCPAdd2AckList( struct MCSocket* pSock, AckListPkt pktPtr,WORD tcpPktLen )
Navedena funkcija dodaje paket na kraj reda i ažurira polje o broju nepotvrdjenih
paketa u redu za retransmisiju. Broj paketa u redu za retransmisiju je ograničen imenskom
konstantom:
#define MAX_TCP_TX_PKT_BFR 8
Ova konstanta u stvari predstavlja veličinu kliznog prozora. Naime, osam paketa će se
slati bez čekanja na potvrdu. Kako potvrde paketa pristižu tako se paketi koji su potvrđeni
briši iz reda za retransmisju. Funkcija koja ovo omogućuje je:
int DeQueAckList( struct MCSocket* pSock, int i)
Posle uvezivanja paketa u red za retransmisiju, paket se prosleđuje IP nivou tj.
funkciji:
int NetIpSnd(NetIpPkt *pIpPkt, unsigned short usLen)
CD kontroler je odgovoran za prihvatanje neobrađene binarne slike/videa sa senzora
(CMOS ili CCD) i prihvatanje YUV video podataka u raznim formatima koji obično dolaze
sa video dekoderskih uređaja. U slučaju binarne slike potrebno je sliku obraditi i
38
transformisati u potreban oblik. Ova obrada se može izvrišiti u modulu za obradu ili
programski. U paraleli sa obradom CCD kontroler može da izračunava statistiku slike (H3A i
histogram) za eventualnu kontrolu podešavanja parametara slike.
Bitne stvari koje CCD kontroler podržava su: ulazni bajer format, generisanje HD/VD
signala za sinhronizaciju, podržavanje senzora sa izvorom progresiv slika ili polu-slika,
senzore sa takatom do 90MHz, ulazni YCbCr 4:2:2 format bilo 8 ili 10 bita dužine.
IPIPE modul je odgovoran za transformaciju binarnih podataka sa senzora u format
YCbCr 4:2:2 koji je pogodan za kompresiju ili prikazivanje na ekran. Programiranje se vrši
preko kontrolnih i konfiguracionih registara. Podržane opcije su: primanje ulaznog signala u
standardnom bajer formatu, prihvatanje slike bilo sa CCD/CMOS senzora ili iz
SDRAM/DDRAM memorije, izlaz slike do 1280 tačaka širine, primene horizontalnog
median filtera, programibilnog filtera šuma, digitalno pojačanje boja i balans belog, gama
korekciju, programibilnu konverziju boja (RGB u YUV)…
CMOS senzor blok se sastoji od s-funkcije (u datoteci CMOScapture.c), pripadajuće tlc
skripte (CMOScapture.tlc) i modela sa maskom parametre(CMOScaptureBlock.mdl).
4.3.1 S-funkcija bloka
U datoteci CMOScapture.c se nalazi s-funkcija CMOScapture. Ona se sastoji od
sledećih metoda:
mdlCheckParameters(SimStruct *S) metoda za proveru parametara
mdlInitializeSizes(SimStruct *S) metoda sadrži definiciju za broj ulaza i izlaza.
if (!ssSetNumInputPorts(S, 0)) return;
if (!ssSetNumOutputPorts(S, 1)) return;
I definiciju parametara ulaza i izlaza. U ovom slučaju su veličine dinamičke jer
veličina slike zavisi od predhodnog bloka.
ssSetOutputPortDataType(S, 0, SS_UINT8);
ssSetOutputPortMatrixDimensions(S,0,DYNAMICALLY_SIZED,
DYNAMICALLY_SIZED)
ssSetOutputPortComplexSignal(S, 0, COMPLEX_NO);
ssSetOutputPortOptimOpts(S, 0, SS_REUSABLE_AND_LOCAL);
ssSetOutputPortOutputExprInRTW(S, 0, 0);
• mdlInitializeSampleTimes(SimStruct *S) metoda definiše vreme koraka simulacije što
u ovom slučaju nije od značaja.
• mdlSetWorkWidths(SimStruct *S) metoda sadrži registraciju parametara.
Naredne tri metode služe za postavljanje dimenzije i tipa izlaznog signala:
• mdlSetOutputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
• mdlSetDefaultPortDimensionInfo(SimStruct *S)
39
• mdlSetDefaultPortDataTypes(SimStruct *S)
• mdlOutputs(SimStruct *S, int_T tid) metoda mora da postoji a u ovom slučaju nije od
značaja.
4.3.2 Simulink blok
Simulink blok (Slika 18) ima jedan izlaz čije su dimenzije 2 puta rezolucija zadate
slike i koji predstavlja izlaz iz IPIPE modula procesora.
Slika 18 – Izgled CMOS senzor bloka
Maska bloka predstavlja grafičku spregu za unos parametara(Slika 19). U ovom
slučaju ima 32 parametara koja se mogu podešavati. Dva glavna parametra su visina i širina,
odnosno rezolucija slike za koju postoje i više predefinisanih vrednosti. Ostali parametri su
grupisanu u tri grupe: podešavanje senzora (sensor settings), podešavanje pojačanja (gain
settings) i podešavanje pregleda (previewer settings) .
• Podešavanje senzora se obavlja podešavanjem sledećih parametara: veličine polja,
pomeraja početka po horizontali i vertikali, osvetljenje, i četiri registara za modove
očitavanja (column address, row address, read mode 1, read mode 2).
• Podešavanje pojačanja može da bude analogno i digitalno i obavlja se za svaku boju u
bajerovom formatu posebno.
• Podešavanje pregleda uključuje podešavanje kontrasta i osvetljenja.
40
Slika 19 – Parametri CMOS senzor bloka
4.3.3 TLC skripta
Datoteka CMOScapture.tlc predstavlja TLC skriptu koja uz pomoć funkcija koje su
definisane u TLC skripti modela, generiše CCS projekat i odgovarajuće datoteke.
Kodovanje se obavlja uz pomoć date programske podrške odnosno strukture za svaki
modul koji se koristi. Za CMOS senzor blok je koriščen CCD kontroler i IPIPE modul.
Data je struktura kojom se definišu parametri za CCD kontroler. Komande TLC skripte
počinju znakom %. Za preuzimanje parametara i drugih parametara samog bloka koriste se
bibliotečke funkcije kao na primer %<LibBlockParameterValue(height, 0)> kojom se na
dato mesto postavlja vrednost visine.
%assign HEIGHT = LibBlockParameterValue(height, 0)
%assign WIDTH = LibBlockParameterValue(width, 0)
// CCDC configuration parameters
PSP_VPFECcdcConfigParams ccdcParams =
{
FVID_CCDC_RAW_FORMAT, /* dataFlow */
FVID_FIELD_MODE, /* ffMode */
41
%<HEIGHT> , /* height */
%<WIDTH>, /* width */
(%<WIDTH> *2), /* pitch */
0, /* horzStartPix */
0, /* vertStartPix */
NULL, /* appCallback */
{
MT9P031_Open, /* extVD Fxn */
MT9P031_Close,
MT9P031_Control,
},
0, /*segId */
{
PSP_VPFE_BITS12, /* dataSize */
PSP_VPFE_PACK8_16BITS_PIXEL, /* pack8 */
PSP_VPFE_DataPol_Normal, /* dataPol */
PSP_VPFE_SyncPol_Positive, /* VDSyncPol */
PSP_VPFE_SyncPol_Positive, /* HDSyncPol */
PSP_VPFE_SyncDir_Input, /* HDVDMaster */
50, /* HDSyncWidth */
4, /* VDSyncWidth */
800, /* numPxlPerLine*/
1000, /* numLinPerFld */
PSP_VPFE_ALaw_Disable, /* ALawEnable */
PSP_VPFE_ALaw_bits15_6, /* ALaw_Width */
}
};
U parametrima za CCD kontroler nalaze se i funkcije MT0P9031_Open,
MT0P9031_Close, MT0P9031_Control koje služe za inicijalizaciju, deinicijalizaciju i
kontrolu senzora. Ove funkcije su sadržane u datotekama MT9P031_extImageSensor.c i
MT9P031_extImageSensor.h koje su uključene u projekat.
U narednom kodu se nalazi struktura za podešavanje parametara senzora. Svi parametri se
preuzimaju iz bloka odgovarajućim funkcijama
// MT0P031 configuration parameters
MT9P031_FormatParams MT9P031Params={
0x8000, //pixel clock control
48,// M
5,// N
4,// P1
%<LibBlockParameterValue(rOff, 0)> ,//row start
%<LibBlockParameterValue(rSize, 0)>,//row size
%<LibBlockParameterValue(rOff, 0)> ,//col start
%<LibBlockParameterValue(cSize, 0)>,//col size
%assign mode = LibBlockParameterValue(test, 0)
%switch (mode)
%case 1
0,
42
%break
%default
%<mode> * 8 +1,
%break
%endswitch
%<LibBlockParameterValue(rm1, 0)>,//read mode 1
%<LibBlockParameterValue(rm2, 0)>, //read mode 2
%<LibBlockParameterValue(hBlank, 0)>,//horizontal blank
%<LibBlockParameterValue(vBlank, 0)>,//vertikal blank
%<LibBlockParameterValue(shuter, 0)>,//shutter width
%<LibBlockParameterValue(radd, 0)>,//row adrress mode
%<LibBlockParameterValue(radd, 0)>,//col address mode
0,//test green pattern
0,//test red pattern
0//test blue pattern
};
Parametri za podešavanje IPIPE modula se nalaze u datoteci previewer.c. Tu se nalaze
parametri slike kao i grupe koeficijenata za balans belog, RGB u RGB (eng. RGB blending),
CFA (eng. Color Filtar Array) i RGB u YUV.
Same komande za kreiranje logičkog kanal i podešavanje slike se prosleđuju preko FVID
funkcija na sledeći način.
Prvo kreiranje IPIPE logičkog kanala i prosleđivanje parametara:
PrevHandle = FVID_create("/previewer", IOM_INOUT, NULL, &prevChannel,NULL);
FVID_control(PrevHandle,PSP_PREVIEWER_IOCTL_SET_PARAMS, &PrevConfigParams)
Kreiranje logičkog kanala CCD kontrolera i prosleđivanje parametara:
ccdcHandle = FVID_create("/VPFE0",IOM_INOUT, NULL, &vpfeParams,&gioAttrs);
FVID_control(ccdcHandle,VPFE_ExtVD_BASE+PSP_VPSS_EXT_VIDEO_DECODER_CONFIG,&
MT9P031Params);
Organizacija prijema slike je takva da postoji ulazni kružni bafer sa minimalno 3 polja
za sliku. CCD kontroler smešta dolazne slike u bafer brzinom kojom pristižu dok se pri
obradi uzima najstarija slika iz bafera čime su obrada i prijem slike vremenski nezavisni.
Dodavanje alocirane memoriju u red bafera se vrši komandom
FVID_queue(ccdcHandle, ccdcFrm[i]);
Preuzimanje bafera sa slikom se vrši sa
FVID_dequeue(ccdcHandle, &capFrm);
Dok se automatski dodavanje praznog i preuzimanje punog bafer obavlja sa
FVID_exchange(ccdcHandle, &capFrm);
U generisanom kodu u procesnoj petlji je smešten naredni deo koda koji samo prvi
put preuzme pun bafer a svaki sledeće zameni prazan sa punim. Koji zatim dodeljuje
43
pokazivač na podatke slike promenljivoj sa nazivom izlaznog signala tako da bi sledeći blok
u nizu mogao da preuzme taj podatak.
if (firstFrame) { /* Transfer ownership of one frame from driver to application */
FVID_dequeue(ccdcHandle, &capFrm);
firstFrame = FALSE;
}
else {
FVID_exchange(ccdcHandle, &capFrm);
}
%assign outSignalName = FEVAL("getSignalName",
LibBlockOutputSignal(0, "", "", 0))
%<outSignalName> = (uint8_T *) capFrm->frame.frameBufferPtr;
4.4 Skaler slike (Resizer)
Skaler slike je deo VPFE modula koji je fizička implementacija polifaznog filtera za
operaciju skaliranja. Skaler slike može da operiše na YCbCr 4:2:2 formatu slike ili formatu sa
odvojenim poljem boja na primer RGB 8:8:8. Skaler koristi sledeće algoritme za skaliranje:
• Bi-linearnu interpolaciju
• Bi-kubik interpolaciju
• Nikvistov niskopojasni filtar
Za povećanje slike može da se koristi bilo koji od ova tri metoda, a za smanjenje se
prvo koristi niskopojasni filtar da bi se izbegao aliasing efekat. Od 1/4X do X, skaler koristi
četvorofazni polifazni filtar, a za X do 4X skaliranje koristi osmofazni polifazni filtar. Izbor
filtra se vrši automatski na bazi faktora skaliranja Skaler radi u 2 etape, horizontalnoj i
vertikalnoj. Ulaz može da bude sa CCD kontrolera ili iz memorije.
4.4.1 S-funkcija bloka
U datoteci resizer.c je definisana s-funkcija sa imenom „resizer“. Ona se sastoji od
sledećih metoda:
• mdlCheckParameters(SimStruct *S)
• mdlInitializeSizes(SimStruct *S)
• mdlInitializeSampleTimes(SimStruct *S)
• mdlSetWorkWidths(SimStruct *S)
• mdlSetInputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
44
• mdlSetOutputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
• mdlSetDefaultPortDimensionInfo(SimStruct *S)
• mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dataType)
• mdlSetOutputPortDataType(SimStruct *S, int port, DTypeId dataType)
• mdlSetDefaultPortDataTypes(SimStruct *S)
• mdlOutputs(SimStruct *S, int_T tid)
4.4.2 Simulink model
Model skalera slike (Slika 20) može da se koristi u sprezi sa bilo kojim izvorom slike
u odgovarajućem formatu. Preko ulazne sprege preuzima rezoluciju ulazne slike a u
parametrima se postavlja rezolucija izlazne slike.
Slika 20 – Izgled bloka za skaliranje slike
Pored rezolucije u parametrima skalera slike (Slika 21) može da se postavi i deo slike
koji će biti skaliran, kao i načini skaliranja.
45
Slika 21 – Parametri bloka za skaliranje slike
4.4.3 TLC skripta
Struktura za podešavanje parametara skalera slike sve vrednosti preuzima iz
odgovarajućeg bloka:
/* Params structure for configuration of parameters for channel 1 */ PSP_RSZparams params =
{
%<LibBlockInputSignalDimensions(0)[0]> /2, /* Input image width */
%<LibBlockInputSignalDimensions(0)[1]>, /* Input image height */
%<LibBlockInputSignalDimensions(0)[0]>, /* Input image pitch */
%switch(LibBlockParameterValue(imgType, 0))
%case 1
PSP_RSZ_INTYPE_YCBCR422_16BIT, /* Input image type */
%break
%case 2
PSP_RSZ_INTYPE_PLANAR_8BIT, /* Input image type */
46
%break
%endswitch
%<LibBlockParameterValue(vPix, 0)>, /* Vertical starting pixel */
%<LibBlockParameterValue(hPix, 0)>, /* Horizonatl starting pixel */
%if (LibBlockParameterValue(LumaProc, 0) == 1)
PSP_RSZ_CBILIN_DISABLE, /* Chroma position */
%else
PSP_RSZ_CBILIN_ENABLE, /* Chroma position */
%endif
%switch(LibBlockParameterValue(pixFormat, 0))
%case 1
PSP_RSZ_PIX_FMT_UYVY, /* Image format */
%break
%case 2
PSP_RSZ_PIX_FMT_YUYV, /* Image format */
%break
%case 3
PSP_RSZ_PIX_FMT_PLANAR, /* Image format */
%break
%endswitch
%<LibBlockParameterValue(ow, 0)>, /* Intermediate image width */
%<LibBlockParameterValue(oh, 0)>, /* Intermediate image height */
%<LibBlockParameterValue(oPitch, 0)>,/* Intermediate image pitch */
%<LibBlockParameterValue(hStart, 0)>, /* Horizontal starting phase */
%<LibBlockParameterValue(vStart, 0)>, /* Vertical starting phase */
gRDRV_reszFilter4TapHighQuality, /* Horizontal filter coefficients */
gRDRV_reszFilter4TapHighQuality, /* Vertical filter coefficients */
%switch(LibBlockParameterValue(lumEnchance, 0))
%case 1
PSP_RSZ_YENH_DISABLE /* Luma enhancement options */
%break
%case 2
PSP_RSZ_YENH_3TAP_HPF /* Luma enhancement options */
%break
%case 3
PSP_RSZ_YENH_5TAP_HPF /* Luma enhancement options */
%break
%endswitch
};
U inicijalizaciji se kreira logički kanal i prosleđuju se parametri:
47
rszfd =FVID_create("/resizer", IOM_INOUT, NULL,(void *)&memSegId
,&gioAttrs);
FVID_control(rszfd, PSP_RSZ_IOCTL_SET_PARAMS, ¶ms);
Za skaliranje je još potrebno ukazati na ulazni i izlazni bafer i veličinu bafera a zatim izvršiti
samo skaliranje. I naravno proslediti pokazivač na sliku narednom bloku:
resize.inBufSize=%<LibBlockInputSignalDimensions(0)[0]> *
<LibBlockInputSignalDimensions(0)[1]>*2;
resize.outBufSize =%<LibBlockParameterValue(oPitch, 0)> *
%<LibBlockParameterValue(oh, 0)>*2;
resize.inBuf = %<inSignalName>;
resize.outBuf = prevBuff->frame.frameBufferPtr;
FVID_control(rszfd, PSP_RSZ_IOCTL_RESIZE, &resize) )
%assign outSignalName=
FEVAL("getSignalName",LibBlockOutputSignal(0,"","",0))
%<outSignalName> = prevBuff->frame.frameBufferPtr;
4.5 H3A blok
H3A modul je dizajniran za podršku kontrolne petlje za automatski fokus AF (eng Auto
focus), automatski balans belog AWB (eng Automatic White Balance) i automatskog
osvetljenja AE (eng. Auto Exposure) računanjem statistike slike ili videa. Statistika slike se
koristi za podešavanje raznih parametara u procesu obrade slike.
Postoje dva glavna bloka u H3A modulu:
• Auto fokus (AF)
• Automatsko osvetljenje (AE) i automatski balans belog (AWB)
AF izvodi i filteriše podatke za crvenu zelenu i plavu boju i dobavlja bilo
nagomilavanja ili maksimume vrednosti u specificiranom regionu. Specificirani region je
dvodimenzionalni blok podataka koji predstavlja prozor nad kojim se vrši obrada. AF
podržava veći broj prozora, čija je veličina ista i može da se podesi.
AE/AWB akumulira i proverava zasićenje vrednosti u određenom regionu slike. Broj
prozora/regiona je takođe podesiv kao i visina i širina.
48
4.5.1 S-funkcija bloka
U datoteci h3a.c je definisana s-funkcija h3a. Ona se sastoji od sledećih metoda:
• mdlCheckParameters(SimStruct *S)
• mdlInitializeSizes(SimStruct *S)
• mdlInitializeSampleTimes(SimStruct *S)
• mdlSetWorkWidths(SimStruct *S)
• mdlSetInputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
• mdlSetOutputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
• mdlSetDefaultPortDimensionInfo(SimStruct *S)
• mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dataType)
• mdlSetDefaultPortDataTypes(SimStruct *S)
• mdlOutputs(SimStruct *S, int_T tid)
4.5.2 Model bloka
H3A blok (Slika 22) se povezuje na izlaz CMOS senzor bloka. Izlaz H3A bloka je vektor
podataka čija veličina zavisi od broja prozora.
Slika 22 – Izgled H3A bloka
U parametrima bloka se bira osnovna funkcija: automatsko osvetljenje/balans belog
AEW ili automatski fokus AF.
49
Slika 23 – Parametri H3A bloka za automatsko osvetljenje i balans belog
U parametrima za automatsko osvetljenje i balans belog (Slika 23) se definiše veličina
i pozicija prozora na slici nad kojim se izračunava statistika, kao i broj prozora i pomeraj po
vertikali i horizontali.
Podaci koji se dobijaju za jedan prozor su:
Green sub sample accumulator
Red sub sample accumulator
Blue sub sample accumulator
Green sub sample accumulator
Green saturator accumulator
Red saturator accumulator
Blue saturator accumulator
Green saturator accumulator
50
U parametrima za automatski fokus AF (Slika 24) se takođe definišu veličina i
pozicija prozora na slici nad kojim se izračunava statistika, kao i broj prozora i pomeraj.
Vrednosti koje se dobijaju za jedan region su:
Green Sum
Peak sum from IIR filter 0 (green)
Peak sum from IIR filter 1 (green)
0
Red Sum
Peak sum from IIR filter 0 (red)
Peak sum from IIR filter 1 (red)
0
Blue Sum
Peak sum from IIR filter 0 (blue)
Peak sum from IIR filter 1 (blue)
Slika 24 – Parametri H3A bloka za automatski fokus
51
4.5.3 TLC skripta
U TLC skripti se nalaze struktura za postavljanje AF parametara:
PSP_AFParams H3Aparams ={
%if (LibBlockParameterValue(af_Alaw, 0) == 1)
PSP_AF_ALAW_ENABLE, /* A Law Status */
%else
PSP_AF_ALAW_DISABLE, /* A Law Status */
%endif
{
%if (LibBlockParameterValue(mEnable, 0) == 1)
PSP_AF_HMF_ENABLE, /* HMF Status */
%else
PSP_AF_HMF_DISABLE, /* HMF Status */
%endif
/* Threshold value */
%<LibBlockParameterValue(mTreshold, 0)>,
},
%switch( LibBlockParameterValue(rgbPos, 0) )
%case 1
PSP_AF_GR_GB_BAYER,
%break
%case 2
PSP_AF_RG_GB_BAYER,
%break
%case 3
PSP_AF_GR_BG_BAYER,
%break
%case 4
PSP_AF_RG_BG_BAYER,
%break
%case 5
PSP_AF_GG_RB_CUSTOM,
%break
%case 6
PSP_AF_RB_GG_CUSTOM,
%break
%default
PSP_AF_GR_BG_BAYER, /* RGB position */
%break
%endswitch
/* IIR Filter Configuration */
{
2u, /* IIR Horizontal start
*/
/*IIR Filter coefficients for set 0 */
{
64, 0, 0, 21, 22, 21, 0, 0, -16, 32, -16,
},
52
/*IIR Filter coefficients for set 1 */
{
64, 0, 0, 21, 22, 21, 0, -29, -16, 32, -16,
},
},
/* Paxel Configuration */
{
%<LibBlockParameterValue(pWidth, 0)>, /* width */
%<LibBlockParameterValue(pHeight, 0)>, /* height */
%<LibBlockParameterValue(pHstart, 0)>, /* hzStart */
%<LibBlockParameterValue(pVstart, 0)>, /* vtStart */
%<LibBlockParameterValue(pHcount, 0)> , /* hzCnt */
%<LibBlockParameterValue(pVcount, 0)> , /* vtCnt */
%<LibBlockParameterValue(pLine, 0)>, /* lineIncr */
},
%if (LibBlockParameterValue(mode, 0) == 1)
PSP_AF_ACCUMULATOR_SUMMED, /* Accumulator Mode */
%else
PSP_AF_ACCUMULATOR_PEAK,
%endif
};
Struktura za postavljanje AEW parametara:
PSP_AEWParams AewParams =
{
%if (LibBlockParameterValue(aew_Alaw, 0) == 1)
PSP_AEW_ALAW_ENABLE, /* A Law Status */
%else
PSP_AEW_ALAW_DISABLE, /* A Law Status */
%endif
%<LibBlockParameterValue(satLimit, 0)>, /* Saturation limit */
{
%<LibBlockParameterValue(wWidth, 0)>, /* width */
%<LibBlockParameterValue(wHeight, 0)>, /* height */
%<LibBlockParameterValue(wHstart, 0)>, /* horizontal start */
%<LibBlockParameterValue(wVstart, 0)>, /* vertical start */
%<LibBlockParameterValue(wHcount, 0)> , /* horizontal count */
%<LibBlockParameterValue(wVcount, 0)> , /* vertical count */
%<LibBlockParameterValue(wHline, 0)>,/*horizontal line increament*/
%<LibBlockParameterValue(wVline, 0)>,/*vertical line increament */
},
{
%<LibBlockParameterValue(bwHeight, 0)>,/*black window height */
%<LibBlockParameterValue(bwStart, 0)>,/*black window vertical start*/
}
};
53
Kreiranje logičkog kanala i prosleđivanje parametara se smešta u funkciju za inicijalizaciju:
afHandle = FVID_create("/H3A0",IOM_INOUT,&gioStatus,&typeAF,&gioAttrs);
FVID_control(afHandle, PSP_H3A_IOCTL_SET_PARAM, &H3Aparams))
Kod H3A bloka se prosleđivanje praznog i preuzimanje punog bafera izvršava na drugačiji
način.Prvo se podesi odgovarajuću bafer :
/* Enqueue the buffer, This will enable AEW engine */
enbufferAF.size = H3A_AF_BUFFER_SIZE;
enbufferAF.ramIpAddr = (Ptr)(arrayh3AAF);
bufferSize = sizeof(PSP_H3ABuffer);
FVID_submit(afHandle, PSP_VPSS_QUEUE,&enbufferAF,&bufferSize, NULL);
Kreiranje i podešavanje parametara je standardno kao za ostale module sistema:
aewHandle = FVID_create("/H3A0",IOM_INOUT,&gioStatus,&typeAew,&gioAttrs);
FVID_control(aewHandle, PSP_H3A_IOCTL_SET_PARAM, &AewParams);
U delu za obradu slike se postavljaju naredbe za dodeljivanje praznog i preuzimanje punog
bafera, kao i prosleđivanje pokazivača na bufer:
FVID_submit(afHandle, PSP_VPSS_DEQUEUE,&debufferAF,&bufferSize, NULL);
FVID_submit(afHandle, PSP_VPSS_QUEUE,&enbufferAF,&bufferSize, NULL);
%assign outSignalName=
FEVAL("getSignalName",LibBlockOutputSignal(0,"","",0))
%<outSignalName> =
(%<LibBlockOutputSignalDataTypeName(0,"")>*)debufferAF.ramIpAddr;
4.6 Histogram blok
Histogram modul prihvata sirovu sliku ili video (3 ili 4 boje) i slaže grupe od tačaka na
bazi vrednosti (za svaku boju posebno). Svaka grupa sadrži broj tačaka čija vrednost upada u
odgovarajući opseg.
Histogram preuzima sliku sa CCD/CMOS senzora. Podržava do četiri regiona i svaki
region ima svoju horizontalnu/vertikalnu početnu i krajnju poziciju. Ako se regioni
preklapaju tačke se akumuliraju u region najvišeg prioriteta (najveći prioritet
region0>region1>region2>region3). Broj grupa može biti 32, 64, 128 ili 256 za svaku boju
po regionu.
54
Za broj regiona 1, dopušteno je 32, 64, 128 ili 256 grupa po boji
Za broj regiona 2, dopušteno je 32,64 ili 256 grupa po boji.
Za broj regiona 3 i 4, dopušteno je 32 ili 64 grupa po boji.
4.6.1 S-funkcija bloka
U datoteci histogram.c je definisana s-funkcija histogram. Ona se sastoji od sledećih
metoda:
• mdlCheckParameters(SimStruct *S)
• mdlInitializeSizes(SimStruct *S)
• mdlInitializeSampleTimes(SimStruct *S)
• mdlSetWorkWidths(SimStruct *S)
• mdlSetInputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
• mdlSetOutputPortDimensionInfo(SimStruct *S, int_T portIndex, const DimsInfo_T
*dimsInfo)
• mdlSetDefaultPortDimensionInfo(SimStruct *S)
• mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dataType)
• mdlSetOutputPortDataType(SimStruct *S, int port, DTypeId dataType)
• mdlSetDefaultPortDataTypes(SimStruct *S)
• mdlOutputs(SimStruct *S, int_T tid)
4.6.2 Model bloka
Histogram blok (Slika 25) može da se poveže samo na CMOS senzor blok sa koga
preuzima sliku za izračunavanje histograma. Izlaz je vektor podataka veličine 512 ako je
broj grupa 32 inače 1024.
Slika 25 – Izgled histogram bloka
55
U parametrima (Slika 26) se podešava pozicija i veličina regiona i može ih biti
maksimalno četiri. Pored toga može da se bira broj grupa iz padajućeg menija i skaliranje
rezultata pomeranjem u desno.
Slika 26 – Parametri histogram bloka
4.6.3 TLC skripta
TLC skripta koja odgovara modulu histogram (histogram.tlc) sadrži strukturu kojom se
sam modul podešava:
/* Histogram configuration parameters */
PSP_HISTparam histConfigParams =
{
%if (LibBlockParameterValue(oClear, 0) == 1)
PSP_HIST_CLEAR_AFTER_READ, /* clearOpDataAfterRead */
%else
PSP_HIST_NO_CLEAR_AFTER_READ, /* clearOpDataAfterRead */
%endif
%switch( LibBlockParameterValue(bin, 0) )
%case 1
PSP_HIST_32BINS, /* bins */
%break
%case 2
PSP_HIST_64BINS, /* bins */
56
%break
%case 3
PSP_HIST_128BINS, /* bins */
%break
%case 4
PSP_HIST_256BINS, /* bins */
%break
%endswitch
%switch( LibBlockParameterValue(hShift, 0) )
%case 1
PSP_HIST_DATA_RSHIFT_ZERO, /* shift */
%break
%case 2
PSP_HIST_DATA_RSHIFT_ONE, /* shift */
%break
%case 3
PSP_HIST_DATA_RSHIFT_TWO, /* shift */
%break
%case 4
PSP_HIST_DATA_RSHIFT_THREE, /* shift */
%break
%case 5
PSP_HIST_DATA_RSHIFT_FOUR, /* shift */
%break
%case 6
PSP_HIST_DATA_RSHIFT_FIVE, /* shift */
%break
%case 7
PSP_HIST_DATA_RSHIFT_SIX, /* shift */
%break
%case 8
PSP_HIST_DATA_RSHIFT_SEVEN, /* shift */
%break
%default
PSP_HIST_DATA_RSHIFT_TWO, /* shift */
%break
%endswitch
{
%<LibBlockParameterValue(wbGain1, 0)>, /* wbGain[0] */
%<LibBlockParameterValue(wbGain2, 0)>, /* wbGain[1] */
%<LibBlockParameterValue(wbGain3, 0)>, /* wbGain[2] */
%<LibBlockParameterValue(wbGain4, 0)> /* wbGain[3] */
},
{
{
%<LibBlockParameterValue(reg0_hs, 0)>,/* region[0].hStart */
%<LibBlockParameterValue(reg0_he, 0)>,/* region[0].hEnd */
%<LibBlockParameterValue(reg0_vs, 0)>,/* region[0].vStart */
%<LibBlockParameterValue(reg0_ve, 0)> /* region[0].vEnd */
},
{
%<LibBlockParameterValue(reg1_hs, 0)>,/* region[1].hStart */
%<LibBlockParameterValue(reg1_he, 0)>,/* region[1].hEnd */
%<LibBlockParameterValue(reg1_vs, 0)>,/* region[1].vStart */
%<LibBlockParameterValue(reg1_ve, 0)> /* region[1].vEnd */
},
57
{
%<LibBlockParameterValue(reg2_hs, 0)>,/* region[2].hStart */
%<LibBlockParameterValue(reg2_he, 0)>,/* region[2].hEnd */
%<LibBlockParameterValue(reg2_vs, 0)>,/* region[2].vStart */
%<LibBlockParameterValue(reg2_ve, 0)> /* region[2].vEnd */
},
{
%<LibBlockParameterValue(reg3_hs, 0)>,/* region[3].hStart */
%<LibBlockParameterValue(reg3_he, 0)>,/* region[3].hEnd */
%<LibBlockParameterValue(reg3_vs, 0)>,/* region[3].vStart */
%<LibBlockParameterValue(reg3_ve, 0)> /* region[3].vEnd */
}
}
};
Kreiranje logičkog kanala i prosleđivanje parametara je standardno:
histHandle= FVID_create("/histogram",IOM_INPUT, &gioStatus,
hEdma,&gioAttrs);
FVID_control(histHandle, PSP_HIST_IOCTL_SET_PARAMS,&histConfigParams)
Povezivanje praznog bafera u red se vrši kao i za H3A blok:
FVID_submit(histHandle, PSP_VPSS_QUEUE,(Ptr)(&inbuff[par]),
(Ptr)(&sizeOfbuff), NULL)
Pri obradi video slike razmena praznog i punog bafera i prosleđivanje pokazivača sledećem
bloku je data u narednom delu koda:
FVID_submit(histHandle, PSP_VPSS_DEQUEUE,(Ptr)(&outbuff),
(Ptr)(&sizeOfbuff), NULL) )
%assign outSignalName = FEVAL("getSignalName", LibBlockOutputSignal(0, "",
"", 0))
%<outSignalName> = (%<LibBlockOutputSignalDataTypeName(0,"")> *)
outbuff->ramIpAddr;
58
5 Ispitivanje
Ispitivanje je obavljeno startovanjem simulink modela koji sadrže date blokove i
proveravanjem ispravnosti rada generisanog koda.
Svaki model mora da sadrži:
DM6437EVM blok u kome su podešavanja za konfiguraciju ploče.
DSP/BIOS blok koji definiše naziv niti, prioritet, memoriju koju će koristiti i veličinu
magacinske memorije.
Blok funkcije, koji sadrži korisnički model koji će biti izvršavan u niti definisanoj u
DSP/BIOS bloku.
Kod ispitivanja H3A i histogram bloka korišćen je pomoćni blok „To File“ koji ulazni
vektor upisuje u zadatu datoteku.
Slika 27 – Izgled osnovnog modela
59
5.1 Ispitivanje CMOS senzor bloka
Ispitivanje ovog bloka je je prvo urađeno modelom “s kraja na kraj” (eng.loopback), gde
se slika sa CMOS senzora šalje direktno na izlaz. Izlaz je u kompozit PAL formatu i povezuje
se na bilo koji uređaj odnosno ekran koji ima kompozitni ulaz. U ovom slučaju DM6437
EVM ploča radi kao obična kamera i prikazuje sliku koju prima senzor, na ekran.
Generisanje koda je ispitivano sa raznim podešavanjem parametara CMOS senzor
bloka i slika je bila promenjena u skladu sa promenjenim parametrima.
Slika 28 – Osnovni primer upotrebe CMOS senzor bloka
Slika 29 – Prikaz slike sa senzora na ekran
60
Model koji vrši obradu sa slikom kojim je blok testiran je prikazan na slici 30. Ovde
se slika sa CMOS senzor bloka prvo odgovarajućim blokom razdvaja u komponente Y Cb Cr.
Nad Y komponentom se vrši obrada, odnosno detektuje se pomeraj na slici. Slika sa
obrađenom detekcijom pokreta se ponovo prepliće sa komponentama boje i šalje na izlazni
blok.
Slika 30 –Primer modela za detekciju pokreta sa CMOS senzor blokom
Slika 31 –Prikaz slike sa detekcijom pokreta
61
5.2 Ispitivanje skalera slike
Ispitivanje je odrađeno u modelu u kome blok prima sliku sa CMOS senzor bloka,
skalira sliku i šalje na izlaz. Skaliranje je testirano povećavanjem i smanjivanjem slike.
Slika 32 –Primer modela sa upotrebom bloka za skaliranje slike
5.3 Ispitivanje H3A bloka
Modul H3A odrađuje statistiku slike koja može da se koristi za regulaciju osvetljenja i
balansa belog ili automatski fokus. U ovom slučaju blok može da se poveže samo na CMOS
senzor blok pošto se statistika izračunava samo na slici u bajer formatu. Izlazne vrednosti su
zarad provere povezane na “To File” pomoćni blok koji generiše kod kojim se podaci upisuju
u zadatu datoteku.
Slika 33 –Primer modela sa upotrebom H3A bloka
62
5.4 Ispitivanje histogram bloka
Histogram modul takođe izračunava tražene podatke sa slike bajer formata tako da je i u
testnom modelu povezan na CMOS senzor blok. Izlaz se upisuje u zadatu datoteku pomoću
“To File” bloka. Izlazni podaci se mogu kopirati u dati šablon za program “excel” i videti
histogram dijagram.
Slika 34 – Primer modela sa histogram blokom
Slika 35 – Histogram jednog regiona
63
6 Zaključak
U ovom radu je opisano jedno rešenje automatskog generisanja koda na osnovu Simulink
modela na ploči DM6437EVM sa povezanim CMOS senzorom MT9P031. Ovakvim
generisanjem koda korisniku je prepušteno da se posveti samoj obradi ne obraćajući pažnju
na nivo ispod, odnosno samu implementaciju. Dovoljno je da poznaje radu u Simulink
okruženju.
Prednosti ovakvog „programiranja“ su:
Doslednost i ekvivalentnost sepecificiranog modela i implementacije.
Visok i konzistentan kvalitet generisanog koda uzevši u obzir greške i čitljivost.
Efikasnija faza implementacije
Brža izrada prototipova projekta
Uz moćnu platformu kakva je DM6437EVM čak i mnoge zahtevne obrade će raditi u
realnom vremenu što povećava upotrebljivost ovog rešenja za ispitivanje i razvoj programske
podrške za obradu slike.
Dalji razvoj je moguć dodavanjem dodatnih blokova koje ploča podržava kao što je
modul za audio obradu ili serijske sprege čime bi se pokrila kompletna audio-video obrada i
kreiranjem biblioteke. A izradom namenskih blokova za specifičnu obradu i mogućnost
dodavanja korisničkih blokova na osnovu gotovog koda bi se proširila mogućnost upotrebe.
64
7 Literatura
[1] TMS320DM6437 EVM Technical Reference, March 2007
[2] TMS320DM6437 Digital Media Processor (Rev. D)
[2] TMS320DM643x DMP Video Processing Front End (VPFE) User's Guide (Rev. A)
[3] Understanding the Davinci Preview Engine (Rev. A)
[3] www.ti.com
[4] http://focus.ti.com/docs/prod/folders/print/tms320dm6437.html
[5] http://www.mathworks.com/
[6] http://www.mathworks.com/access/helpdesk/help/helpdesk.html
65
8 Dodatak
8.1 Podizanje sistema iz NAND memorije
Da bi se ugrađeni program za podizanje sistema-boot loader podesio za podizanje sistema
iz NAND memorije potrebno je bootmode ( BM[3:0] ) podešavanja u BOOTCFG registru
podesiti na 0111. Što se na DM6437EVM razvojnoj ploči podešava uz pomoć prekidača SW1
kao na slici 36.
Slika 36 – Raspored prekidača na ploči za podizanje sistema iz NAND memorije
Podešavanje izlaznih pinova EMIF-e se podešava pomoću registra PINMUX0 i polja AEM
[2:0]. AEM polje može biti podešeno na dva načina, a uz pomoć SW2 grupe prekidača:
100 - 8-bit EMIFA (NAND) + 8-bit CCDC (VPFE) + 16-bit VENC (VPBE)
101 - 8-bit EMIFA (NAND) + 16-bit CCDC (VPFE) + 8-bit VENC (VPBE)
Bootloader prihvata informacije u formi skripte, nazvane AIS (eng. Application Image
Script). Ova skripta je binarna datoteka koja sadrži razne komande koje interpretira i izvršava
booloader. Prevedeni kod se uz pomoć perl skripte genAIS.pl prevodi u AIS format a
upisivanje u NAND memoriju se vrši pomoću projekta NANDwriter. Čime je ploča spremna
za podizanje program sistema iz NAND memorije.
66
8.2 Primer modela za prenosa slike preko LAN-a
Pošto ploča sadrži EMAC kontroler, omogućen je prenos podataka preko LAN
(eng.Local Area Network) mreže. U datom primeru (Slika 37) slika se preuzima sa CMOS
senzora i preko TCP/IP konekcije šalje prijemnoj strani. Prijemna strana (Slika 38) je model
koji se izvršava na PC računaru, i prikazuje primljenu sliku u video prozoru (Slika 39).
Slika 37 – Primer modela za slanje slike preko TCP/IP protokola
Slika 38 – Primer modela za prijem slike na PC računaru
Slika 39 – Video prozor za prikaz slike