FreeRTOS Led Toggle

Bowman

Aktif Üye
Katılım
7 Ekim 2022
Mesajlar
102
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 personel

Forum istatistikleri

Konular
5,926
Mesajlar
101,235
Üyeler
2,504
Son üye
yaxe22

Son kaynaklar

Son profil mesajları

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?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
Back
Top