FreeRTOS'ta queue, binary semaphore, counting semaphore ve mutex arasındaki farklar nelerdir? Hangisi ne zaman kullanılır?
Cevap
| Nesne | Amaç | Sahiplik | Priority inheritance | ISR'dan verilebilir mi? |
|---|---|---|---|---|
| Queue | Veri taşıma (kopyalayarak) | Yok | Yok | Evet (FromISR) |
| Binary semaphore | Olay bildirimi, senkronizasyon | Yok | Yok | Evet |
| Counting semaphore | Olay sayma veya N kaynaklı havuz | Yok | Yok | Evet |
| Mutex | Paylaşılan kaynağa karşılıklı dışlama | Var: alan task bırakmalı | Var | Hayır |
| Recursive mutex | Aynı task'ın tekrar tekrar alabildiği mutex | Var | Var | Hayır |
Queue
Task'lar ve ISR'lar arasında veri iletimi. Veri queue'ya kopyalanır; büyük yapılar için pointer gönderilir (o zaman bellek sahipliğine dikkat).
typedef struct { uint8_t id; int16_t value; } msg_t;
QueueHandle_t q = xQueueCreate(16, sizeof(msg_t));
msg_t m = { .id = 1, .value = 42 };
xQueueSend(q, &m, pdMS_TO_TICKS(10));
msg_t r;
if (xQueueReceive(q, &r, portMAX_DELAY) == pdTRUE) { /* işle */ }Binary semaphore
"Bir şey oldu" sinyali. Tipik olarak ISR verir, task bekler. Olay task işlerken iki kez gelirse biri kaybolur.
Counting semaphore
Olayları kaybetmeden saymak veya örneğin 3 adet DMA kanalından oluşan bir havuzu yönetmek için.
Mutex
Paylaşılan donanım (SPI bus, UART, LCD) veya veri yapısının korunması. Semaphore'dan farkı: sahiplik kavramı ve priority inheritance. Mutex'i başka task bırakamaz ve ISR'da kullanılamaz.
Hızlı karar rehberi
- Veri gönderiyorum → queue
- ISR'dan task'ı uyandırıyorum → task notification (en hızlı ve en az RAM) veya binary semaphore
- Olay sayısını kaybetmemeliyim → counting semaphore
- Ortak kaynağı koruyorum → mutex
- Birden fazla olayın kombinasyonunu bekliyorum → event group
Task notifications FreeRTOS'ta binary/counting semaphore yerine kullanılabilen, ayrı nesne gerektirmeyen ve yaklaşık %45 daha hızlı bir mekanizmadır; tek kısıtı alıcının tek bir task olmasıdır.
İ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?
- 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?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.