nRF52 Watchdog Timer: 시스템 안정성을 보장하는 방법
임베디드 시스템 개발에서 시스템의 신뢰성을 보장하는 일은 매우 중요합니다. 특히 IoT 장치나 무선 통신 장치와 같은 시스템은 외부 환경에 의해 예기치 않게 오류가 발생할 수 있습니다. 이때 Watchdog Timer(감시 타이머)를 사용하면, 시스템이 예기치 않은 상황에 빠지더라도 자동으로 복구될 수 있습니다. 본 글에서는 nRF 시리즈에서 Watchdog Timer를 설정하고 사용하는 방법을 중점적으로 다루며, 예시 코드와 함께 그 과정을 단계별로 설명합니다.
1. Watchdog Timer란?
1.1 개념
Watchdog Timer는 시스템이 주어진 시간 내에 특정 동작을 수행하지 않을 경우, 이를 감지하고 시스템을 리셋하는 보호 장치입니다. 임베디드 시스템에서 흔히 사용되는 이 타이머는 주로 소프트웨어 오류나 하드웨어 결함으로 인해 시스템이 무한 루프에 빠지거나 응답하지 않는 상황을 방지하는 데 유용합니다.
1.2 동작 원리
Watchdog Timer의 기본 원리는 다음과 같습니다:
- 타이머 설정: 타이머는 일정 시간(예: 2초) 동안 시스템의 응답을 기다립니다.
- 타이머 리셋(Feed): 시스템이 정상적으로 동작할 경우 주기적으로 타이머를 리셋하여 시스템이 잘 작동하고 있음을 알립니다.
- 타임아웃 발생 시 리셋: 만약 시스템이 타이머를 제때 리셋하지 못하면, Watchdog Timer는 이를 시스템 이상으로 판단하고 시스템을 리셋합니다.
이 메커니즘을 통해 소프트웨어 오류나 하드웨어 문제로 인한 시스템 중단을 자동으로 복구할 수 있습니다.
2. Watchdog Timer의 특징
2.1 신뢰성 보장
Watchdog Timer는 소프트웨어나 하드웨어 결함으로 인해 시스템이 응답하지 않을 경우 이를 감지하고, 설정된 동작(예: 시스템 리셋)을 수행함으로써 시스템의 신뢰성을 향상시킵니다. 특히 임베디드 시스템이나 IoT 장치처럼 지속적인 안정성이 중요한 시스템에서 매우 유용합니다.
2.2 사용자 정의 가능
Watchdog Timer의 주기(즉, 타임아웃 시간)는 시스템의 요구 사항에 따라 설정할 수 있습니다. 일반적으로 짧은 타임아웃 주기는 빠른 복구를 가능하게 하지만, 너무 짧으면 정상적인 작업 중에도 리셋이 발생할 위험이 있습니다. 반면, 긴 타임아웃 주기는 시스템이 비정상적으로 동작하는 시간을 길게 허용하므로 신중한 설정이 필요합니다.
2.3 타이머 리셋(Feed)
시스템은 주기적으로 Watchdog Timer를 리셋해주어야 합니다. 이 과정을 타이머 Feed라고 하며, 시스템이 정상적으로 동작하고 있음을 Watchdog에게 알리는 과정입니다. 만약 이 Feed가 주기적으로 이루어지지 않으면 Watchdog Timer는 이를 오류로 간주하고 시스템을 리셋합니다.
3. nRF 시리즈에서 Watchdog Timer 사용
3.1 nRF 시리즈의 특징
nRF 시리즈는 저전력 무선 통신에 특화된 Nordic Semiconductor의 칩셋 시리즈로, BLE(Bluetooth Low Energy), Zigbee, Thread 등 다양한 무선 통신 프로토콜을 지원합니다. 이 시리즈는 안정성이 중요한 IoT 및 무선 통신 장치에 많이 사용되며, 시스템 신뢰성을 높이기 위해 Watchdog Timer를 자주 활용합니다.
3.2 nRF Watchdog Timer 설정
nRF SDK에서는 NRF_DRV_WDT_DEFAULT_CONFIG 매크로를 이용하여 Watchdog Timer를 설정할 수 있습니다. 기본적으로 Watchdog의 타이머 reload 값은 2초로 설정되어 있으며, 시스템이 2초 동안 응답하지 않을 경우 시스템을 리셋하도록 구성됩니다.
예제: 기본 Watchdog Timer 설정
// nrfx_wdt.h
/** @brief WDT driver default configuration. */
#define NRFX_WDT_DEFAULT_CONFIG \
{ \
.behaviour = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
.reload_value = NRFX_WDT_CONFIG_RELOAD_VALUE, \
NRFX_WDT_IRQ_CONFIG \
}
이 매크로는 Watchdog의 동작 방식을 정의합니다. 기본 설정에서는 시스템이 응답하지 않을 경우 즉시 재부팅하도록 설정되어 있으며, reload_value는 2,000 밀리초(2초)로 설정되어 있습니다.
4. nRF Watchdog Timer 초기화
4.1 초기화 과정
Watchdog Timer를 사용하기 위해서는 먼저 타이머를 초기화해야 합니다. 이때 Watchdog의 동작 방식과 타이머 값을 설정할 수 있으며, 사용자는 기본 설정을 사용할 수도 있고, 필요에 따라 사용자 정의 값을 설정할 수도 있습니다.
예제: Watchdog Timer 초기화
// nrf_drv_wdt.h
__STATIC_INLINE ret_code_t nrf_drv_wdt_init(nrf_drv_wdt_config_t const * p_config,
nrf_wdt_event_handler_t wdt_event_handler)
{
if (p_config == NULL)
{
static const nrfx_wdt_config_t default_config = NRFX_WDT_DEFAULT_CONFIG;
p_config = &default_config;
}
return nrfx_wdt_init(p_config, wdt_event_handler);
}
위 코드에서 nrf_drv_wdt_init 함수는 Watchdog Timer를 초기화하는데 사용됩니다. 기본 설정을 사용하고 싶다면 p_config를 NULL로 전달하면 됩니다. 또한 wdt_event_handler는 Watchdog Timer가 타임아웃에 도달했을 때 호출되는 함수입니다.
4.2 Watchdog Event Handler
Watchdog 타임아웃 시 호출되는 이벤트 핸들러는 시스템이 리셋되기 전 마지막으로 실행되는 코드입니다. 이 핸들러에서 중요한 작업(예: 로그 기록)을 처리할 수 있습니다.
예제: Watchdog 이벤트 핸들러
void wdt_event_handler(void)
{
// 타임아웃 발생 시 필요한 동작을 여기에 작성
}
5. Watchdog Timer 시작 및 Feed
5.1 Watchdog Timer 시작
Watchdog Timer를 초기화한 후에는 타이머를 시작해야 합니다. Watchdog Timer는 별도의 채널을 사용하여 시스템의 다양한 부분을 감시할 수 있으며, 이를 위해 채널 할당이 필요합니다.
예제: Watchdog Timer 시작
int main(void)
{
ret_code_t err_code;
// Watchdog Timer 설정
nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEFAULT_CONFIG;
err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
APP_ERROR_CHECK(err_code);
// Watchdog 채널 할당
nrf_drv_wdt_channel_id m_channel_id;
err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
APP_ERROR_CHECK(err_code);
// Watchdog Timer 시작
nrf_drv_wdt_enable();
// 주기적으로 Watchdog를 Feed하여 시스템이 정상 동작 중임을 알림
while (true)
{
nrf_drv_wdt_channel_feed(m_channel_id);
nrf_delay_ms(1000); // 1초마다 Feed
}
}
위 코드에서는 Watchdog Timer를 초기화하고, 채널을 할당한 뒤 타이머를 시작합니다. nrf_drv_wdt_channel_feed 함수를 주기적으로 호출하여 시스템이 정상적으로 동작하고 있음을 Watchdog에게 알립니다.
6. 주의사항
6.1 적절한 타임아웃 값 설정
Watchdog Timer의 타임아웃 값은 신중하게 선택해야 합니다. 너무 짧은 타임아웃은 시스템이 복잡한 작업을 수행하는 동안 불필요한 리셋을 초래할 수 있고, 너무 긴 타임아웃은 시스템의 비정상 상태가 오래 유지되는 결과를 초래할 수 있습니다.
6.2 주기적인 Feed
Watchdog Timer를 사용하면 시스템이 주기적으로 Watchdog를 Feed하는지 확인해야 합니다. 이 작업을 놓치면 Watchdog가 시스템을 리셋할 수 있으므로, 주요 루프에서 적절히 Feed하는 것이 중요합니다.
7. 결론
Watchdog Timer는 임베디드 시스템에서 매우 중요한 보호 장치입니다. nRF 시리즈에서 제공하는 Watchdog Timer는 시스템의 신뢰성을 보장하는 데 필수적인 요소로, 시스템이 예기치 않은 오류로 인해 먹통이 되는 것을 방지할 수 있습니다. 이 글에서 설명한 초기화 과정과 사용 방법을 참고하여 nRF 시리즈의 Watchdog Timer를 효과적으로 설정하고 활용해보세요.
'nRF52' 카테고리의 다른 글
nRF ESB(무선 통신 구현) (0) | 2024.09.20 |
---|---|
nRF52 RAM, Flash 크기 조정 (0) | 2024.09.19 |
nRF52 fstorage 사용 가이드 (0) | 2024.09.17 |
nRF52 RTC(Real-Time Clock)를 활용한 캘린더 구현 (0) | 2024.09.16 |
nRF52 Application Scheduler (0) | 2024.09.15 |