Cubemx interrupt sorunu

Başlatan cyhn41, 17 Haziran 2016, 19:38:30

cyhn41



Merhabalar stm32f103 de kesme uygulamasında bir sorunla karşılaştım. Programda sürekli yanıp sönen bir led var, birinci kesme ile bir led bir buzzer devreye girecek, ikinci kesme ile buzzer devreden çıkacak , reset gelene kadar sistem durumunu koruyacak.
Birinci kesme geldiğinde led ve buzzer devreye giriyor ve ana programdaki led yanıp sönmeye devam ediyor , ikinci kesme geldiğinde buzzer devreden çıkıyor ve ana programdaki yanıp sönen led o anki durumunu koruyor.
Sorum şu kesmelerin ikisi de özdeş olduğuna göre birinci kesme ana programdaki led e müdahale etmediği halde ikinci kesme neden ana programa müdahale ediyor?

memo333

IRQ Handler'lar HAL kütüphanesinde bir Callbcak'e yönlendirir.. Callback fonksiyonunda bir şey unutmuş olmayın??
Gömülü Linux Notları --> http://linuxedu.xyz/

cyhn41

Ne gibi bir şey unutmuş olabilirim. Program kesmeye gidince ana programın durmasını istiyorum.

Klein

2. kesmede sonsuz döngüye giriyorsun. Ana kodun işletilememesi normal.

memo333

soruyu yanlış anlamışım.. şu haliyle ledin son konumu neyse onu koruyacak..
Gömülü Linux Notları --> http://linuxedu.xyz/

tekosis

Alıntı yapılan: memo333 - 17 Haziran 2016, 21:43:05
IRQ Handler'lar HAL kütüphanesinde bir Callbcak'e yönlendirir.. Callback fonksiyonunda bir şey unutmuş olmayın??
@memo333 hocam bahsettiğiniz şey arkadaşın programındaki 55 ve 66 numaralı satırlar mı? Bahsettiğiniz callback olayı ne için kullanılır?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

memo333

Yukarıda STM32 HAL kütüphanesindeki interrupt-callback olayını göstermeye çalıştım. HAL kütüphanesinde interrupt vektörünün olduğu fonksiyona HAL.XXX_IRQ_handler isimli fonksiyonlar ekliyoruz.



Bu fonksiyonlara bakarsanız aslında yapılan işlemler

1- interrupt kaynağına göre ilgili flaglarin temizlenmesi
2- ilgili callback fonksiyonuna yönlendirilmesi

olarak özetleyebiliriz.



Peki bu callback fonksiyonu nerede? ne iş yapar?

Bu fonksiyonun içeriği tamamen bize kalıyor, Mesela Led yak, CAN RX verilerini incele PWM güncelle vs.. vs.. Aşağıdaki örnekte LED toggle edilmiş..




Önemli :   Callback Fonksiyonlarının prototipleri sabittir ve her koşulda __weak parametresi ile ilgili HAL kütüphane dosyasında bulunur. Bu sayede Callback mantığı kullanılmasa da program hata vermez, ancak bu durum kafamıza göre de callback fonksiyonu tanımlamamıza engel olur.

Örnek olarak




Son olarak: HAL Callback mekanizması özellikle sürat istenilen durumlarda cevap veremiyor, ancak çoğu durumda kolayca program yazılmasına olanak sağlıyor.
Gömülü Linux Notları --> http://linuxedu.xyz/

tekosis

hocam cevap için teşekkür ederim. bu günlerde cubemx ile keil çalışmaya başladım. eminim işime yarayacaktır.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Burak B

Alıntı yapılan: memo333 - 19 Haziran 2016, 12:19:01
...
Son olarak: HAL Callback mekanizması özellikle sürat istenilen durumlarda cevap veremiyor, ancak çoğu durumda kolayca program yazılmasına olanak sağlıyor.

Neden sürat istenen durumlarda cevap veremediğini düşünüyorsunuz ?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

magnetron

hocam callback fonksiyonu neden gerekli ?

Led yakıp söndürmeyi direk interrupt rutini içinde yapsa olmaz mı ?

memo333

#10
Alıntı yapılan: Burak B - 19 Haziran 2016, 18:22:24
Neden sürat istenen durumlarda cevap veremediğini düşünüyorsunuz ?

HAL kütüphanesi iyi güzel ama eski kütüphaneye göre daha fazla yer kaplıyor. Biraz bilgisayar programcısı mantığıyla yazılmış. Uğraştığım bir iş sırasında sistemi geciktirdiğini farkettim ve IRQ_Handler fonksiyonu yerine -eski usül- kendim yazdım.

mesaj birleştirme:: 19 Haziran 2016, 23:17:01

Alıntı yapılan: magnetron - 19 Haziran 2016, 18:56:49
hocam callback fonksiyonu neden gerekli ?

