Kesmeler Arasındaki Çakışma ve Anlaşmazlıkları DMA Çözer mi?

Başlatan HAKKITANIR, 27 Temmuz 2019, 12:26:58

HAKKITANIR

Değişik kesmeler arasında önceliklerin şartlara göre değiştiği ve kesmelerin bir biri içindeyken çalışma yaptığı bir karmaşık düzen düşünelim. ve bazen bir kesmenin diğerini bölmesi normalken bazen de hatalı bir çalışma olabiliyor. bu türden sorunların çözümü için DMA modül yeterli olur mu?

daha açık anlatmak için kısa bir örnek vereyim;
aynı sistemde
2 adet timer ve dış harici pin kesmeleri var.

normalde yalnızca 1 adet timer kesmesiyle sistem sorunsuz bir şekilde çalışıyor. bu durumda normal olarak timer kesme önceliği değeri de ne verilirse verilsin önemli olmuyor.

yada sistemde yalnızca dış external pin kesmeleri olsun. çalışmada yine bir sorun yok. yine kesme önceliği değeri diye bir sıkıntıda yok.

ama sistemde birden fazla timer ve dış pin kesmesi olduğunda. ve çalışma öncelik ve modlarıda şartlara göre değiştiğinde, sorunlar başlıyor. kimin kimi nezaman kesmesi durumuda değişiklik gösteriyor. birde kesilmemesi gereken rutinler oluyor. ama kesilmeden de istenilen çalışma sağlanamıyor.  hem kesilmemesi gerekiyor hem de kesilmek zorunda kalınıyor. timer kesmesi bölünmeden işletilmeli ama harici pin kesmesi daha öncelikli olduğundan bu oluştuğunda gecikmeden onunda isteği yerine getirilmeli. gibi durumlar var. ama bu durum da timer kesme içeriği yürütülürken durdurulduğunda sıkıntı olabiliyor. karmaşık bir durum. 

bu türden kesmeler arası boğuşmaya ve anlaşılması zor karmaşaya girmeden şunu öğrenmek istiyorum.
nasıl tek bir kesmeyle sistem sorunsuz bir şekilde çalışıyor ya, biz fazla sayıda kesmelere ait DMA ları barındıran bir sistem kullanımı ile, kaç adet kesme kullanırsak kullanalım. bunların öncelik sıralarıda önemli olmadan ve kesmeler arası kesinti yapılmadan ve birbiri içine dallanmadan bir çalışma yapmayı becerebiliyor muyuz. bu duruma DMA çözüm oluyor mu?

Burada kesinlikle RTOS' u kastetmiyorum. yine kesme oluştuğunda içerisindeki rutin sıra ile şartlara göre işletiliyor. yani işlemci mantığı korunuyor. ama kesmeler bir birini etkilemeden ve bölüp geciktirmeden çalışacak. kesme bittiğinde yine yarıda bırakılan yerden çalışma koşturulmaya devam edecek.

bu durumda çözüm için anahtar kelime DMA mıdır? yada nedir?

z

DMA bir adresden yada ardisil adreslerden bir baska adrese yada ardisil adreslere islemci gucune ihtiyac duymadan veri aktarmaya yarar. Dolayisi ile senin DMA ile isin yok.

Bolca int kullanmak neden karmasaya neden olsun. Int rutinlerinde flaglari kullanmak suretiyle ana programdan isleyise hukmedebilirsin.

Durum makinesi (state machine) senin isini kesin gorecektir. Fakat debug islemi bir hayli zorlasir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

İki ayrı timer, 3 Farklı harici kesmeyi aynı anda çalıştırdığım projeler olmuştu. Çözüm Z'nin dediği gibi kesme içerisindeki bayrakları set edip ana programda önceliğe göre işlemek. Bu şekilde çok fazla senaryonun içinden çıktığım oldu. Düzgün kodlamak çok önemli.

Çok önemli olan kısa işlemleri zaten kesme içinde yapıyorum. Önemsiz olan yani birkaç ms sonra da yapılsa sorun olmayacak işler için kesme içinde bir bayrak set edip ana programda buna göre işlemi yapıyorum.

HAKKITANIR

DMA düşündüğüm çalışmayı yapmıyor anladım. çözüm etkin kod yazmakta diyorsunuz. Durum makinesi (state machine) bunu araştıracağım. debugsuz çalışma yapamıyorum. led falan yaktırıp test yapmakla iş hallolmuyor.

kesmeler hakkında aşağıda hatalı olduğum yer var mı dır? Bir yerde hatam olmalı ki çözüme ulaşamıyorum.

