Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Interrupts pod linuxom ...

[es] :: Linux :: Interrupts pod linuxom ...

[ Pregleda: 1825 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Interrupts pod linuxom ...18.09.2001. u 15:03 - pre 275 meseci
Mozda ovo i nije najbolje mesto za ovaj post, ali koristim Kylix, pa rekoh, ovo je najblize :D

Enivej, radi se o sledecem - kolega je napravio custom i/o board, koja ima na sebi serijski kontroler, LAN kontroler, USB, ...
Sam programcic koji se izvrsava na i/o boardu (paljenje ledova, primanje polozaja dzojstika, itd) je zavrsen u assembleru. Medjutim, glavni program komunicira sa ovom i/o plocom preko serijskog porta (sve je inace strpano u kuciste). I sve to lepo radi kao stream preko /dev/ttyS1, medjutim, okidanje citanja/upisa (za sada) vrsi tajmer (svakih 100ms).

E, sad, posto jos tu radim sa socketima pa preko mreze i sl, hteo bi da se ratosiljam ovog tajmera kao triggera. Sve cu to jos morati lepo da rasporedim na par threadova. Ima li neko iskustvo/savet kako da ovo bezbolno resim (ne threadove, nego trigger) ? Imao sam nekog iskustva sa presretanjem interapta pod dosom (tipa, tastature za poneki mali TSR ;) ) i probao nesto slicno ovde, ali to ne pije vodu. Moze li nesto da se odradi preko libc biblioteke, ili sta ?

Fala unapred na (konstruktivnim) savetima.

P.S.
Ako neko ima neki predlog ili detalj, ne mora biti u pascalu, vazi se i ostalo: c, c++, ...

[Ovu poruku je menjao silverglider dana 09-18-2001 u 03:04 PM GMT]
 
Odgovor na temu

silverglider

Član broj: 651
Poruke: 218
*.batalpha.de

Sajt: www.benchmark.co.yu


Profil

icon Re: Interrupts pod linuxom ...25.09.2001. u 13:01 - pre 274 meseci
Problem resen, pa reko' da postujem ako nekome jos zatreba.


Interapt handler pod linuxom koristi sledeci prototip:

Code:

void MyIrqHandler(int irq, void *dev_id, struct pt_regs *regs);


Gde je:
- irq: numericna vrednost irq-a koji se preuzima
- dev_id: pointer koji se prosledjuje kernelu u trenutku registrovanja irq-handlera
- regs: pointer na strukturu koja u memoriji drzi stanja registara procesora u trenutku interapta


Da bi se irq-handler registrovao, koristi se request_irq rutina, definisana u include/linux/sched.h :

Code:

int request_irq( unsigned int irq,
                 void (*handler)(int, void *, struct pt_regs *),
                 unsigned long irqflags,
                 const char *devname,
                 void *dev_id);


Prvi argument je broj irq-a koji se preuzima,
drugi argument je pointer na nasu rutinu MyIrqHandler,
treci predstavlja flagove definisane u include/asm/signal.h,
cetvrti (devname) se koristi za printanje dodela interapta u /proc/interrupts,
i na zadnji parametar je isti dev_id parametar kao i u prototipu handlera.


I, na kraju, funkcija za de-registraciju handlera:

Code:

void free_irq(unsigned int irq, void *dev_id);


gde su sada parametri jasni.

 
Odgovor na temu

[es] :: Linux :: Interrupts pod linuxom ...

[ Pregleda: 1825 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.