Led yakıp söndürmeyi direk interrupt rutini içinde yapsa olmaz mı ?

kesinlikle yapılabilir öyle bir kesin koşul yok sonuçta bare-metal çalışıyoruz :)

Callback fonksiyonuna HAL kütüphanesinin HAL_XXX_IRQ_Handler fonksiyonları zaten yönlendiriyor, bu yüzden kodun daha derli toplu olması için orada yazılması daha iyi olur..
Gömülü Linux Notları --> http://linuxedu.xyz/

Burak B

@memo333 haddimi aşmak istemem ancak affınıza sığınarak bence birşeyleri yanlış yapıyorsunuz. Siz ST' nin HAL kütüphanelerini kullandığınızı kastederek -callbackler yavaş- şeklinde bir kanıya varmışsınız. Ancak gözleminiz hatalı. Callback kullanımı yazılım mühendisliğinin öğretilerinden biri ve önemli bir yöntemdir. Ayrıca sistemleri yavaşlarmak için değil daha modüler, hızlı ve yönetilebilir yapmak için kullanılırlar.  Eğer siz baremetal bir sistemde (RTOS veya FSM olmayan) bir ISR callback içerisine gidip bir sürü fonksiyon yada "delay, while, for, v.b." gibi bloklayan kod parçalarıyla doldurursanız pek bir etkisi olmayacaktır. Eğer yazdığınız kodda callback kullanmanın kodunuzu ağırlaştırdığını düşünüyorsanız bence kod yazım tekniğinizi ve uyguladığınız patternleri gözden geçirmelisiniz.

Yazdıklarım kesinlikle kimseyi gücendirmek için değil. Sadece yanlış olanı düzeltmek adına vazife olarak gördüğüm için.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

PROTECH_

Verilen cevapları inceleme imkanım pek olmadı ama
Ikinci interruptaki while(1) nedir ?

Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

cyhn41

Alıntı yapılan: PROTECH_ - 20 Haziran 2016, 09:09:05
Verilen cevapları inceleme imkanım pek olmadı ama
Ikinci interruptaki while(1) nedir ?
Program kesmeye gittiginde ana programı durdurmak için koydum ama tam çözüm olmadı ana programı durduran alternatif çözüm arıyorum.

memo333

Alıntı yapılan: Burak B - 20 Haziran 2016, 00:07:33
@memo333 haddimi aşmak istemem ancak affınıza sığınarak bence birşeyleri yanlış yapıyorsunuz. Siz ST' nin HAL kütüphanelerini kullandığınızı kastederek -callbackler yavaş- şeklinde bir kanıya varmışsınız. Ancak gözleminiz hatalı. Callback kullanımı yazılım mühendisliğinin öğretilerinden biri ve önemli bir yöntemdir. Ayrıca sistemleri yavaşlarmak için değil daha modüler, hızlı ve yönetilebilir yapmak için kullanılırlar.  Eğer siz baremetal bir sistemde (RTOS veya FSM olmayan) bir ISR callback içerisine gidip bir sürü fonksiyon yada "delay, while, for, v.b." gibi bloklayan kod parçalarıyla doldurursanız pek bir etkisi olmayacaktır. Eğer yazdığınız kodda callback kullanmanın kodunuzu ağırlaştırdığını düşünüyorsanız bence kod yazım tekniğinizi ve uyguladığınız patternleri gözden geçirmelisiniz.

Yazdıklarım kesinlikle kimseyi gücendirmek için değil. Sadece yanlış olanı düzeltmek adına vazife olarak gördüğüm için.

had, af bunlara gerek yok yaf :) alt tarafı kod tartışıyoruz şurada :)

kodu paylaşamıyorum ancak şundan emin ol herhangi bir şekilde bir while, delay kullanmak zaten hiç huyum değildir. int rutinin oldukça kısa olmasını sağlarım, gerekirse global bir değişkene değer yükler main de işimi hallederim. Ancak HAL kütüphanesi bazı olaylarda CPUyu yorabiliyor.

En basitinden şunu göze alalım. Int rutininin altında HAL_XXX_IRQ_HAndler fonksiyonuna gidip, oradan Callback fonksiyonuna gitmek ne kadar stack ve süre kaybıdır? Ki bunlar int vektörünün altında olan olaylar.(hoş cortex-m'de bu pek fark etmiyor. qleaps'in youtube'da  videosu bunu gösteriyor.)

Mesela bu tip hareketi 8051de veya PIC16 serisinde yapamazdık -stack nedeniyle- sadece MCU güçlendi diye kalkışabiliyoruz :)

Son olarak ST'de bu durumu gördü ve LL kütüphanesini çıkardı. Şu anlık sadece F0 ailesi için geçerli ama bakalım ST emmimiz ne demiş

"Introduce Low Layer drivers allowing performance and memory footprint optimization with register access level programming."
Gömülü Linux Notları --> http://linuxedu.xyz/