[pso] [Tema2][Windows] Disable RDAI Interrupt

Octavian Voicu octavian.voicu at gmail.com
Fri Apr 23 22:08:52 EEST 2010


2010/4/23 Macicas Teodor <teodor.macicas at cti.pub.ro>:
> Am, inteles. In concluzie, nu conteaza daca fac break sau dezactiv
> intreruperea ? Daca da, atunci de ce initial [i.e in threadurile anterioare]
> ni s-a spus s-o dezactivam atunci cand bufferul este plin ? Este ok daca
> inlocuiesc dezactivarea cu 'break' ?

Cand activezi FIFO, portul serial va avea de obicei buffere de 16
bytes pt receive si send.

Daca nu dezactivezi intreruperea cand bufferul e plin sau configurezi
intreruperea sa vina la fiecare caracter (trigger = 1), risti sa
ajungi la un fenomen de tip starvation in care procesorul nu face
decat sa trateze intreruperi si nu mai executa codul proces care ar
goli buffer-ul (syscall-ul read executat de tester).

De asemenea, avand trigger la un byte (spre deosebire de trigger la 14
bytes, vezi registrul FCR), probabil read-urile din userspace vor
primi tot timpul numai un byte si overhead-ul procesarilor n-o sa-ti
permita sa ajungi la un data rate mare fara pierderi.

> Am o problema cu dezactivarea intreruperii RDAI atunci cand buffer-ul
> read este plin.
> Apelez WRITE_PORT_UCHAR((PUCHAR) IER(data->base),
> READ_PORT_UCHAR((PUCHAR) IER(data->base)) & ~IER_RDAI );
> in ISR. Tester-ul se blocheaza imediat dupa ce bufferul read este plin
> si se face aceasta dezactivare.

Freeze-ul probabi se datoreaza unui race care duce la nereactivarea
intreruperii RDAI. In mod normal ar trebui sa planifici un DPC ca
ultim pas al rutinei de tratare a intreruperii, DPC care sa proceseze
coada de IRP-uri iar apoi sa reactiveze intreruperea corespunzatoare.

Octavian


More information about the pso mailing list