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

Valentin Stanciu valentin.stanciu at cti.pub.ro
Mon Apr 11 02:38:48 EEST 2011


Salut!

Nu stiu daca a urmarit cineva problema, dar daca chiar este cineva ce isi
freaca barbia gandindu-se la mailul meu anterior, am aflat raspunsul la
intrebare. :)

Eu, crezand ca activez inapoi intreruperile la serial, scriam 0x03 pe
BASE+1. Adica fix pe high-byte care dicta baud rate. Trebuia sa fac aceasta
operatie DUPA ce activam DLAB OFF, adica dupa ce setam lungimea, paritatea,
bitul de stop.

Silly me...

Valentin

2011/4/9 Valentin Stanciu <valentin.stanciu at cti.pub.ro>

> 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/20110411/315813e8/attachment.html>


More information about the pso mailing list