Watch dog : Timmer Hardware
> 모든 task 가 제때 응답가능한지 check > if 문제발생 > HW적으로 target Reset
응답check ?
: Starvation: Priority 높은 놈들이 계속일을해대서 낮은 애들이 일을 못하는 상황
+
Mutex 를 잘 못걸어 교착상태에 빠짐
>>
System Reset : HW Timer 가 다 떨어지면 ( timer-- )
if) 정상 작동 신호 받으면 Timer를 처음값으로 set
void 모든_task()
{
set_timer ( 자기자신(task) , DOG_REPORT_SIG, 자기에게 알맞는 시간);
// 맞는 시간이 지나면 Dog sig 를 자기에게 보냄
// Task 마다 필요한 시간 (Task 마다 1000ms, 10ms 다 다름)
wait_signal (DOG_REPORT_SIG)
if(get_signal() == DOG_REPORT_SIG)
{
send_signal(Watchdog_task, 자기자신) // report to watch dog
// 워치독에게 신호를 보내서 작동중인걸 알림
cir_signal(DOG_REPROT_SIG)
}
}
send_signal(Watchdog_task, 자기자신) // report to watch dog
// 워치독에게 신호를 보내서 작동중인걸 알림
> Watch_dog_Task는 각 Task 가 어느 시간이 지나야 Report 해야하는지 알고 있어야함
1. 주기적으로 일어나서 확인
2. report 가 안됐다면 그 주기만큼 시간을 빼서 저장
3. report 했으면 그 report 된 Task 의 시간을 장부에 기입
// ex) 30000ms
1400ms 때 report 됐음 > 30000ms 로 장부 기입
4. 0ms 보다 작아지면??
5. 해당 task 한테 문제가있다고 알려줌 > Interrupt Lock > 무한 Loop
6. Watch dog Timer : Expire > System Reset
>>>
void Watch_dog_task ()
{
set_timer (호출한 자기 자신, WAKE_UP_SIG, 적당한 주기);
// 주기적으로 일어나서 확인 하기 위함
wait_signal(WAKE_UP_SIG)
if (get_signal () == WAKE_UP_SIG)
{
for (Task 개수)
{
각 task의 모래 시계를 Watch dog이 일어나는 주기인 "적당한 주기" 만큼 씩 빼주고,
설마 이렇게 빼준 값이 0보다 작아져 버리면!
Interrupt_lock()을 걸어버리고 While(1)을 걸어 버려서
Watch dog timer expire가 되어 Reset이 되게 만들어 버림
report한 녀석들이 있으면 다시 원래의 interval로 값을 setting
}
clr_signal (DOG_REPORT_SIG)
}
}
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
Kernel Porting (0) | 2025.01.11 |
---|---|
Bootup 중 kernel로 진입 - main() (0) | 2025.01.11 |
DPC ,APC, Bottom Half (0) | 2025.01.11 |
Queue , Inter Task Communication (0) | 2025.01.10 |
Interrupt, Polling (0) | 2025.01.10 |