[pso] Tema 2 - Intreruperea THRE

Adrian - Razvan Deaconescu pso@cursuri.cs.pub.ro
Sat, 2 Apr 2005 14:11:16 +0300


Salut,

am si eu o problema cu intreruperea Transmitter Holding Register Empty Interrupt
(THREI). Dupa ce am citit din mai multe surse informatii referitoare
la UART, rezulta ca aceasta interupere este resetata in momentul
scrierii unui octet in THR sau in momentul citirii IIR. In mod normal,
dupa ce sunt activate intreruperile (la open sau la  init) buffer-ul
intern al driver-ului este gol. Asta inseamna ca prima intrerupere
THREI sosita va gasi buffer-ul gol. Deci nu va avea ce scrie in THR.
Astfel singura modalitate de a reseta intreruperea este citirea lui
IIR.

Asta este primul lucru pe care il fac in rutina de tratare a
intreruperii (citirea lui IIR), pentru ca, in functie de el, vad ce
intrerupere s-a primit. Totusi, intreruperea nu este reactivata. Am
incercat si in context non-intrerupere sa fac acelasi lucru (sa
reactivez intreruperea citind IIR - am zis ca poate nu merge sa fie
facut din context intrerupere), dar nu functioneaza. In schimb, merge
daca scriu un octet in THR.

Singura solutie "umana" pe care am gasit-o a fost ca dupa un apel
write sa reactivez intreruperile (intai le dezactivez si pe urma le
activez). In felul asta totul merge ok, dar nu este o solutie buna
pentru ca datele se putea transmite pe masura ce erau scrise nu dupa.

S-a mai intalnit cineva cu aceasta problema? Si daca da, care ar fi
solutia? Mi se pare foarte ciudat faptul ca documentatia spune ca
resetarea se intampla atat la scrierea in THR cat si la citirea lui
IIR si totusi numai prima varianta functioneaza.

Inca o chestie ciudata care mi se intampla este urmatoarea: cateodata
(cam o data la 3 sau 4 rulari), testul ramane blocat la primul read de
la grupul de teste pentru BAUD_115200. Este ca si cum datele transmise
la write pe COM1, nu ajung pana la read pe COM2 (este al doilea write,
cel de dupa flush). Ar fi totul ok daca nu ar merge deloc, dar
problema este ca numai in anumite situatii nu merge. Daca stie cineva
care este problema, i-as ramane recunoscator daca mi-ar indica-o.

Multumesc mult,
Razvan