[pso] Tema 2 Linux - cum functioneaza CLEAR ??

Mugurel Ionut Andreica pso@cursuri.cs.pub.ro
Fri, 1 Apr 2005 14:13:38 -0800 (PST)


      Am o nelamurire in legatura cu comportarea
driver-ului dupa o operatie de tip CLEAR. Eu am
inteles ca trebuie sa stearga toate datele existente
in acel moment in buffer-ul folosit de functia 'read'.
Si dupa ce sterge aceste date (stergerea este o
operatie ce se realizeaza in O(1), modificand valorile
unor variabile..), operatia de CLEAR se termina.
     Acum urmeaza nelamurirea : In enuntul temei se
specifica ca o operatie de read va gasi buffer-ul gol
dupa o operatie de CLEAR. Ce inseamna, de fapt, o
operatie de 'read' aici ? Este cumva un apel al
functiei 'read' a driver-ului? In acest caz, pentru a
gasi buffer-ul gol, ar trebui sa ignor toate datele
care sosesc de la hardware, pana la apelul functiei de
read? (pentru ca daca nu le ignor, buffer-ul nu va mai
fi gol la apelul functiei 'read').
      Eu nu am considerat ca nu acesta este
comportamentul normal, asa ca o operatie de CLEAR pur
si simpul goleste buffer-ul din acel moment si atat.
Daca vin date de la hardware (prin intrerupere) sunt
puse in buffer. Si la urmatorul apel al functiei
'read' a driver-ului buffer-ul va contine datele
sosite intre apelul lui CLEAR si apelul lui READ.
       Problema mea este, de fapt, cu programul de
test, mai degraba.. In primul caz, cu un baud rate de
9600, se scriu 2048 de octeti pe un port, se face
flush, apoi se face CLEAR pe portul celalalt. Apoi se
scriu din nou alti 2048 de octeti la acelasi port, se
citesc 2048 de octeti de la portul celalalt si se
asteapta ca ceea ce se citeste sa fie identic cu ceea
ce s-a scris a doua oara.. Numai ca la mine apare
urmatoarea situatie : Cand programul de test face
CLEAR pe al doilea port, nu au sosit inca toti octetii
de la prima scriere (doar o parte din ei). Dupa
operatia CLEAR si pana la operatia de read, sosec pe
al doilea port ultimii octeti din prima serie de 2048
de octeti scrisa si cei 2048 de octeti din a doua
serie. Numai ca la apelul 'read' driver-ul intoarce si
ultimii octeti de la prima serie de octeti citita..
si, astfel, output-ul meu ce nu coincide cu ceea ce
asteapta testul.. (mi-am scris datele intr-un fisier
si am verificat si, intr-adevar, chiar asa se
intampla.. a doua serie de 2048 de octeti incepe
undeva mai tarziu in sirul de octeti citit de la al
doilea port).
      Cand se foloseste un baud rate de 115,200
aceasta situatie nu mai apare, deoarece atunci cand se
realizeaza operatia de CLEAR, toti cei 2048 de octeti
din prima serie au ajuns deja pe al doilea port si,
astfel, sunt stersi cu totii.

      Cum sa se comporte driver-ul meu in aceasta
situatie?



__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com