Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => RTOS Uygulamaları => Konuyu başlatan: kageja - 09 Kasım 2015, 12:52:09

Başlık: FreeRTOS Interrupt Exception
Gönderen: kageja - 09 Kasım 2015, 12:52:09
Merhaba Arkadaslar,

FreeRTOS ile calisiyorum. Alt katmandaki ISR icine semaphore verdigim zaman default interrupt service routine'nime dusuyor. Vector tablosunda semaphore kullanabilmek icin tanimlama mi gerekiyor. Isin tuhaf tarafi hemen default interrupt service routine'ne dusmuyor 1-2 dk sonra dusuyor. Sorun nerdedir sizce bu is icin prosedur nedir ?

Saygilarimal iyi calismalar.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: CoşkuN - 09 Kasım 2015, 13:11:08
exception handler fonksiyonları tanımlı değilse bir exception yediğin için default handler'a gidiyor olabilir.
Semaphore'un interrupt içerisinde çağırılması ile ilgili farklı fonksiyonlar olabilir mi acaba? xSemaphoreTakeFromISR gibi felan onu mu kullanıyorsun?
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 09 Kasım 2015, 13:55:15
Uart interrupti icinde;
xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken); bunu cagiriyorum,

Task1'in icinde de;
xSemaphoreTake(xSemaphore, portMAX_DELAY); bunu cagiriyorum.

biraz calisiyor sonra kut diye
void default_isr(void)
{
   #define VECTORNUM                     (*(volatile uint32_t*)(0xE000ED04))

  //printf("\n****default_isr entered on vector %d*****\r\n\n",VECTORNUM);
}

buraya dusuyor. uart interrupti icin fonksiyonlar tanimli freertosa gecince buraya dusuyor baremetalde calisiyor normal
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: vsalma - 09 Kasım 2015, 14:55:52
interrupt icinde semaphore kullanimi tavsiye edilmez. Datayi interrup icinde bir buffer a doldurup zamanlama gereksiniminize gore baska bir task semaphore olustursun. Hatta daha da ileriye gidersek cok kritik sistemlerde interrupt kullanimi tasiye edilmez determinizmi bozdugu icin.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: yamak - 09 Kasım 2015, 20:54:48
Alıntı yapılan: vsalma - 09 Kasım 2015, 14:55:52
interrupt icinde semaphore kullanimi tavsiye edilmez. Datayi interrup icinde bir buffer a doldurup zamanlama gereksiniminize gore baska bir task semaphore olustursun. Hatta daha da ileriye gidersek cok kritik sistemlerde interrupt kullanimi tasiye edilmez determinizmi bozdugu icin.

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.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 10 Kasım 2015, 00:33:51
Bu isin procedure nu bende oyle biliyordum. Altkatmandan ust katmana signal gondermek icin givefromisr fonksiyonlari kullaniliyor
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: yamak - 10 Kasım 2015, 09:44:47
Alıntı yapılan: vsalma - 09 Kasım 2015, 14:55:52
interrupt icinde semaphore kullanimi tavsiye edilmez. Datayi interrup icinde bir buffer a doldurup zamanlama gereksiniminize gore baska bir task semaphore olustursun. Hatta daha da ileriye gidersek cok kritik sistemlerde interrupt kullanimi tasiye edilmez determinizmi bozdugu icin.
Hocam tam okumamıştım ne yazdığınızı.Galiba demek istediğiniz:
Atıyorum her byte geldiğinde semaphore release etmek yerini atıyorum 100 byte a kadar buffer'layıp daha sonra release etmek.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 10 Kasım 2015, 09:48:33
Zaten dediginiz sekilde semaphore u kullaniyorum. Ancak bi zaman sonra default isr ye gidiyor yukarda kodu paylasmistim.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: X-Fi - 10 Kasım 2015, 10:17:10
Uart içerisinde byte başına semaphore vermek veri akışını yavaşlatır ve işlemciyi fazla meşgul eder. Bunun yerine buffer oluşturup bu buffer için bir Mutex tanımlamanız gerekiyor xSerialRxMutex = xSemaphoreCreateMutex(); gibi veri alımı başladığında buffer'ı korumaya alıp alım tamamlandığında xSemaphoreGive(xSerialRxMutex); ile korumayı kaldırırsınız. bu şekilde semaphore yaptığınızda daha doğru ve hızlı veri alırsınız.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 10 Kasım 2015, 10:44:04
Oncelikle konuya tekrar aciklik getireyim.

Uart interrupti icinde;
xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken); bunu cagiriyorum, bunu byte byte degil gelen datanin buyuklugu ne ise protocolum var elimde 12 bytlik data gelicek ise 12 byte alip release ediyorum.

