FreeRTOS Interrupt Exception

Başlatan kageja, 09 Kasım 2015, 12:52:09

vsalma

Alıntı yapılan: yamak - 09 Kasım 2015, 20:54:48
Hocam interrupt içinde semaphore kullanımı neden önerilmiyor.
Benim bildiğim de:
interrupt rutinini meşgul etmemek adına semaphore release edip interrupt rutininin içinde yapılacak işleri ayrı bir task a yaptırmak.

sem post etmek schedulari tekrar cagirmaya zorluyor. Eger yuksek oncelikli bir task semaphoru bekliyorsa ona kontrolu vermek icin (Preemtive kullanildigini varsayiyorum). Sem_post un maliyetine de bakmak lazim. RTOS a gore degisiklik gosterebilir. Spesifik FreeRTOS u bilmiyorum. Belki xSemaphoreGiveFromISR bunun icin ayrilmistir. Cunku interruptin ne zaman gelecegi belli olmuyor. Bir sensor bozuldu fazla data gonderiyor diye durmadan schedulari cagirmak garip olur. Sensor bozuldu durmadan interrup geliyor, o durumda ne olacak? Bunun icin zaten interruptlar da kullanilmiyor. Yuksek buffera sahip IO lar kullanilip peryodik olarak poll ediliyor. Cunku diger turlu worst case execution time i analiz etmek cok zor.
 

kageja

Merhablar hocam preemtive diyerek tam olarak ney i kast ediyorsunuz ? Ben kullandigimi dusunmuyorum. RTOS'da yeniyim ancak apilerinin dokumanlarini videolari izleyerek ogrenmeye calisiyorum. Orda ogrendigim metodlarda boyle bir yontem vardi. Ben neden peki boyle yapiyorum dersem, uart'tan veri geldikce yapmam gereken bir task var o yuzden durumu bu sekilde schedule etmeyi dusundum yoksa farkli scheduled metodlari varsa onlari da uygulayabilirim mesela cok duydugum robin round scheduled metodu tam olarak nasil implemente edecegimi bilmiyorum? Sorunumu en basta ve simdi net bi sekilde aciklik getirmisimdir umarim.

vsalma

#17
Alıntı yapılan: kageja - 10 Kasım 2015, 13:58:25
Merhablar hocam preemtive diyerek tam olarak ney i kast ediyorsunuz ? Ben kullandigimi dusunmuyorum. RTOS'da yeniyim ancak apilerinin dokumanlarini videolari izleyerek ogrenmeye calisiyorum. Orda ogrendigim metodlarda boyle bir yontem vardi. Ben neden peki boyle yapiyorum dersem, uart'tan veri geldikce yapmam gereken bir task var o yuzden durumu bu sekilde schedule etmeyi dusundum yoksa farkli scheduled metodlari varsa onlari da uygulayabilirim mesela cok duydugum robin round scheduled metodu tam olarak nasil implemente edecegimi bilmiyorum? Sorunumu en basta ve simdi net bi sekilde aciklik getirmisimdir umarim.

Selamlar, benim cevabim aslinda yamak a idi. Sizin probleminiz benim yazdilarimla alakali değildir buyuk bir olasilikla.

Preemtive calisma modunda yuksek oncelikli bir gorev islemesi gerekiyorsa o anda kosan dusuk oncelikli gorevin calismasini keser. Cooperative calisma modunda ise islemciyi dusuk oncelikli task kullaniyorsa kendisi birakmadan (tsk_sleep vs) veya ona atanan sure tamamlanmadan calismasi kesilmez.

FreeRTOSConfig.h
da #define configUSE_PREEMPTION                    1
flagi varmis oradan acip kapatabiliyomussunuz preeemtion i.

Bir deneyin ama bunla alakali oldugunu sanmiyorum. Tasklara atadiginiz stackleri bir kontrol edin yeteri kadar verdiniz mi?

taskinizin icinde semephorun altindaki islemleri commentleyin bu sekilde sistem donuyor mu yoksa yine ayni yere mi dusuyor.
Bu sekilde sistem calisiyosa commentlediginiz kodlara yogunlasirsiniz hata ararken.

Ayni sey oluyorsa interrupt icinde semaphoru commentleyin bir flagle yapin isi semaphordan kaynaklandigindan emin olmak icin.
Belki baska bir seyle alakalidir.







kageja

