RTOS kullanan çok görevli bir sistemde watchdog'u nasıl beslersiniz? Sadece idle task'ta veya bir timer kesmesinde beslemek neden yetersizdir?
Cevap
Doğru tasarımda watchdog, sadece tüm kritik task'ların sağlıklı çalıştığı doğrulandığında beslenir. Bunun için her task belirli aralıklarla bir "check-in" yapar; bir supervisor (watchdog) task'ı hepsi zamanında rapor verdiyse watchdog'u besler.
Neden basit yöntemler yetersiz?
- Timer kesmesinde beslemek: Task'lar deadlock'a girse veya sonsuz döngüde kalsa bile kesme çalışmaya devam eder. Watchdog asla tetiklenmez ve koruma sağlamaz.
- Sadece idle task'ta beslemek: CPU'nun tamamen kilitlenmesini yakalar. Ancak bloklanmış (ör. hiç gelmeyecek bir semaphore'u bekleyen) bir task'ı yakalamaz, çünkü diğerleri boşta kaldığında idle yine çalışır. Ayrıca yüksek yük altında idle hiç çalışmazsa sağlıklı sistemi gereksiz yere reset edebilir.
Önerilen tasarım
#define WD_SENSOR (1u << 0)
#define WD_COMMS (1u << 1)
#define WD_CONTROL (1u << 2)
#define WD_ALL (WD_SENSOR | WD_COMMS | WD_CONTROL)
static EventGroupHandle_t wd_evg;
void vSensorTask(void *p)
{
for (;;) {
/* bloklanma süresi her zaman watchdog penceresinden kısa olmalı */
if (xQueueReceive(q, &msg, pdMS_TO_TICKS(200)) == pdPASS)
handle(&msg);
xEventGroupSetBits(wd_evg, WD_SENSOR); /* check-in */
}
}
void vWatchdogTask(void *p)
{
for (;;) {
EventBits_t b = xEventGroupWaitBits(wd_evg, WD_ALL, pdTRUE, pdTRUE,
pdMS_TO_TICKS(1000));
if ((b & WD_ALL) == WD_ALL) {
HAL_IWDG_Refresh(&hiwdg);
} else {
save_fault_info(~b & WD_ALL); /* hangi task takıldı? kaydet */
/* beslemiyoruz: IWDG birazdan reset atar */
}
}
}Ek prensipler
- Uzun süre bloklu kalması normal olan task'lar ya kısa timeout'la döngü kurmalı ya da izlenen listeden çıkarılmalıdır.
- Watchdog task'ının önceliği yüksek olmalı ama işi çok kısa tutulmalıdır.
- Bağımsız watchdog (IWDG, ayrı LSI saatle çalışır ve başlatıldıktan sonra yazılımla durdurulamaz) ana saat arızalarını da yakalar. Window watchdog (WWDG) ise çok erken beslemeyi de hata sayar ve "kontrolden çıkmış hızlı döngü" durumunu yakalar.
- Reset sonrası reset nedenini (
RCC->CSRbayrakları) okuyup kaydedin; sahada watchdog reset sayısı önemli bir sağlık metriğidir. - Debug sırasında breakpoint'te reset almamak için
DBGMCUile watchdog'u debug modunda dondurun. - Watchdog bir hata düzeltme yöntemi değil, son savunma hattıdır. Kök neden kaydedilip analiz edilmelidir.
İ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.