sonra
Task1'in icinde de;
xSemaphoreTake(xSemaphore, portMAX_DELAY); bunu cagiriyorum. bu makro ilede signal alip ona gore taski isliyorum.

ama zaman sonra biraz calisiyor sonra kut diye
void default_isr(void)
{
   #define VECTORNUM                     (*(volatile uint32_t*)(0xE000ED04))

  //printf("\n****default_isr entered on vector %d*****\r\n\n",VECTORNUM);
}
buraya giriyor.

simdi burdaki yanlislik nerde olabilir. sizin dediginiz metodlarda yaptigimi dusunuyorum. Sonra mutex ile binary semaphore arasindaki fark nedir. birde ISR icinde xSemaphoreGive degilde xSemaphoreGiveFromISR makrosunun kullanilmasinin daha uygun oldugunu biliyourm.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: mufitsozen - 10 Kasım 2015, 10:54:36


1- default ISR'a hangi vector'den giriyor?

Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 10 Kasım 2015, 10:58:14

#define VECTOR_028      default_isr     // 0x0000_0070 28    12     SCI0             UART0
#undef  VECTOR_028
#define VECTOR_028        UART0_Isr

vector tablomdaki vektorler bunlar, arm cortex m0+ islemciye gore vektorler bunlar diye iliyorum datasheet'te o sekilde gordum

sonra UART0_Isr() fonksiyonu icinde xSemaphoregivefromISR yapiyorum
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: yamak - 10 Kasım 2015, 11:18:33
Alıntı yapılan: kageja - 10 Kasım 2015, 10:44:04
Sonra mutex ile binary semaphore arasindaki fark nedir. birde ISR icinde xSemaphoreGive değilde xSemaphoreGiveFromISR makrosunun kullanilmasinin daha uygun oldugunu biliyourm.

Hocam bir shared resource varsa mutex kullanılır.Çünkü bir mutex'i bir task almışsa ancak yine o task bırakabilir.Ama semaphore böyle değildir.Bir semaphore herhangi bir task tarafından release edilebilir.Ayrıca semaphore'da priority inversion kontrolü yoktur fakat mutex'te vardır.

mesaj birleştirme:: 10 Kasım 2015, 11:26:18

Bir de hocam tüm vector tablonuzu ve interrupt handler'larınızın kodlarını paylaşabilir misiniz?Böyle yorum yapmak çok zor.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: mufitsozen - 10 Kasım 2015, 11:54:29
Alıntı yapılan: yamak - 10 Kasım 2015, 11:18:33
Hocam bir shared resource varsa mutex kullanılır.Çünkü bir mutex'i bir task almışsa ancak yine o task bırakabilir.Ama semaphore böyle değildir.Bir semaphore herhangi bir task tarafından release edilebilir.Ayrıca semaphore'da priority inversion kontrolü yoktur fakat mutex'te vardır.

mesaj birleştirme:: 10 Kasım 2015, 11:26:18

Bir de hocam tüm vector tablonuzu ve interrupt handler'larınızın kodlarını paylaşabilir misiniz?Böyle yorum yapmak çok zor.
+10

bende hangi vector derken, hataya sebep olan Interrupt vector'u sormustum.

Ayrica semaphore ile bilginin hazir oldugunu isaret etseniz bile mutex ile ortak kullanilan bolgeye erisimin kontrollu olmasi lazim.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 10 Kasım 2015, 11:57:30
Iste henuz hangi ISR vectoru icin o hatay dustugunu bulamadim takdir edersiniz ki 47 tane vector var. Ortak kullanim alani olan bir interrupt handler var ama buna sadece task1 erisiyor diger tasklarin bu interrupt ve icindeki bilgi ile isi yok. Bu durumda da mutex gerekir mi ? Sistem baremetal olarak sorunsuz calsiiyor ancak semaphore kullanidigim zaman bu hatayi aliyorum

mesaj birleştirme:: 10 Kasım 2015, 11:58:03

vector tablosunu ve interrupt handler fonksiyonunu istiyorsaniz birazdan paylasirim.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: vsalma - 10 Kasım 2015, 13:19:24
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.
 
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: 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.
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: vsalma - 10 Kasım 2015, 14:44:13
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.






Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 10 Kasım 2015, 14:48:55
#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.

Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 12 Kasım 2015, 15:28:53
Arada baska konulara baktigim icin konu guncelligini koruyor arkadaslar.

Yardimlarinizi bekliyorum :)
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 23 Kasım 2015, 16:45:29
@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
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: vsalma - 27 Kasım 2015, 11:56:00
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.   
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: 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.

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

Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: vsalma - 27 Kasım 2015, 16:55:00
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. 

         
Başlık: Ynt: FreeRTOS Interrupt Exception
Gönderen: kageja - 27 Kasım 2015, 17:11:34
[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.