[pso] implementare handler intreruperi

Alexei Dodon alexeidodon at gmail.com
Sat Apr 14 19:07:07 EEST 2007


1)Atunci cand deschid /dev/uart0 si /dev/uart1 primesc cate o intrerupere de
buffer gol.
Continutul registrului IIR este 01000011 (primul bit e LSB) -deci am
Transmitter Holding Register Empty Interrupt.

Daca am  date de scris pe port - le scriu.Dar fiind la inceput,in faza de
deschidere  a porturilor nu am date de scris.Deci tre sa astept  cumva
in handlerul de intrerupere pina imi vin date de scris pe port.Altfel pierd
intreruperea de buffer gol(THREI).
In laboratorul de intreruperi ( Locking ) :

"Deoarece rutinele de tratare a întreruperilor se execută în context
întrerupere, acţiunile care se pot efectua sunt limitate: nu se poate accesa
memoria din user-space, nu se pot apela funcţii blocante, nu se pot folosi
spinlock-uri pentru sincronizare deoarece acest lucru ar duce la deadlock în
cazul în care spinlock-ul este
deja obţinut.Totuşi, există cazuri în care device driverele trebuie să se
sincronizeze cu întreruperile. În aceste situaţii este necesară dezactivarea
întreruperii cu care dorim să ne sincronizăm
]<http://cs.pub.ro/%7Epso/index.php?section=Laboratoare&file=05.%20Intreruperi#endnote_4>
 :

void disable_irq(unsigned int irq);
void disable_irq_nosync(unsigned int irq);
void enable_irq(unsigned int irq);

"
Nu am inteles cum se pot sincroniza device-driverele cu intreruperile ,
dezactivand si apoi activand  intreruperea.

ce trebuie sa folosesc ca sa nu pierd acea intrerupere de buffer gol?


Tot din laboratorul de intreruperi:
"
Un handler de întrerupere va avea următoarea structură:

irqreturn_t my_handler(int irq_no, void *dev_id, struct pt_regs *regs)
{
    struct my_device_data *my_data = (struct my_device_data *) dev_id;

    /* if interrupt is not for this device (shared interrupts) */

        /* return IRQ_NONE;*/
    /* clear interrupt-pending bit */
    /* read from device or write to device*/

    return IRQ_HANDLED;
}

"
La ce se refera "/* clear interrupt-pending bit */"?care e acel pending-bit?



2)
"Formularea din enunt: "pentru citirea/scrierea datelelor în/din porturi nu
trebuie sa; folositi functii amânabile (puteti sa faceti
totul din întrerupere)" inseamna ca ai voie sa faci outb si inb din
handlerul de intrerupere si nu trebuie sa programezi o actiune amanabila
care sa faca citirile/scrierile."

Presupun din asta ca pot sa chem din handlerul de intreruperi 2 functii
WritePort si ReadPort care sa faca transferul Kernel Buffer <-> FIFO Port
Buffer .asa-i?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/pso/attachments/20070414/a2c074e0/attachment.html


More information about the pso mailing list