#define configUSE_PREEMPTION            1
ever RTOS configlerinde bu flag set etmisim Onun haricinde baska bisi yapmam gerekiyorsa bilmiyorum. Stackler ile ilgili evet problem olailir ama soyle soylim, smaphore kullanmadan task1'in icinde sonsuz while icinde interruptin set ettigi flagi izliyorum. interrupt caigirilinca bu flag set oluyordu task 1 icindeki gorevide yapmis oluyordum. Ancak bu takdir edersiniz ki islemciyi surekli task1 ile mesgul ediyor ben interrupt geldikce mesgul olsun istedigim icin semaphore kullandi bu sayede interrupt gelmedigi sure islemci iddle da kalicakti amacim buydu. Ama iste default vector isr icine giriyor BU SEFER.


kageja

Arada baska konulara baktigim icin konu guncelligini koruyor arkadaslar.

Yardimlarinizi bekliyorum :)

kageja

@vsalma  evet flag ile bu isi yapiyordum o zaman calisiyordu ancak takdir edersiniz ki rtos kullaniyorsam artik baremetal aliskanliklari kaldirmak gerek :) global flag tutup sonsuz dongu icinde bu falgi okumak gibi :) Galiba Round Robin shcedule cooperative modda calisan bir yontem preemptive task tabanli bir metod bu cok tercih edilmiyor galiba cooperative mi calismak daha mantikli

vsalma

Yani scheduling tipi uyguluma ihtiyaciniza gore degisir. Belirli zamanda sonuc almaniz gereken bir task var mi vs? Preemtiona e ihtiyac yoksa cooperative ile calisin. Flag olayini sadece hataya sebep olan kismi sikistirip bulma anlaminda soylemistim.   

kageja

Evet cooperative modda scheduling yapisi kurmayi cok merak ediyorum yanilmiyorsam robin round scheduling metodu var. Ama nasil uygulayacagimi bilmiyorum daha yeniyim freertos'da cok az zaman harcadim.
Bu cooperative ozellik robin round scheduling metodu ile ilgili ornek bir yapi vs. varmi gosterebilir misiniz bana, neleri oncelikle config etmem gerekiyor vs.

Birde yari cooperative yari preemptive bir metod yapmak istesem nelere dikkat etmem gerkecek ne yapmam gerkecek.

Son olarak Global bir degiskenim olsun interrupt icinde ona veri kaydettigimi dusunelim. Bu global degisken freertosda sorun yaratirmi yada bunun yerine quee mi kullanmaliyim. Quee kullanmak sart midir yoksa stabilite acisindan daha mi faydali olur.

Bu sorulara cevap alabilirsem cok memnun olurum hocam.

mesaj birleştirme:: 28 Kasım 2015, 03:09:25


vsalma

#23
Alıntı yapılan: kageja - 27 Kasım 2015, 13:09:02
Evet cooperative modda scheduling yapisi kurmayi cok merak ediyorum yanilmiyorsam robin round scheduling metodu var. Ama nasil uygulayacagimi bilmiyorum daha yeniyim freertos'da cok az zaman harcadim.
Bu cooperative ozellik robin round scheduling metodu ile ilgili ornek bir yapi vs. varmi gosterebilir misiniz bana, neleri oncelikle config etmem gerekiyor vs.

Scheduling i rtosun kendisi yapiyor. Siz sadece tasklarinizi olusturuyosunuz. Ayar dosyasindan ayari yapiyosunuz. Tasklarin nasil cagrilacagi yaptiginiz ayarlara gore rtos hallediyor. 

Alıntı Yap
Son olarak Global bir degiskenim olsun interrupt icinde ona veri kaydettigimi dusunelim. Bu global degisken freertosda sorun yaratirmi yada bunun yerine quee mi kullanmaliyim. Quee kullanmak sart midir yoksa stabilite acisindan daha mi faydali olur.

Sart değil. Rtos da (sozde) paralel calisan pek cok task oldugu icin ortak bir kaynaga (global degisken v.s) kimler ne zaman erisiyor bunu goz onunde bulundurmalisiniz. Tek task bir global le is yapiyorsa bir sey olmaz. Biri yazip digeri okuyorsa belki okuyucu taski yazmadan once bekletmek gerekiyordur (Interrupt orneginde semaphore ile yaptiginiz gibi).
Global bir structure iniz olsun 30 bytelik. Yazan task tamamini yazmadan okuyucu task onu okumasin isteyebilirsiniz. O zaman lock, mutex gibi seyler kullanirsiniz.

Bu yapilarin bazi detaylari rtos dan rtos a degisiyor. Mesela bazi sistemlerde interrupti dogrudan rtos handle ediyor ve interupt fonksiyonu icerisinde kendinizin birsey yazmamasi gerekiyor. Bazilarinda yaziyorsunuz. Kullandiginiz isletim sisteminin dokumanlarini, tavsiye ettigi kullanim sekillerini inceleyin.

