[pso] [Tema2][win]uart read irq

Valentin Stanciu valentin.stanciu at cti.pub.ro
Sat Apr 9 20:09:01 EEST 2011


Salut!

Am si eu o intrebare legat de comportamentul controllerului pe windows. Pe
linux am rezolvat tema, toate bune si frumoase, dar pe windows am intalnit o
problema.

Intreruperile Received Data Available Interrupt mi se genereaza foarte greu
(cam una pe secunda), o tratez foarte repede (sub 1ms), dar urmatoarea
intrerupere nu apare. Pentru debug am dezactivat DPCul ce trezea functia
read si functia de read are un timeout dupa care citeste date. Deci timp de
o secunda driverul nu face nimic decat sa astepte un eveniment. Am incercat
sa setez controllerul sa genereze IRQ la 1, 4, 8 sau 14 bytes available, dar
efectul este acelasi: intreruperea de read vine cam o data pe secunda. Tot
ce se schimba este cantitatea de octeti ce ii primeste de la controller
(maxim 1, 4, 8 sau respectiv 14). La fiecare intrerupere citesc cat timp
Line Status Register are bitul 0 setat.
Mentionez ca pentru Transmitter Holding Register Empty Interrupt nu am
aceasta problema. Intreruperile se genereaza instantaneu. Exemplu: primesc o
intrerupere THRE, scriu 8 bytes (sa nu supraincarc controller FIFO),
introduc in coada DPC, termin intreruperea. Apoi primesc iarasi intrerupere
THRE la diferenta de milisecunde.

Pentru a verifica ca nu este o problema cu masina virtuala am rulat testerul
folosind solutie.sys pentru ambele porturi. solutie.sys nu prezinta aceasta
problema deoarece testele trec repede. Folosind driverul obtin un timp
~140s, iar folosind solutie.sys obtin <=15s.

Am inclus mai jos si un exemplu din log, cu mentiunile
- numarul din stanga reprezinta secunda
- UartRead asteapta 3 secunde daca bufferul de citire este gol
- Controllerul este configurat sa imi trimita o intrerupere la 14 bytes

17 UartRead: want to read 130
18 UartInterruptHandler: INTERRUPT 0x3f8 RDAI!
18 UartInterruptHandler: irq read 14 bytes
18 UartInterruptHandler: IRQ HANDLED
19 UartInterruptHandler: INTERRUPT 0x3f8 RDAI!
19 UartInterruptHandler: irq read 14 bytes
19 UartInterruptHandler: IRQ HANDLED
20 UartInterruptHandler: INTERRUPT 0x3f8 RDAI!
20 UartInterruptHandler: irq read 14 bytes
20 UartInterruptHandler: IRQ HANDLED
20 UartRead: read 42
20 UartRead: want to read 88
...

Ca fun fact, daca trimit pe vmchecker nu zice nimic.

Any ideas/ tips/ opinions? :)

Valentin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20110409/a1bd113f/attachment.htm>


More information about the pso mailing list