传统的方法是有一个具有最低优先级的看门狗进程
PROCESS(watchdog, PRIORITY_LOWEST) { while(1){reset_timer(); sleep(1);} }
并且实际的硬件计时器可能每 3 或 5 秒重置一次 CPU。
跟踪单个进程可以通过逆向逻辑实现:每个进程将设置一个计时器,其回调向看门狗发送“停止”消息。然后每个进程都需要取消前一个计时器事件并在“从队列接收事件/消息”循环中的某处设置一个新事件。
PROCESS(watchdog, PRIORITY_LOWEST) {
while(1) {
if (!messages_in_queue()) reset_timer();
sleep(1);
}
}
void wdg_callback(int event) {
msg = new Message();
send(&msg, watchdog);
};
PROCESS(foo, PRIORITY_HIGH) {
timer event=new Timer(1000, wdg_callback);
while (1) {
if (receive(msg, TIMEOUT)) {
// handle msg
} else { // TIMEOUT expired
cancel_event(event);
event = new Timer(1000,wdg_callback);
}
}
}