[pso] intrebari tema 2 linux
Alexandru Tudose
alexandru.tudose at gmail.com
Wed Apr 18 21:22:20 EEST 2007
Va multumesc foarte mult pentru raspunsuri! Este tare reconfortant sa nu te
bati cu capul de perete de unul singur :-)
Three more questions if i may:
- bitul 0 din Interrupt Identification Register are vreun folos? (Interrupt
pending / No interrupt pending)
- din cele 4 intreruperi, folosul lui RDAI si THREI il inteleg acum, dar
Modem Status Interrupt si Receiver Line Status Interrupt au vreo
intrebuintare in cadrul temei? par sa nu fie legata in setup-ul NULL modem
care este pe masina virtuala, dar Catalin a mentionat ceva despre 3
interrupts de interes mai sus.
- cum vad de cate ori pot face read / write in FIFO fara sa citesc / scriu
prea mult in FIFO la urmatoarea operatie?
Vad ca FIFO (FCR) are o setare in bitii 6 si 7 care spune ca intreruperea de
RDAI sa se triggereze la 14bytes de data available; deci in RDAI pot conta
ca pot citi 14 bytes; dar ce ma fac daca bufferul este almost full si nu mai
am loc sa scriu decat, de exemplu 8?
Si cum stiu cat sa scriu in THREI? scriu tot ce am de scris, si ma bazez ca
pe partea cealalta RDAI se misca destul de repede? pe de alta parte ce se
intampla daca eu tot scriu pe un COM si de partea cealalta nu este nimeni
interesat sa citeasca? dau drumul la tot pe COM1 si pe COM2 vor fi multe
erori de overrun dupa umplerea buffer-ului si c'est la vie?
On 4/18/07, Catalin Ionita <io.catalin at gmail.com> wrote:
>
> Salut,
>
> O sa incerc sa te ajut pe cat posibil,
>
> "- pentru testul de scriere com1 -> com2 banuiesc ca se poate folosi ceva
> de genul echo "xxx" > /dev/com1
> - asta va apela pe rand functiile open, write si close din driverul meu "
>
> Da e corect.
>
> "cand cineva va face read pe com2, se apeleaza read care va returna ceva
> din buffer-ul de read, sau se va bloca daca nu este nimic disponibil "
>
> Conform enuntului temei readul si write-ul sunt blocante (adica daca nu
> exista caractere suficiente pentru a
> le servii raman blocate)
>
> "dar unde intra intreruperile aici? trebuie sa fac din write-ul meu din
> com1, direct outb pe i/o porturile lui com2 ceea ce va declansa o
> intrerupere pe com2 si se vor pune astfel in handler date le in bufferul de
> read?
> in ce caz s-ar declansa o intrerupere de interes pentru bufferul de
> write?"
>
> In primul rand trebuie sa intelegi ca tu scrii un driver care
> implementeaza functionalitatea porturilor seriale.
> Pe masina virtuala este facut un artificiu prin care se leaga cele 2
> porturi prin pipeuri. Deci ideea e ca daca scrii ceva pe com1 automat se va
> transmite catre com2 si invers. Gandestete ca daca cele doua porturi nu ar
> fi legate intre ele si ai fi facut o retea intre 2 calculatoare nu ai mai fi
> putut sa faci ceva de genu "trebuie sa fac din write-ul meu din com1, direct
> outb pe i/o porturile lui com2" pt ca mesajut tau trebuia sa ajunga prin
> retea la celalalt calculator. Si la fel : nu stii cand primesti raspunsuri
> inapoi.
> Din cauza aceasta se folosesc intreruperi.Acum nu o sa intru in detalii
> cum ca sunt intreruperi soft (4 si 3 pt com1 com2) recunoscute de sistemul
> de operare si intreruperi hardware specifice echipamentului (vreo 4 parca la
> numar din care te intereseaza numai 3).
> "in ce caz s-ar declansa o intrerupere de interes pentru bufferul de
> write?"
> Daca tu folosesti bufferul de write pt a trimite din user-space in kernel
> si dupa catre modem pt transmisie
> in mod logic o intrerupere hardware care iti semnalizeaza ca buferul de
> transmisie e gol e de interes si poti sa trimiti in continuare caractere din
> bufer.
>
> "In legatura cu presupunerea legata de CN si PM, pentru cei care se uita
> putin cam stramb la pagina beyondlogic... mi-ai mai putea recomanda niste
> resurse?"
>
> sursele de aici referitoare la serial sunt mai mult decat complete. Exista
> cod in C care te va ajuta la setarea
> parametrilor modemului pe acolo , tot ce trebuie sa faci e sa citesti cu
> atentie.
>
> "PS: driverul trebuie sa fie SMP safe?"
> De cand s-a introdus conceptul de muti-threading si preemptivitate a
> kernelului nu se mai pune problema la nivel de multiprocesor. Este logic ca
> daca ai mai multe treaduri kernel, acesul la datele partajate (cum ar fi o
> lista in care se memoreaza ceva) sa fie safe. Oricum un kernel ups te va
> anunta daca codul e safe sau nu la testare.
>
> Numai bine,
> Catalin Ionita
>
> On 4/18/07, Alexandru Tudose <alexandru.tudose at gmail.com> wrote:
> >
> > Nu prea inteleg separarea intre functia de write/read si handlerele de
> > intrerupere:
> >
> > - pentru testul de scriere com1 -> com2 banuiesc ca se poate folosi
> > ceva de genul echo "xxx" > /dev/com1
> > - asta va apela pe rand functiile open, write si close din driverul meu
> >
> > - in write (din cate am inteles...) pun datele in bufferul de write,
> > sau ma blochez daca nu am loc
> > - cand cineva va face read pe com2, se apeleaza read care va returna
> > ceva din buffer-ul de read, sau se va bloca daca nu este nimic disponibil
> >
> > dar unde intra intreruperile aici? trebuie sa fac din write-ul meu din
> > com1, direct outb pe i/o porturile lui com2 ceea ce va declansa o
> > intrerupere pe com2 si se vor pune astfel in handler date le in bufferul de
> > read?
> > in ce caz s-ar declansa o intrerupere de interes pentru bufferul de
> > write?
> >
> > In legatura cu presupunerea legata de CN si PM, pentru cei care se uita
> > putin cam stramb la pagina beyondlogic... mi-ai mai putea recomanda niste
> > resurse?
> >
> > PS: driverul trebuie sa fie SMP safe?
> >
> > scuze pentru miile de intrebari, dar daca nu intreb raman in ceata...
> > Multumesc mult,
> > Alex.
> >
> > On 4/9/07, Mihai Florian <my_mihai_florian at yahoo.com> wrote:
> > >
> > > Buna,
> > >
> > > Cred ca problema este ca nu ai inteles ca datele trebuie scrise/citite
> > > pe portul serial (folosind outb si inb), nu doar retinute in memorie.
> > >
> > > Portul serial este folosit pentru comunicatia intre doua entitati
> > > (calculatoare, dispozitive), doua capete ale aceleiasi conexiuni. Ce
> > > se
> > > scrie la un capat va fi receptionat la celalt. In testul nostru am
> > > facut o conexiune intre com1 si com2 folosind pentru ele acelasi pipe
> > > in configuratia masinii virtuale. Asa ca ce va fi scris pe com1 poate
> > > este receptionat pe com2 si invers. Cu alte cuvinte. Testul nostru
> > > scrie pe com1 si citeste de pe com2, dupa care testeaza ca ceea ce s-a
> > > receptionat este acelasi lucru cu ce s-a transmis. Nu trebuie sa
> > > folosesti un buffer comun pentru cele 2 porturi, ci cum am spus mai
> > > devreme trebuie sa scrii si sa citesti datele (de)pe porturi folosind
> > > outb si inb. Ai nevoie de doua buffere care se folosesc in felul
> > > urmator:
> > > 1. bufferul pentru operatia read: scrii in acest buffer datele primite
> > > pe portul serial (luate cu inb in handlerul de intrerupere) si le iei
> > > din acest buffer si le scrii in bufferul din userspace (in functia
> > > mread in cazul tau).
> > > 2. bufferul pentru operatia write: scrii in el din bufferul din
> > > userspace (in cazul tau din functia mwrite) si iei din el in
> > > handler-ul
> > > de intrerupere si scrii pe port (cu outb).
> > > Nu vad cum ai putea folosi acelasi buffer pentru ambele operatii avand
> > >
> > > in vedere ca se refera la date diferite, unul la datele scrise pe port
> > > si altul la datele citite de pe port, date care de obicei sunt
> > > diferite. Nu prea te intereseaza sa citesti de pe portul serial ce
> > > tocmai ai scris pe el, ci ce s-a scris la celalalt capat.
> > >
> > > Tema presupune ca esti familiarizat cat de cat cu portul serial (cel
> > > putin de la CN si PM) si ca stii cam la ce se foloseste. Pentru restul
> > > detaliilor tehnice am inclus in enuntul temei un link
> > > http://www.beyondlogic.org/serial/serial.htm unde este explicat portul
> > > serial in detaliu.
> > >
> > > Formularea din enunt: "pentru citirea/scrierea datelelor în/din
> > > porturi
> > > nu trebuie să folosiţi funcţii amânabile (puteţi
> > > să faceţi totul din întrerupere)" inseamna ca ai voie sa faci
> > > outb si inb din handlerul de intrerupere si nu trebuie sa programezi o
> > > actiune amanabila care sa faca citirile/scrierile.
> > >
> > > Ce inseamna functii blocante am explicat intr-un alt mail. Pe scurt:
> > > read trebuie sa se blocheze daca nu exista date citite de pe
> > > port(bufferul pentru read este gol) pana cand vin date, si write
> > > trebuie sa se blocheze daca nu ai spatiu de scris in bufferul de write
> > > pana cand se elibereaza o parte din el prin scriere pe port.
> > >
> > > Mihai
> > >
> > >
> > >
> > >
> > > ____________________________________________________________________________________
> > > Sucker-punch spam with award-winning protection.
> > > Try the free Yahoo! Mail Beta.
> > > http://advision.webevents.yahoo.com/mailbeta/features_spam.html
> > > _______________________________________________
> > > pso mailing list
> > > pso at cursuri.cs.pub.ro
> > > http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
> > >
> >
> >
> > _______________________________________________
> > pso mailing list
> > pso at cursuri.cs.pub.ro
> > http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
> >
> >
>
> _______________________________________________
> pso mailing list
> pso at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/pso/attachments/20070418/43760d1a/attachment-0001.htm
More information about the pso
mailing list