FreeRTOS Led Toggle

Bowman

Aktif Üye
Katılım
7 Ekim 2022
Mesajlar
129
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:
Kod:
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:

Kod:
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:

Kod:
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.

Kod:
/* 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
 

Forum istatistikleri

Konular
7,598
Mesajlar
126,946
Üyeler
3,073
Son üye
fasus

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top