Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Linux'te İnterrupt yönetimi

Başlatan yamak, 31 Ağustos 2013, 21:32:15

yamak

Linux'te interrupt yönetimi nasıl oluyor.Mesela uarttan veri geldiğinde nasıl interrupt oluşturup bir interrup handling yazabilirim. Eğer bu sorunun cevabını alabilirsem büyük bi aydınlanam olacak bende.:)

Icarus

Google: request_irq
Fakat bu konu aynı zamanda mimariye bağlıdır. IA32-64 için Intel'in manuallerine bakabilirsiniz.

Ama yapmak istediğiniz zaten linux'de var, yinede kendiniz yazmak istiyorsanız
Bunu yapabilirsiniz.
Handler Kodu
{
   UART'da veri birikiyor veriyi okuyan ve işleyen yere haber ver
}

Ama bunu yapmayın
Handler Kodu
{
   Veriyi oku.
   Veriyi işle.
   Dünyanın geri kalanına veriyi okuğunu haber ver.
   Ne yapman gerektiğini bütün user-mode programlara sor.
   Güzel bir deadlock'a gir.
}

esensoy

alternatif olarak thread ler de kullanılabilir,
bir thread sürekli uart ı kollarken diğerinden ana program yürütülebilir,
En tehlikeli an "zafer" anıdır.

yamak

Alıntı yapılan: Icarus - 31 Ağustos 2013, 22:05:29
Google: request_irq
Fakat bu konu aynı zamanda mimariye bağlıdır. IA32-64 için Intel'in manuallerine bakabilirsiniz.

Ama yapmak istediğiniz zaten linux'de var, yinede kendiniz yazmak istiyorsanız
Bunu yapabilirsiniz.
Handler Kodu
{
   UART'da veri birikiyor veriyi okuyan ve işleyen yere haber ver
}

Ama bunu yapmayın
Handler Kodu
{
   Veriyi oku.
   Veriyi işle.
   Dünyanın geri kalanına veriyi okuğunu haber ver.
   Ne yapman gerektiğini bütün user-mode programlara sor.
   Güzel bir deadlock'a gir.
}
HOcam handler nasıl yazıldığını biliyorum ama bunu linux ortamında nasıl yazarım demek istedim. Yani mesela uart donanımın interrupt ını nasıl aktif ederim ve interrupt oluştuğunda benim programımın yazdığım interrup rutinine dallanmasını nasıl sağlarım.Öyle çok basit değildir heralde.Neticede mmu lu bi sistem kullanıyoruz.Kendi programının içinde işlemcinin fiziksel vektör tablosundaki adreslere nasıl dallanırım.

Alıntı yapılan: esensoy - 01 Eylül 2013, 10:52:14
alternatif olarak thread ler de kullanılabilir,
bir thread sürekli uart ı kollarken diğerinden ana program yürütülebilir,
Hocam thread işime yaramıyorum.Çünkü çok hızlı bir şekilde adc den veri okumam gerekiyo ve uarttan gelen bir veriyi de kontrol etmem gerekiyo.Uartın kontrolüne sürekli olarak zaman ayıramam.

Icarus

Alıntı yapılan: yamak - 01 Eylül 2013, 12:39:10
HOcam handler nasıl yazıldığını biliyorum ama bunu linux ortamında nasıl yazarım demek istedim. Yani mesela uart donanımın interrupt ını nasıl aktif ederim ve interrupt oluştuğunda benim programımın yazdığım interrup rutinine dallanmasını nasıl sağlarım.Öyle çok basit değildir heralde.Neticede mmu lu bi sistem kullanıyoruz.Kendi programının içinde işlemcinin fiziksel vektör tablosundaki adreslere nasıl dallanırım.
Evet gerçekten o kadar basit, request_irq'u çağırman yeterli.
http://www.fsl.cs.sunysb.edu/kernel-api/re667.html
Fakat daha önce linux'de başka bir driver bunu yapmışsa o zaman linux izin vermez. O yüzden kerneldeki uart sürücüsünü kaldırmak veya değiştirmek daha doğru olur.