Bu RTOS bu isleri nasil yapiyo diyosaniz pdf ini bulabileceginiz su kitapta cok cok basit bir rtos un C++ ile uygulanmis hali vardi. 
"Programming Embedded Systems in C and C++ Michael Barr Publisher: O'Reilly"

Kesmezse FreeRTOS un kodu acik onu okuyun. Bunlar cok kucuk cihazlar icin yazilmis. Daha ust seviye islemciler icin istiyorsaniz
'Operating Systems: Design and Implementation 3/e by Andrew S. Tanenbaum and Albert S." i okuyup minix3 u inceleyin.

Okul devam ediyosa bilgisayar muhendisliklerinde 'isletim sistemleri' dersi var. O derste de bu kavramlar anlatiliyor. Online "operating systems" dersi de bulabilirsiniz diye tahmin ediyorum.

Iyi calismalar. 

         

kageja

[quote]
Scheduling i rtosun kendisi yapiyor. Siz sadece tasklarinizi olusturuyosunuz. Ayar dosyasindan ayari yapiyosunuz. Tasklarin nasil cagrilacagi yaptiginiz ayarlara gore rtos hallediyor.  
[/quote]

Mesela Ben Round Robin Scheduling metodunu kullanmak istiyorum diyelim o zaman tasklari nasil yapilandirmaliyim ? ve vStartScheduler() fonk.'undan baska bir sey cagirmam gerekli mi? 
Yoksa su anda FreeRTOSConfig.h icinde 
code]
#define configUSE_PREEMPTION			1
#define configUSE_CO_ROUTINES 			0

Seklinde preemptive metod kullaniyorum.

Alıntı Yap
Sart değil. Rtos da (sozde) paralel calisan pek cok task oldugu icin ortak bir kaynaga (global degisken v.s) kimler ne zaman erisiyor bunu goz onunde bulundurmalisiniz. Tek task bir global le is yapiyorsa bir sey olmaz. Biri yazip digeri okuyorsa belki okuyucu taski yazmadan once bekletmek gerekiyordur (Interrupt orneginde semaphore ile yaptiginiz gibi).
Global bir structure iniz olsun 30 bytelik. Yazan task tamamini yazmadan okuyucu task onu okumasin isteyebilirsiniz. O zaman lock, mutex gibi seyler kullanirsiniz.
Benim interrupt ile verileri bufferladigim bir taskim var o task gereken sayi kadar veri alinca diger task onu okuyor ortak kullanimlik yada tamami yazilmadan kullanma gibi bi durum yok. Bu soruyu sunun uzerine sormustum yine bu forumdan bi arkadas global degisken kullanmak cesaret ve bilgi gerektirir demisti ondan :) 

Alıntı Yap
Bu yapilarin bazi detaylari rtos dan rtos a degisiyor. Mesela bazi sistemlerde interrupti dogrudan rtos handle ediyor ve interupt fonksiyonu icerisinde kendinizin birsey yazmamasi gerekiyor. Bazilarinda yaziyorsunuz. Kullandiginiz isletim sisteminin dokumanlarini, tavsiye ettigi kullanim sekillerini inceleyin.

Bu RTOS bu isleri nasil yapiyo diyosaniz pdf ini bulabileceginiz su kitapta cok cok basit bir rtos un C++ ile uygulanmis hali vardi. 
"Programming Embedded Systems in C and C++ Michael Barr Publisher: O'Reilly"

Kesmezse FreeRTOS un kodu acik onu okuyun. Bunlar cok kucuk cihazlar icin yazilmis. Daha ust seviye islemciler icin istiyorsaniz
'Operating Systems: Design and Implementation 3/e by Andrew S. Tanenbaum and Albert S." i okuyup minix3 u inceleyin.
Minix'i cok duydum kendimde bir linux asigi oldugum icin minix torvalds'in esinlendigi gelistirlmesi gerektigi dusundugu bir sisitemdi ondaki eksikliklerden ilham alarak linux kernelini yazmisti :)
Biraz bende incelemistim RTOS v7 ile v8 arasinda bile kocaman farklar olusabiliyor config dosyalarinda vs. v8.2.3 hakkinda ve cortex m0+ hakkinda en dogru bilgiye port.c FreeRTOSConfig.h vs. nasil ulasabilirim.

Alıntı Yap
Okul devam ediyosa bilgisayar muhendisliklerinde 'isletim sistemleri' dersi var. O derste de bu kavramlar anlatiliyor. Online "operating systems" dersi de bulabilirsiniz diye tahmin ediyorum.

Okulum dewam etmiyor ama yaptigim baska isler var o yuzden bu alana tam zamanimi veremiyorum :) ama Minix ile ilgili tavsiyeniz benim icin cok onemliydi

Tesekkurler.