[pso] Tema 2 Linux - probleme handler intrupere

ovidiu popa ov.popa at gmail.com
Sat Apr 4 14:11:27 EEST 2009


Pai cred ca exista o problema cu ce zici tu. In tema se specifica
urmatoarele chestii :

Driverul trebuie să folosească înteruperi atât pentru recepţie cât şi pentru
transmisie, pentru a reduce latenţa şi timpul de utilizare a procesorului.
De asemenea, apelurile read şi write trebuie să fie blocante. Temele care nu
respectă aceste cerinţe nu se iau în considerare.

Din ce inteleg eu de aici, outb-urile trebuie date in handlerul de
intrerupere. Am incercat sa dau outb-urile in write si intr-adevar merge.
Dar nu cred ca solutia este una acceptabila deoarece in handler nu se face
transmisia de date, doar receptia.

Cum as putea din write sa generez o intrerupere pentru a intra in hadler si
sa trimit datele de aici?

2009/4/4 Octavian Voicu <octavian.voicu at gmail.com>

> Functia write din file ops e apelata de kernel cand vrea sa scrie date in
> device (daca faci echo "x" > /dev/mydev, unde mydev este asociat driverului
> tau prin type/major/minor, kernelul apeleaza functia write din file ops). In
> functia write, scrii datele cu outb() catre device.
> IRQ-ul este pentru cand device-ul are date noi si semnaleaza ca trebuie
> citite. Folosind inb(base) citesti datele de la device si apoi faci inca un
> inb(base+2) ca sa citesti din registrul IIR si sa resetezi intreruperile.
>
> Read-ul din file ops ar trebui sa returneze datele citite in handlerul de
> intrerupere (sau sa se blocheze daca nu sunt date disponibile).
>
>
> 2009/4/4 ovidiu popa <ov.popa at gmail.com>
>
>> Salut,
>>
>> Am urmatoarea nelamurire legata de comportarea temei. Mai precis
>> intrebarea e legata de urmatoarele linii din teste
>>
>> test(do_write(com1, wb, BUFFER_SIZE) == 0, "write %s", com1_path);
>> test(do_read(com2, rb, BUFFER_SIZE) == 0, "read %s", com2_path);
>>
>> Din cate am inteles cautand pe lista de disctutii, in write copiez din
>> user space intr-un write buffer local. Write Bufferul este scris pe serial
>> cu outb in handlerul de intrerupere.
>> In read copiez in user space dintr-un read buffer local. Read bufferul
>> este umplut cu date primite pe seriala(inb) in handlerul de intrerupere .
>>
>> Nelamurirea mea este cum se leaga exact functiile de read write de
>> intrerupere? Mie imi intra o singura data in intrerupere la initializarea
>> modului.
>> Imi ramane blocat in read.
>>
>> Cum ar trebui sa intre in intrerupere pentru ca in write doar se scrie in
>> bufferu intern. Mie imi scapa.
>>
>> _______________________________________________
>> pso mailing list
>> pso at cursuri.cs.pub.ro
>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>>
>>
>
>
> --
> Octavian Voicu
>
> _______________________________________________
> 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/pipermail/pso/attachments/20090404/34e952c1/attachment.htm>


More information about the pso mailing list