FreeRTOS'ta task notification ve event group nedir? Semaphore veya queue yerine ne zaman bunları kullanırsınız?
Cevap
İkisi de task'lar arası sinyalleşme mekanizmasıdır ama farklı ihtiyaçlar içindir: Task notification, belirli tek bir task'a gönderilen çok hafif bir sinyaldir. Event group ise birden çok task'ın birden çok olayın birleşimini (AND/OR) beklemesini sağlar.
Task notification
- Her task'ın kendi TCB'sinde 32-bit bir notification değeri ve durum bilgisi vardır; ayrı bir nesne oluşturmak gerekmez, ek RAM harcanmaz.
- FreeRTOS dokümanına göre binary semaphore'dan yaklaşık %45 daha hızlıdır.
- Binary semaphore, counting semaphore, event bit veya tek elemanlı mailbox gibi kullanılabilir.
- Kısıt: Alıcı tek bir task'tır (broadcast yok) ve alıcı tarafta tek bir değer tutulur. FreeRTOS v10.4 ile her task için bir notification dizisi (
configTASK_NOTIFICATION_ARRAY_ENTRIES) eklenmiştir.
/* ISR: UART DMA tamamlandı */
void DMA_IRQHandler(void)
{
BaseType_t woken = pdFALSE;
vTaskNotifyGiveFromISR(xUartTask, &woken);
portYIELD_FROM_ISR(woken);
}
/* Task */
void vUartTask(void *p)
{
for (;;) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); /* binary semaphore gibi bekle */
process_rx();
}
}Event group
- Bir grup içinde olay bitleri tutulur (32-bit tick tipinde 24 kullanılabilir bit).
- Bir task bitlerden herhangi birini (OR) veya hepsini (AND) bekleyebilir; birden çok task aynı bitleri bekleyebilir.
xEventGroupSync()ile birden çok task bir buluşma noktasında (rendezvous) senkronize olabilir.
#define EV_WIFI_UP (1u << 0)
#define EV_TIME_SYNC (1u << 1)
EventBits_t b = xEventGroupWaitBits(evg, EV_WIFI_UP | EV_TIME_SYNC,
pdFALSE, /* bitleri temizleme */
pdTRUE, /* hepsini bekle (AND) */
pdMS_TO_TICKS(10000));ISR'dan xEventGroupSetBitsFromISR() çağrısı doğrudan çalışmaz; iş timer daemon task'ına ertelenir. Bu yüzden deterministik değildir ve yazılım timer'larının açık olmasını gerektirir.
Seçim tablosu
| İhtiyaç | Tercih |
|---|---|
| ISR'dan tek bir task'ı uyandırmak | Task notification |
| Veri taşımak, birden çok üretici | Queue |
| Paylaşılan kaynağı korumak | Mutex (priority inheritance için) |
| Birden çok koşulun birlikte gerçekleşmesini beklemek, birden çok bekleyen | Event group |
İlgili RTOS soruları
- RTOS nedir? Bare-metal programlamadan farkı nedir?
- RTOS'ta ISR içinde hangi API'ler kullanılabilir? Deferred interrupt processing nasıl yapılır?
- FreeRTOS'ta queue, binary semaphore, counting semaphore ve mutex arasındaki farklar nelerdir? Hangisi ne zaman kullanılır?
- Priority inversion nedir? Priority inheritance bu sorunu nasıl çözer?
- RTOS'ta preemptive priority-based scheduling nasıl çalışır? Bare-metal super loop yerine ne zaman RTOS tercih edilir?
- RTOS'ta deadlock nasıl oluşur? Nasıl tespit edilir ve önlenir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.