[pso] [Tema2][Linux][Activare intreruperi]

Andrei Trandafir andreitra1987 at yahoo.com
Tue Apr 6 21:38:28 EEST 2010


Salut,

Atentie la FIFO - cred ca in tema, fata de laborator, e chiar necesar sa o folosesti. La mine cel putin, daca nu am FIFO activat (minim 4 octeti la o intrerupere) pierd date (ajung sa primesc mult sub 256 de octeti).
Si totusi, nu inteleg de ce se intampla lucrul asta. Eu ma gandeam asa: la un baud rate de 9600, eu primesc 9600 de biti pe secunda, deci undeva la 1000 de octeti pe secunda. Asta ar corespunde la aprox. 1000 de interuperi pe secunda, ceea ce ar duce undeva la o milisecunda pentru a se rula handler-ul intreruperii. Dar cum el e foarte simplu (salveaza / restaureaza un context si adauga / scoate un caracter intr-un / dintr-un buffer) ar trebui sa se execute mult sub acest interval. De ce atunci cand setez sa mi se genereze o intrerupere la 1 octet ajung sa pierd date? Am gresit in rationament undeva?


--- On Tue, 4/6/10, Bogdan Nitu <nitubogdan_cc at yahoo.com> wrote:

From: Bogdan Nitu <nitubogdan_cc at yahoo.com>
Subject: Re: [pso] [Tema2][Linux][Activare intreruperi]
To: pso at cursuri.cs.pub.ro
Date: Tuesday, April 6, 2010, 6:57 AM


Problema era ca nu foloseam ultima masina virtuala si ma chinuiam degeaba. Cu masina aceasta merge. 
Mail-ul asta a fost trimes ieri,
 cand nu mergea lista. Vad ca pe lista a ajuns pana la urma, la mine in casuta nu, nici replica lui Andrei. Multumesc frumos de ajutor!
> Daca poate sa ma ajute cineva, mie tot nu imi intra in handler, desi:
>
> 1)
> outb(0x00,(COM1_BASE)+3);   // fortez 0 pe tot LCR si astfel si pe bitul 7 (DLAB) - nu stiu cum sa fortez doar un bit dintr-un registru

Macro-ul SET_LINE setează (printre altele) DLAB 0 (pentru că pune
DLAB1 pentru baudrate, apoi îl pune pe 0).
Metoda corectă de a seta un bit ar fi un inb, urmat de un outb cu o
valoare modificată.

unsigned char c = inb(COM1_BASE+3);
outb(c | 0x80, COM1_BASE+3);

exact ca la PM.

>
> outb(0x00,(COM1_BASE)+2);   // dezactivare fifo
> outb(0x08,(COM1_BASE)+4);   // setare Bit 3 - MCR  - Aux Output 2
> outb(0x0F,(COM1_BASE)+1);   // setare Bit 0, 1, 2, 3 - IER - activarea tuturor intreruperilor (DLAB este deja 0)

Nu știu ce faci cu primele două întreruperi...
>
> SET_LINE(UART16550_BAUD_9600,UART16550_LEN_8,UART16550_STOP_1,UART16550_PAR_NONE,COM1_BASE); //macroul din laboratorul de anul trecut
>
> si scriu outb('w', COM1_BASE); si nu intra in handler desi acesta este inregistrat pe liniile 4 si 3 pentru cele doua comm-uri
> cat /proc/interrupts
> 3:          0   IO-APIC-edge      so2_com2
> 4:          0   IO-APIC-edge      so2_com1

Verifică să ai COM-urile conectate în mașina virtuală VM->Removable
Devices->Serial Port-> Settings (să apară amândouă ca fiind
conectate).
>
> 2)
> Un lucru pe care nu il inteleg deloc este operatia de citire (de ce nu functioneaza?):
> Cand citesc din LSR (Line Status Register)  stare = inb((COM1_BASE)+5) imi returneaza ff.

Ție îți trebuie doar un bit din registrul de stare.
Datele efective se găsesc în alt registru.

> Citesc din orice registru imi da ff desi in request_region am cerut 8 porturi:
> if(request_region(COM1_BASE, 8, COM1_NAME) == NULL) {  };

Request_region nu are nicio legătură cu buna funcționare a inb/outb. Check lxr.
>
> 3)
> O alta intrebare, pe masina virtuala ati dat jos vre-un modul?
> Mie nu imi mergea request_region (error - no such device) si a trebuit rmmod 8250_pnp.

Ai ultima mașină virtuală? Pe cea veche trebuia scos driver-ul
"serial", dar acela era built-in, nu modul.
>
> Multumesc frumos!
>
> Bogdan.
>
>
>


Andrei
>


      
-----Inline Attachment Follows-----

_______________________________________________
pso mailing list
pso at cursuri.cs.pub.ro
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/lurker/list/pso.html/attachments/20100406/a8fa8dae/attachment-0001.htm>


More information about the pso mailing list