İnterrupt içinde interrupt

Başlatan robomaster, 06 Ocak 2014, 18:55:23

robomaster

Arkadaşlar uzun süredir kafamı kurcalıyor. Aksi tedbirleri almadan, bir kesme rutini yürütülürler ve işi daha bitmemişken başka bir kesme oluşursa ne olur?

İlk kesmenin önceliği yüksek ise onun rutininin bitmesi mi beklenir?

İç içe bir kaç kez böyle bir durum oluşursa her seferinde üstteki seviyede kalınan yerden devam edilir mi?

High ve low priority bu noktada ne halta yarıyor?

Selamlar

mistek

#1
Nvic donanımı bu işe yarıyor.

Bir kesme işlenirken daha yüksek öncelikli bir kesme gelirse eğer o anki iş bırakılır ve yeni kesme adresine dallanır. Oradaki iş biter ve geri gelir kalan işi tamamlayıp ana programa döner.

Yüksek öncelikli kesme işletilirken düşük öncelikli kesme gelirse eğer o anki işi bölemez ama sıraya girer. Öncelik sıralarına ve derecelerine göre kesmeler işletilir.
Önceki kesme adresleri stack içerisinde tutulur kaldığı yerden devam eder.




****
Konu Microchip içinmiş ben Arm'la karıştırdım.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

robomaster

Süper.
Bu noktada şu önem kazanıyor.
Kesmelere önceliği registerlar ile biz veriyoruz ve ancak high ve normal(low) 2 öncelik seçeneğimiz var değil mi?

mistek

NVIC donanımı için evet kesmeleri siz istediğiniz önceliğe göre programlayabiliyorsunuz.

Ama PIC için aynı şey geçerli değil sanırım. Şöyleki Pic18f452'de bir kesme geldiğinde kesme içerisinde tüm kesmeler kapatılıyor kesmeden çıkarken yeniden açılıyor yani 1 den fazla kesme iç içe gelmesi mümkün değil belki farklı yöntemleri vardır çok net bilgim yok.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

robomaster

Evet tüm kesmeler kapatılıyor(GIE) ancak ben kapatmaz isek diye başlamıştım soruya.

muhittin_kaplan


mistek

#6
Alıntı yapılan: muhittin_kaplan - 06 Ocak 2014, 19:29:06
PIC te nvic varmı yav ?

Yok hocam ben konuya bi hevesle ARM'dan girdim sonradan Microchip olduğunu farkettim, silmedim.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

muhittin_kaplan

Ama sistem aynı Onda da Kesme Önceliği mevcut.

mistek

Çok bilgim yok benzer bir yapısı vardır belki.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

robomaster

Muhittin hocam IPEN biti set edilirse öncelikler tanımlanabiliyor (18f4550)
(RCON register içinde bu bit)

Birisi ihtiyaç duyar diye yazayım diğer ilgili registerlar şunlar:
• INTCON• INTCON2 • INTCON3 • PIR1,PIR2 • PIE1,PIE2 • IPR1,IPR2

Benim kafamı karıştıran mevzu su vektör olayı nedir? High vektör , low vektör için bir izahat getirirmisiniz?

muhittin_kaplan

vector:

interrupt oluştuğunda gitmesi gereken bir hafıza adresi var buna interrupt vektörü deniliyor. kesme yapısı öncelikli ise buna bağlı olarak int. oluştuğunda gitmesi gereken hafıza adresi yani vektörü de fazla olmalı.

örnek vereyim,

PICFalanFilanda
High Kesmenin vectoru (hafıza adresi)   0x0004
Low Kesmenin vectoru (hafıza adresi)   0x0005

Bizler aslında program yazarken  Şunu Yazıyoruz

yüksek tanımladığımız

intRb0_req{

}

program belleğindeki başlangıç adresini 0x0004 e yazıyoruz .
High Int oluştuğunda PC hemen 0x0004 adresine gidip oradan tanımlı olan Fonksiyona gidiyor.
Low ınt geldiğinde 0x0005 e gidip oradan aldığı degerle Low Kesme Fonksiyonuna Gidiyor.

Diye biliyorum PIC te. Yanlışım Varsa Düzeltiniz

robomaster

Harika yazmışsınız. O zaman şu geliyor aklıma neden bu vektörler bazen değiştirme ihtiyacı duyuluyor. ARM dada böyledir bir şey varmı?

(Aslında az önce mistek ARM göre cevap yazmış ama oldukça önemli bir bilgiydi)

muhittin_kaplan


robomaster

Denk geldim, mesela programın normal çalışma adresi bootloader kullanıldığında başka yere alınıyor veya interrupt adresleri başka adreslere (vektör) yönlendiriliyor.   (Yoksam yanılıyor muyum  :o

yldzelektronik

Birden fazla kesme aynı anda geldiğinde öncelik sıralamasına göre kesmeler işletilir.Yüksek öncelikli olan kesmeler ilk etap kesme adresinde işletilir.Ardından düşük öncelikli kesmelerin işletilmesi sağlanabilir.

16f serisiiçin durum şöyle;

Kesme için öncelik sıralamasını kullanıcının belirlemesine izin verilmiyor. (En azından eski serilerde böyleydi).
Her kesme kaynağının öncelik tablosunda bir değeri vardır ve bu sıralamaya göre kesmeye girer.Eğer düşük öncelikli kesmeleri de kullanmak isterse kullanıcı isr içinde diğer kesme kaynaklarının bayraklarını kontrol edebilir.
Derleyiciye göre farklı işlemler gerçekleştirilebiliyor.

Örneğin ccs için benim asm karşılıklarını inceleyerek gördüğüm senin yukarıdan aşağıya doğru üst sırada yazdığın isrleri öncelik ataması yapıyor.Ancak bu tamamen soft bir olay.Yani isr içine girdiğinde senin sıralamana göre interrupt flaglarını kontrol ediyor ve ona göre ilgili kesme kodunu işletiyor.
Diğer derleyicilerde durum nasıl bilmiyorum.

18f serisinde kesmeler için öncelik ataması yapabiliyorsun.Ancak bu noktada benim kafamı karıştıran bazı hususlar var.

Normalde 16f serilerinde olduğu gibi bütün kesme kaynaklarının önceden belirlenmiş öncelik değerleri var.Ancak programı yazarken isrleri high priotry low priotry olarak iki farklı isr yazabiliyorsun.Böyle bir durumda işler nasıl yürüyor?Örneğin hp isr içinde -high priotry interrupt service rutine- öncelik tablosunda lp donanıma bakılsa ve lp isr içinde öncelik tablosunda hp donanıma bakılsa ne olur?

Yani 18f serisinde eğer programcı hp isr ve lp isr yazmazsa mcu default olarak talodaki öncelik sıralamasına göre mi hareket ediyor?

Derken muhittin abi yazmış zaten.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.