다음을 통해 공유


시스템 타이머를 watchdog으로 사용

Important

Azure Sphere(레거시) 설명서입니다. Azure Sphere(레거시)는 2027년 9월 27일에 사용 중지되며 사용자는 이 시간까지 Azure Sphere(통합)로 마이그레이션해야 합니다. TOC 위에 있는 버전 선택기를 사용하여 Azure Sphere(통합) 설명서를 볼 수 있습니다.

상위 수준 애플리케이션은 시스템 타이머를 Watchdog로 사용하여 OS가 종료되고 응답하지 않는 경우 해당 애플리케이션을 다시 시작할 수 있습니다. Watchdog가 만료되면 애플리케이션이 처리하지 않는다는 신호가 발생하며, 이로 인해 OS가 애플리케이션을 종료합니다. 종료 후 OS는 애플리케이션을 자동으로 다시 시작합니다.

Watchdog 타이머를 사용하려면 다음을 수행합니다.

  • 타이머 정의
  • 타이머 만들기 및 무장
  • 타이머가 만료되기 전에 정기적으로 다시 설정

타이머를 정의하려면 itimerspec 구조체를 만들고, 간격 및 초기 만료를 1초와 같이 고정된 값으로 설정합니다.

#include <time.h>

const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;

watchdog에 대한 알림 이벤트, 신호 및 신호 값을 설정하고, timer_create 호출하여 만들고, timer_settime 호출하여 무장합니다. 다음 예제에서는 watchdogTimer에서 SIGALRM 이벤트를 발생시킵니다. 애플리케이션은 이벤트를 처리하지 않으므로 OS는 애플리케이션을 종료합니다.

void SetupWatchdog(void)
{
    struct sigevent alarmEvent;
    alarmEvent.sigev_notify = SIGEV_SIGNAL;
    alarmEvent.sigev_signo = SIGALRM;
    alarmEvent.sigev_value.sival_ptr = &watchdogTimer;

    int result = timer_create(CLOCK_MONOTONIC, &alarmEvent, &watchdogTimer);
    result = timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}

애플리케이션 코드의 다른 위치에서는 Watchdog를 주기적으로 다시 설정합니다. 한 가지 기술은 기간이 예상보다 watchdogInterval짧은 두 번째 타이머를 사용하여 애플리케이션이 예상대로 작동하는지 확인하고, 이 경우 watchdog 타이머를 다시 설정하는 것입니다.

// Must be called periodically
void ExtendWatchdogExpiry(void)
{
    //check that application is operating normally
    //if so, reset the watchdog
    timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}