Linux'te interrupt oluşturma.

Başlatan yamak, 18 Eylül 2012, 13:21:46

yamak

Linux'te c dili ile interrupt nasıl oluşturulur. Mesela seriport kesmesi nasıl yaparım ?


Tagli

Seri port bir dosya gibi açılır. Buradan yapacağın bir read() işlemi, seri porta veri gelene kadar bloklanacaktır (bloklanmayacak şekilde ayarlaman da mümkün olabilir). Bunu bir çeşit kesme gibi düşünebilirsin. Bu bekleme halinin tüm programını etkilememesi için seri portu okuyan ayrı bir thread oluşturman gerekir. Elbette bu durumda thread senkronizasyonunu sağlaman gerekecektir.

Seri port ayarları için termios.h, thread işlemleri için ise pthreads kullanabilirsin. Büyük ihtimalle ikisi de sisteminde zaten kuruludur.

Olayın donanım seviyesinde nasıl yapılacağını bilmiyorum ama muhtemelen karmaşıktır ve assembly ile uğraşman gerekebilir. Bence gerek yok. Yukarıda anlattığım şekliyle kulllanıyorum PIC ile iletişim kurmak için. Gayet iyi çalışıyor.
Gökçe Tağlıoğlu

arm-beginner

@Tagli
Anladığım kadar arkadaş seriel port'un interrupt'unu kendisi oluşturmak istiyor. Başlık zaten öyle: Linux'te interrupt oluşturma

controller

İki yöntemle seri portu okuyabilirsin, polling veya signal.

Polling için ayrı bir thread açıp bu thread de sürekli seriporta veri gelmiş mi diye kontrol edersin, veri geldiğinde verileri olursun. Bu işlem ayrı bir thread de olduğu için senin ana program akışını etkilemez.

İkinci yöntem olarakta portu asenkron olarak ayarlayıp, SIGIO signali ile takip edersin. Interrupt'a en yakın çalışma şekli budur, veri geldiği anda sistem sana SIGIO signali gönderir, signal handler fonksiyonunda da seri porttan datayı okursun.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

a_a_sezen

#5
Kesme, bios tarafından oluşturulur, sistem (işletim sistemi) tarafından takip edilir (sürücüler), sistem veya üstündeki uygulamalarca kullanılır.
Arıza takibi de tersten yapılır. Uygulama sorunu, sistem sorunu, donanım sorunu, anakart sorunu...
Uygulama geliştirmekte sistemin izin verdiği kaynakları izin verdiği ölçüde kullanmaktır.
Sistem izinleri dökümantasyonunda belirtilmiştir. API (application programming interface)"uygulama geliştirme arayüzü" olarak programcının karşısına çıkar. Amaca uygun kullanılır.
Interface tesadüfen seçilmiş bir isim değildir. Yukarıda bahsettiğim konunun özetidir. Low-level adı altında bazen sistem bu süreçten dışlanmaya çalışılır ama bu anlamda level low - laştıkça programcıdaki bilgisinin -high- olması gerekir.
...
diye biliyorum..
Anlatım şeklim beni de biraz rahatsız etti ama uzun cümlelerle ana fikri bozmak istemedim. Oraya takılmayınız.
"En iyi programcı üzerinde çalıştığı sistemi en iyi tanıyan programcıdır." prensibine atfen yazdım.
@controller in yazdıklarına ilaveten düşünebilirsiniz, yoksa cevabı bende bilmiyordum. Microsoft Windows ta olay, Linux ta signal, gerisi help dosyası...

Bir bağlantı ekleyecektim. Unutuldu..
http://www.serdaraytekin.com/docs/pl/kesme.html
Güce ve Geleceğe Güvenle...

yamak

#6
http://www.xml.com/ldd/chapter/book/ch09.html
Burada biraz anlatmış ama tam anlayamadım. Thread kullanmayı deneyim. İşimi görür heralde.

mesaj birleştirme:: 19 Eylül 2012, 13:17:22

Alıntı yapılan: Tagli - 18 Eylül 2012, 17:10:39
Seri port bir dosya gibi açılır. Buradan yapacağın bir read() işlemi, seri porta veri gelene kadar bloklanacaktır (bloklanmayacak şekilde ayarlaman da mümkün olabilir). Bunu bir çeşit kesme gibi düşünebilirsin. Bu bekleme halinin tüm programını etkilememesi için seri portu okuyan ayrı bir thread oluşturman gerekir. Elbette bu durumda thread senkronizasyonunu sağlaman gerekecektir.

Seri port ayarları için termios.h, thread işlemleri için ise pthreads kullanabilirsin. Büyük ihtimalle ikisi de sisteminde zaten kuruludur.

Olayın donanım seviyesinde nasıl yapılacağını bilmiyorum ama muhtemelen karmaşıktır ve assembly ile uğraşman gerekebilir. Bence gerek yok. Yukarıda anlattığım şekliyle kulllanıyorum PIC ile iletişim kurmak için. Gayet iyi çalışıyor.
Hocam thread senkronizasyonu hakkında biraz açıklama yapabilir misiniz? Mesela şu şekilde mi olacak:
Bi thread te bi sayacım var diyelim bu sayac sürekli artacak diğer bir thread'te de seriporttan veri okuyacam sayacın herbir artışında diğer thread i çalıştrıp seriporttan veri gelip gelmediğine bakacam eğer gelmemişse yine diğer thread e geçip sayacı artırmaya devam edecem.Yani bi sayac artacak bi seriporttan okuma yapacak program. Ama bu durumda da şöyle bi sorun olur sayac değil de daha uzun sürecek bir işlem varsa o durumda seriporttan veri kaybedebilir. Normalde Visual Studio'da BackGroundWorker kullandığımda senksronizasyona ihtiyaç duymuyodum. Mesela iki sonsuz for döngüsü içindeki artan değişkenleri aynı anda iki ayrı listbox a yazdırabiliyodum.Ama burda nasıl olacak biraz kafam karıştı. Yardımcı olabilir misiniz?