Bir RTOS task'ının stack boyutunu nasıl belirlersiniz? Stack overflow'u nasıl tespit edersiniz?
Cevap
Stack boyutu tahminle değil, analiz ve ölçümle belirlenir. Önce statik analizle başlangıç değeri çıkarılır, sonra en kötü senaryoda çalışma anındaki kullanım (high water mark) ölçülür ve üzerine güvenlik payı eklenir.
Stack kullanımını etkileyenler
- Yerel değişkenler, özellikle büyük diziler ve struct'lar
- Fonksiyon çağrı derinliği ve özyineleme (gömülüde kaçınılmalı)
printf/sprintfailesi (yüzlerce byte, float formatlama ile daha fazla)- Context switch sırasında kaydedilen register'lar: FPU açık Cortex-M4F'de lazy stacking ile birlikte ek 18 word (S0-S15, FPSCR ve hizalama) task stack'ine yazılabilir
- Not: Cortex-M'de ISR'lar MSP'yi kullanır. Ancak kesme girişindeki ilk stacking, kesilen task'ın PSP stack'ine yapılır.
Ölçüm yöntemleri
/* FreeRTOS: stack derinliği byte değil, word (StackType_t) cinsindendir */
xTaskCreate(vSensorTask, "sensor", 256, NULL, 2, &h); /* 256 * 4 = 1 KB */
/* En kötü senaryodan sonra kalan en az boş alan (word) */
UBaseType_t free_words = uxTaskGetStackHighWaterMark(h);- Stack painting: Stack başta bilinen bir desenle (FreeRTOS'ta
0xA5) doldurulur; bozulmayan alan ölçülür. - Derleyici çıktısı: GCC
-fstack-usageher fonksiyonun stack kullanımını.sudosyalarına yazar.-Wstack-usage=256ile limit aşılınca uyarı alınır. puncover, StackAnalyzer gibi araçlar çağrı grafiği üzerinden en kötü durumu hesaplar.
Çalışma anında tespit
/* FreeRTOSConfig.h */
#define configCHECK_FOR_STACK_OVERFLOW 2 /* 1: SP kontrolü, 2: + son 16 byte desen kontrolü */
void vApplicationStackOverflowHook(TaskHandle_t t, char *name)
{
log_fault("stack overflow: %s", name); /* sonra güvenli reset */
for (;;) { }
}- Bu kontrol sadece context switch sırasında yapılır; taşma tespit edilmeden önce başka veriyi bozabilir.
- Daha güvenli yöntemler: MPU ile stack sonuna guard bölgesi koymak (FreeRTOS-MPU) veya ARMv8-M'deki (Cortex-M33)
PSPLIM/MSPLIMdonanım limit register'larını kullanmak.
Pratik kural
Ölçülen en yüksek kullanıma %20-50 pay ekleyin. Hata yolları, en uzun mesaj ve tüm feature'ların açık olduğu senaryoları test etmeden ölçüm yapmayın.
İ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.