FreeRTOS Interrupt Exception

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

kageja

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.

CoşkuN

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?

kageja

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

vsalma

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.

yamak

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.

kageja

Bu isin procedure nu bende oyle biliyordum. Altkatmandan ust katmana signal gondermek icin givefromisr fonksiyonlari kullaniliyor

yamak

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.

kageja

Zaten dediginiz sekilde semaphore u kullaniyorum. Ancak bi zaman sonra default isr ye gidiyor yukarda kodu paylasmistim.

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

kageja

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.

mufitsozen



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

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

kageja


#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

yamak

#12
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.

mufitsozen

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.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

kageja

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.