FreeRTOS Led Toggle

Bowman

Aktif Üye
Katılım
7 Ekim 2022
Mesajlar
112
Bu zamana kadar hep bare metal çalıştım. RTOS konseptlerini öğrenmek için de yeni yeni uygulama yapmaya başlamak istiyorum. Elimde Nuvoton'un bir developer kiti var. M032SG8AE mikroişlemci var üzerinde. FreeRTOS'un source kodlarını indirdim ve projeme import ettim. LED_Task diye bir task oluşturdum. Bu task içerisinde bir ledi toggle ediyorum.

LED_Task:
C:
void LED_Task( void *pvParameters )
{
    while(1)
    {
        PB14 ^= 1;
        
        vTaskDelay(500/portTICK_RATE_MS);
        // delay(500000);
    }
}

Main içerisinde de şu şekilde task oluşturdum:

C:
int main()
{
    SYS_Init();
    SysTick_Config(SystemCoreClock / 1000);
    UART0_Initial();
    GPIO_Initial();
    Timer0_Initial();
    
    xTaskCreate(LED_Task,"LED_Task",configMINIMAL_STACK_SIZE,NULL,1,NULL);
    vTaskStartScheduler();

    
    while(1);
}

Kodu çalıştırdığımda led yanıyor ama geri sönmüyor. Toggle olmuyor sadece 1 defa yanıyor o kadar. Debug girdiğimde kodun fotoğraftaki yerde kaldığını gördüm.

task.png


İnternette araştırma yaptım. Forumlarda xTaskDelay() fonksiyonu ile ilgili yorumlar yapıyorlardı. Bende xTaskDelay() fonksiyonunu yorum yapıp kendim bir delay fonksiyonu yazdım. Bunun sonucunda led toggle oldu. xTaskDelay() varken çalışmıyor. Yukarıdaki ekran görüntüsündeki yerde kalıyor kod. Fakat benim yazdığım delay kodu ile çalışıyor led toggle işlemi. Buradaki problem nedir?
 
Delay için şunu dene:

C:
vTaskDelay(pdMS_TO_TICKS(500));
 
Debugger ile adım adım çalıştırmayı dene. Belki de daha hardware yapılandırılırken en başlarda bir exception oluşuyor.
 
Saat 02.20 ve sonunda problemi çözmeyi başarabildim. Çok canımı sıktığı için bunu bir kenara atmıştım. :kotek1:

Problem şu sanırsam. Burada bir context switch var fakat onun handler'ının map edilmiş hali yok. Yani Nuvoton şunu bilmiyor.

C:
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

Bu da aslında daha önce karşılaştığım bir tarz problemdi. Interrupt aktif edip handler fonksiyonunu yazmadığım zaman yine aynı şekilde kod takılıyordu. Neyse Nuvoton kullanıp bu problemle karşılaşan birisi olursa FreeRTOSConfig.h dosyasının sonuna bu 3 satırı eklesin. Şunu da farkettim. Nuvoton aslında kendi işlemcisi için FreeRTOSConfig.h dosyasını modifiye edip paylaşmış. Neyse böyle böyle tecrübeleneceğiz artık. :katil1:
 
Merhabalar..
FreeRTOS dosyalarında bu üç kesme özel olarak kullanılıyor rtosun yönetilmesinde payları çok büyük. Bu üç kesmenin nasıl çalıştığını anlarsanız büyük yol katedersiniz. Birde task create edilirken bir hata olursa diye assert fonskiyonu kullanılıyor eğer program oraya giderse taskcreatede bir hata olduğunı anlarsınız, debug yapmada büyük kolaylık sağlıyor
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,952
Mesajlar
118,759
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top