FreeRTOS'ta tickless idle modu nedir, nasıl çalışır? Kullanırken nelere dikkat edilmelidir?

Cevap

Normalde RTOS, zamanı takip etmek için periyodik bir tick kesmesi (ör. 1 kHz) üretir. Sistem boştayken bile bu kesme CPU'yu her milisaniye uyandırır ve derin uykuyu imkânsız kılar. Tickless idle, sistem boşken tick kesmesini durdurup MCU'yu bir sonraki görev uyanma zamanına kadar tek seferde uyutur, uyanınca da kaçırılan tick'leri telafi eder.

Çalışma mantığı

  1. Idle task, tüm task'ların bloklu olduğunu görür.
  2. Kernel bir sonraki task'ın uyanacağı zamana kadar geçecek süreyi (expected idle time) hesaplar.
  3. Bu süre configEXPECTED_IDLE_TIME_BEFORE_SLEEP değerinden (varsayılan 2 tick) büyükse portSUPPRESS_TICKS_AND_SLEEP() çağrılır.
  4. Port kodu tick timer'ını bu süre sonra kesme üretecek şekilde yeniden programlar ve WFI ile uyur.
  5. Uyanınca (zamanlayıcıyla veya başka bir kesmeyle), gerçekte geçen süre ölçülür ve vTaskStepTick() ile tick sayısı düzeltilir.
/* FreeRTOSConfig.h */
#define configUSE_TICKLESS_IDLE                 1   /* 1: hazır SysTick tabanlı, 2: kendi implementasyonunuz */
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP   5
#define configPRE_SLEEP_PROCESSING(x)   board_pre_sleep(&(x))
#define configPOST_SLEEP_PROCESSING(x)  board_post_sleep(&(x))

Dikkat edilmesi gerekenler

  • SysTick derin uykuda durur. Hazır Cortex-M implementasyonu (configUSE_TICKLESS_IDLE 1) sadece Sleep modunda işe yarar. Stop moduna girmek için LPTIM veya RTC gibi derin uykuda çalışan bir timer ile kendi portSUPPRESS_TICKS_AND_SLEEP fonksiyonunuzu yazmanız gerekir (mod 2).
  • Zaman kayması: Düşük frekanslı timer'ın (32.768 kHz) çözünürlüğü tick ile tam örtüşmez; düzeltme hesabı dikkatli yapılmazsa saat kayar.
  • Uyanma gecikmesi: Stop modundan çıkıp PLL'in yeniden kilitlenmesi zaman alır. Hard real-time gereksinimleri buna göre değerlendirilmelidir.
  • Periyodik task'lar ve yazılım timer'ları uyku süresini kısaltır. Örneğin 10 ms'de bir LED kontrol eden bir task, tickless kazancının çoğunu yok eder; mümkünse olay tabanlı tasarıma geçilmelidir.
  • eTaskConfirmSleepModeStatus() ile uyumadan hemen önce bekleyen bir context switch olup olmadığı kontrol edilir; port kodu bunu kesmeler kapalıyken yapmalıdır.
  • Debugger bağlıyken düşük güç modları farklı davranabilir; akım ölçümünü debugger'sız yapın.
  1. RTOS nedir? Bare-metal programlamadan farkı nedir?ZorRTOSEmbedded
  2. RTOS'ta ISR içinde hangi API'ler kullanılabilir? Deferred interrupt processing nasıl yapılır?ZorRTOSEmbedded
  3. FreeRTOS'ta queue, binary semaphore, counting semaphore ve mutex arasındaki farklar nelerdir? Hangisi ne zaman kullanılır?OrtaRTOSEmbedded
  4. Priority inversion nedir? Priority inheritance bu sorunu nasıl çözer?ZorRTOSEmbedded
  5. RTOS'ta preemptive priority-based scheduling nasıl çalışır? Bare-metal super loop yerine ne zaman RTOS tercih edilir?OrtaRTOSEmbedded
  6. RTOS'ta deadlock nasıl oluşur? Nasıl tespit edilir ve önlenir?OrtaRTOSEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle