Eşit öncelikli interruptların kendi aralarındaki öncelikleri

Başlatan z, 27 Ağustos 2016, 19:13:00

z

Sorumun cevabını almak için kod yazıp denemeye üşendim.

Örneğin Timer 2 ve 3 int rutinlerini yazmış olalım ve önceliklerini eşit yapalım.

Timer 2 int gelsin ve int rutinine girmiş olsun.

Timer 2 int rutini işlerken Timer 3 int gelsin.

Öncelikler aynı olduğu için Timer 2 rutini yarıda kesilmeyecektir.

Timer2 rutinini kötü yazılmış olsun ve işi uzun sürsün. Bu esnada tekrar Timer 2 int üretilsin.

Timer 2 int rutininden çıkınca Timer 2'ye ait interrupt mı yoksa Timer 3'e ait interrupt mı hizmete alınır?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

Hocam söylediğinize benzer durumu ben realtime sistemde tasklarda yaşıyorum çözümü şöyle buldum preemption modundaysam eğer dynamic task prioritylerini düzenleyip task yield yaparak doğru öncelikte işletiyorum, yani yanlış yapılmaması için sisteme müdahale edip context switch yolunu değiştiriyorum.

Ancak sizin söylediğiniz durumda timer 2 interruptı uzun yazılmış ise o zaman timer 2 den çıkmadan önce ISR flag temizlenmeliydi.  Böyle yapılırsa ISR içerisindeyken timer 2 gelsede silinir. Bunun dışında sizin aynı öncelik sınıfında gelen en son ISR işletilir diğeri kaybolur. interrupt için işlemci donanımsal kuyruk barındırmaz bunu bilerek doğru önceliklerle iyi guruplamak gerekiyor. Tabi OS üzerinde ISR ların semaphorlarını kuyruklarsanız böyle bir problemi hiç yaşamazsınız.

iyi çalışmalar dilerim.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

ISR flag dediğin Timera ait int flag ise zaten onu daha int rutinin başında siliyorum. (Tercihim hep en başta yapmak)

-------

Mesela bu da ilginç bir sorun.

Timer2 int rutini işlerken iken Timer3 int üretti. NVIC ilk fırsatta bunu işleme alacak. Fakat Timer 2 rutininde Timer3 int flağını silersek NVIC ne yapacak? Daha önceki istek ortadan kalktığı için bunu görmezden mi gelecek yoksa istek istekdir deyip ilk fırsatta Timer3 int rutinini işletecek mi?



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

Hocam interrupt flag silindiğinde ilgili interrupt tekrar kurulmuş olur. Aynı interrupt vektöründe çalışan interruptlar için bu durum bariz bellidir. ISR içerisinde temizlenen her interrupt tekrar kurulur yani ilk durum ortadan kalkar. Temizleme işlemini başında yapıyorsanız ISR kodlarını uzun yazma alışkanlığınız vardır diye düşünüyorum. Yanlışları düzeltmeye biyerden başlamak lazım :)

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

@X-Fi

Soruma konu olay kısa int rutini yazanların başına gelebilir.

Öncelikleri sıralanmış pek çok int rutinin vardır. Int rutinlerin kısadır ama bahse konu int rutini işletilirken yüksek öncelikli int gelir o işletilmeye başlar onu daha yüksek önceliklisi onu daha daha yüksek önceliklisi kesip int rutini işletilirken bir bakarsın en baştaki intdan bir daha gelmiş.

Int flağını en başta değil de en sonda temizlemek int rutini içinde gelebilecek intları kaybetmeyi baştan kabullenmek demek.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

Alıntı yapılan: gerbay - 27 Ağustos 2016, 20:43:44
hocam işinize çok karışmak istemem ama preemptive sistemde bahsettiğiniz gibi bir durum oluyor ve bunu belirtttiğiniz şekilde çözüyorsanız bir problem var demektir.

mesela hiç task yield yapmadan düzenli şekilde çalışması lazım sistemin. task yield yapmanıza sebep olan neden ne ise onu iyi inceleyin.. çok fazla polling yapan bir sistem mi bu behsettiğiniz sistem?

Evet hocam sürekli veri akışı olan ve bu verilerin tasklara komut verdiği bir sistem. Bazı komutların işlenmesi uzun sürdüğünde ortak kullanılan taskların hangi komut için öncelikli davranacağını seçmem gerekti. Bu yöntemi uyguladığımda hiç hata yapmadığını gördüm. Başka türlü bir çözüm varmı bilmiyorum açıkcası yanlış kullanıyor da olabilirim inceleyeceğim.

Alıntı yapılan: z - 27 Ağustos 2016, 20:49:46
@X-Fi

Soruma konu olay kısa int rutini yazanların başına gelebilir.

Öncelikleri sıralanmış pek çok int rutinin vardır. Int rutinlerin kısadır ama bahse konu int rutini işletilirken yüksek öncelikli int gelir o işletilmeye başlar onu daha yüksek önceliklisi onu daha daha yüksek önceliklisi kesip int rutini işletilirken bir bakarsın en baştaki intdan bir daha yenilir.


Hocam eğer interruptlarınız yoğun şekilde işleniyor ve hata yapıyorsa wrong case management yaparak ISR kodlarınızı kısaltıp işlemci clock hızınızı yükseltmeniz gerekir. Benim düşüncem bu yönde.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

Ana başlıktaki durum başıma gelmiş de çözüm aradığım bir durum değil. Sadece öncelik durumunu merak ediyorum.

Mantıken eşit öncelikli interruptların da kendi içinde bir önceliği vardır.
Belki de dışarıdan kolay tahmin edilemez ve sıralama sürekli değişir.
Bunu da donanımın nasıl tasarlandığı belirler.

Mesela eşit öncelikli interruptlar tek vektörden işleme alınıyor ve bunları soft olarak sen yönetmek istesen

Yönetim kodun aşağıdakine benzer bir şey olur.

if (Int1) {}
if (Int2) {}
if (Int3) {}

Bu durumda ister istemez öncelikleri aynı intlara sen öncelik atamış olursun.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

@gerbay hocam yorumunuz benim için önemli keşke sizi daha çok konuşturacak mecralar bulabilsek.

@z hocam sorunuzun yanıtını bulmanızda son yorumunuz çok isabetli olmuş. Benimde anlatmaya çalıştığım aynısıydı. Aslında iki ana başlık var ilki adrese gitmeye hazırlanan bir flag var silinmezse nereye gideceği biliniyor, ikincisi öncelikleri kendi akışına göre belirleyen ISR kodları var. Herşey yazılımla kontrol edilirken donanım bu durumda ne yapar sorusu biraz havada kalıyor. Affınıza sığınarak sizi tam anlayamamış da olabilirim. Kusuruma bakmayın.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

Neyse bahsettiğim durumu oluşturan kod yazıp deneyeyim. ST bu durum için neyi öngörmüş deneyerek buluyum.

Belki de dokümanlardan birinde dipnot olarak bu konuya açıklık getirilmiştir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com