임베디드/임베디드 레시피

Watch dog

twoweeks-within 2025. 1. 11. 14:01

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