- CN dış pinlerin ortak tek bir kesmesi var. ve bunun önceliği yüksek bir değerde.
- birde timer kesmesi var ve bunun önceliği CN kesmesine göre daha düşük bir değerde. başkada kesme yok diye düşünelim.
- önce CN kesmesi oluştu. kesme oluştuğunda bayrağı bizim irademiz dışında otomatikmen 1 oldu.
ve kesme içerisindeki satırlar işletilmeye başlandı.
- biz CN kesmesi içerisindeki satırların tamamı işletilmeden, tekrar yeni bir CN kesmesinin oluşmasını istemiyorsak, CN kesmesi içindeki çalışmasını istediğimiz tüm satırların en sonunda CN bayrağını sıfırlamalıyız. CN bayrağı sıfırlanana kadar tekrar yeni bir CN kesmesine izin verilmez.
CN kesmesi içinde while() gibi zaman gecikmesi (bu zaman gecikmeleri kesmesiz çalışan tipde CN kesmesi içinde kod olarak çalışıyor olsun ve for() tarzında döngü yapan satırlar bile olsa bu böyledir. CN bayrağı sıfırlanana kadar kesme içerisinde ne varsa çalıştırılır. ve ana programdaki While(1) içerisinde kaldığımız yere dönülmez. yalnız burda CN kesmesi oluştuğunda, timer kesmesinin oluşup oraya dallanılmasını istemiyorsak CN kesmesinin en başında timer bayrağını 1 yapmalıyız ki, timer kesmesi bayrağı sıfır yapılana kadar oluşmasın. ve CN kesmesi sonunda önce timer bayrağını sıfır ve sonrada kendi CN bayrağını sıfır yapıp CN kesme içerisindeki satırları sonlandırmalıyız.
- Kesme öncelik değerleri (IPL) sadece, ana program while(1) içerisinde kesmelerin tam aynı anda oluşma durumlarında hangisinin kesmesine öncelikle gidileceğini belirler ve başkada bir fonksiyonu yoktur. yani herhangibir kesme oluştuğunda, kesme içerisinde herhangibir kesmenin (buna kendisninkide dahil) IPL kesme öncelik değerinin bir öenemi kalmaz. bu IPL değerinin yüksekliği veya düşüklüğü tamamen while(1) ana döngüsü içinde geçerli bir durumdur.
- CN kesmesi içinde timer kesmesi oluşursa, ozaman timer kesmesine dallanılır ve timer bayrağı sıfır yapılana kadar bir daha timer kesmesi oluşmaz ve timer kesmesi içerisindeki satırlar komple yürütüldükten sonra tekrar CN kesmesinde kalınan yere dönülür ve CN kesmesi satırları kalınan yerden işletilir.

o zaman bizim normal bir çalşma da kesmelerin modüllerini çalıştıran on/off yapan biti ile ve Kesmelerin aktif edildiği xIE değerlerini, while(1) program içinde ve kesmelerin içerisinde değiştirmemize gerek yok. (enerji tasarrufu falan yapıp - uyutmayacaksak tabi ki) bu değerler int main(void) ana program başlangıcında açılıp - aktif edilecek ve öylece kalacaklar. sonra işimiz while(1) içerisinde ve kesmelerin içinde kendi ve diğer kesme bayraklarıyla olacak.

hatam var mı?

rree

    Kesmeye ait program oldukça kısa tutunuz.Kesme içinde özel bir biti bayrak yapıp. Ana programda özel bayrak 1 olduğunda çalışacak bir metot oluşturun. Eğer diğer kesmede acil durumu önemli ise Ana programdaki metottan kolayca ayrılıp ikinci kesme programını çalıştırır. Size bir fikir olabilir.

HAKKITANIR

yukarıda yazdığım kesmelerin çalışma mantığında hatam yoksa.

bu çalışmayı öyle yada böyle bir şekilde tamamlayacağız artık.
anladığım üzerinde durup kod çeşitlendirmek gerekiyor. deneme yanılma üzerinde durma zaman harcama şart. çok eksiğim var.

DMA nın hiç mi katkısı olmuyor bu tarzdan bir çalışmaya. hayallerimi yıktı bu DMA ben daha farklı düşünmüştüm onu.
 
birde yeni 2 cpu lu işlemciler okuyorum. burda cpu sayısı artınca kesmeler aynı anda paralel çalışabilir mi acaba?
kesmeleri 2-3 adet de olsa paralel çalıştıran işlemci mantığında bir sistem yok mu dur? hani hemen alıp kulanacağım dan değil de şimdilik bilgimiz olsa yeterli olacak. iş cpu sayısıyla alakalı denebilir mi?
1. cpu farklı kesme-kesmeleri 2. cpu da diğer kesme veya kesmeleri işlettirecek mantık bu mudur?

Mucit23

İş organizasyonda bitiyor. Organizasyon düzgün yapılırsa birçok işlem eş zamanlı gibi düzgünce yapılır. RTOS benzeri yapıların bu organizasyonda avantajı çok fazla.

DMA ya şöyle bir örnek vereyim. Örneğin UART ile sürekli veri okuyorsun. Ve bu veriyi farklı bir iletim kanalı (Örneğin SPI ile )başka bir noktaya göndermen gerekiyor. Normalde Her veri geldiğinde veya her veri paketi geldiğinde kesme oluşur ve gidip kesme içinde gelen paketi alıp SPI ile iletilmesini sağlarsın. Bu işlemi otomatik yaparsın. Ama DMAyı bu iş için ayarlarsan bu işlemi işlemciden bağımsız bir şekilde otomatik olarak yaparsın. DMA arka planda çalışır. Veri gelmiş gitmiş senin haberin olmaz.

ADC içinde basit bir örnek verilebilir. ADC arka planda çalışsın her örnek aldığında bu veriyi UART ile göndersin dersen DMA arka planda hepsini yapabilir.

RaMu

İstersen gerçek senaryoyu söyle biz olsak nasıl yazardık diye cevaplayalım,
yazdıkların çok havada örnekler,
bahsedildiği gibi bizim işimizi görmeyen bir durum olmadı şu ana kadar
ha birde bu donanımlarla bu iş yapılmaz veya
yapılması çok zahmetli uğraşmaya değmez
dediğimiz durumlar oluyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OptimusPrime

+

Birde timing analizi yapmanda fayda var belkide istedigin islemi gerceklestirecek kadar hizli degilsindir/degildir.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||