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ırmakTask notification
Veri taşımak, birden çok üreticiQueue
Paylaşılan kaynağı korumakMutex (priority inheritance için)
Birden çok koşulun birlikte gerçekleşmesini beklemek, birden çok bekleyenEvent group
  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