[pso] intrebari tema 2 linux
Mihai Florian
my_mihai_florian at yahoo.com
Mon Apr 9 20:19:09 EEST 2007
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
More information about the pso
mailing list