mufitsozen

linuxda standard /dev/ttyS... driveri zaten interrupt drivendir ve 4k bufferi vardir. Standard driverda ne gibi bir problem oluyor?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

Alıntı yapılan: mufitsozen - 01 Eylül 2013, 19:27:55
linuxda standard /dev/ttyS... driveri zaten interrupt drivendir ve 4k bufferi vardir. Standard driverda ne gibi bir problem oluyor?
Hocam tam olarak yapmak istediğimi izah edeyim.
Bir fonksiyonum var bu fonksiyon için adc'den veri okuyorum.Saniyede her bir kanaldan en az 200 örnek almam gerekiyo. Bu sırada uart'dan gelen veriye göre örnek almayı durdurmam gerekiyo.Sürekli olarak uartta veri var mı yok mu diye kontrol edersem burda zaman harcamış oluyorum.Bunun yerini bu işi kesme ile yaparsam çok daha düzgün çalışan bi program olur.Kullandığım işlemci AM3358 işletim sistemi is ubuntu 13.04.

mufitsozen

Alıntı yapılan: yamak - 01 Eylül 2013, 19:51:28
... çok daha düzgün çalışan bi program olur.

bu ifadeden ne kastettiginizi anlayamadim.

ote yandan standard Linux zaten real-time degil, guvenilir bir sekile 200 ornek/sn zaten sagliyamazsiniz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

Alıntı yapılan: mufitsozen - 01 Eylül 2013, 20:20:06
bu ifadeden ne kastettiginizi anlayamadim.

ote yandan standard Linux zaten real-time değil, guvenilir bir sekile 200 ornek/sn zaten sagliyamazsiniz.
Hocam şimdi yazdığım programda adc'den verileri okurken her 1000 örnekte bir uarttan veri gelip gelmediğini kontrol ediyorum.Bu durumda da örnek almayı durdur komutunu uart üzerinden gönderdiğimden yaklaşık 10 sn sonra program örnek almayı durduruyo.Çünkü o sırada hala örnek almaya devam ediyo 1000 örnek olunca kontrol ediyo.Ayrıca tam 200 olmasına gerek yok yani en 200 olması gerekiyo.

Icarus

Probleminiz tamamen user mode olarak çözülebilecek bir şey.
Birden fazla thread kullanın :)

mufitsozen

Alıntı yapılan: yamak - 01 Eylül 2013, 22:06:27
Hocam şimdi yazdığım programda adc'den verileri okurken her 1000 örnekte bir uarttan veri gelip gelmediğini kontrol ediyorum.Bu durumda da örnek almayı durdur komutunu uart üzerinden gönderdiğimden yaklaşık 10 sn sonra program örnek almayı durduruyo.Çünkü o sırada hala örnek almaya devam ediyo 1000 örnek olunca kontrol ediyo.Ayrıca tam 200 olmasına gerek yok yani en 200 olması gerekiyo.

himmm.....

yani bir dongu icinde ardi ardina 1000 adc ornek alinca o arada linux baska bir sey yapmaz, ornekleme dogru (sabit aralikla ve ardasik olarak) olur diye dusunuyorsunuz?

bilgisayar networke bagli ise, diske okuma/yazma yapiyorsaniz vb, gercek zaman ile sizin taskin "execute" ettigi zaman esit olmaz.

yada siz benden cok, ama cok iyimsersiniz.   ???
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

trgtylcnky

Hocam, bildiğim kadarıyla ADC zaten uzun süren bir işlem. Yani okurken zaten boşuna beklemiş oluyorsunuz. Thread kullansanız bence fark etmez. ADC ile her 5 ms okuyorsanız zaten o sürede yapılabilecek dünya kadar işlem var bence. Ayrıca ADC ile saniyede 200K değer okuyabilirsiniz.
select() diye de bir modül var linux'ta. Birden fazla kaynağı alıp hangisi hazırsa onu okuyorsunuz. Belki işinize yarar.