FreeRTOS'ta Öncelik Tersinmesi ve Mutex Kalıtımı
Öncelik tersinmesi, gömülü sistemlerdeki en sinsi zamanlama hatalarından biridir: yüksek öncelikli bir görev, teorik olarak hiç beklememesi gereken düşük öncelikli bir görevi beklemeye başlar.
Senaryo
Düşük öncelikli L görevi bir kaynağı kilitler. Yüksek öncelikli H görevi aynı kaynağı ister ve bloke olur. Bu sırada orta öncelikli M görevi çalışmaya başlayarak L'yi de bekletir; sonuçta H, M'nin arkasında kalır.
Çözüm: öncelik kalıtımı
FreeRTOS'ta xSemaphoreCreateMutex() ile oluşturulan mutex'ler öncelik kalıtımını destekler: kaynağı tutan L görevi geçici olarak H'nin önceliğine yükseltilir ve kaynağı hızla bırakır.
Sayaç semaforu (xSemaphoreCreateBinary) öncelik kalıtımı yapmaz. Karşılıklı dışlama için her zaman mutex kullanın.Pratik öneriler
- Kritik bölümleri olabildiğince kısa tutun.
- Kesme bağlamında mutex kullanmayın.
- Zamanlama sorunlarını Tracealyzer/SystemView ile görselleştirin.