FreeRTOS

FreeRTOS 타이머와 시간 관리

임베디드 친구 2025. 1. 15. 08:45
반응형

FreeRTOS의 CMSIS-RTOS v1 래퍼는 타이머와 시간 관리 기능을 지원하여 주기적인 작업을 효율적으로 수행할 수 있습니다. 이번 포스팅에서는 CMSIS-RTOS v1의 소프트웨어 타이머를 활용하는 방법과 주요 함수인 osTimerNew()osTimerStart()의 사용법을 설명합니다. 또한 LED 점멸 제어와 센서 데이터 정기 업데이트를 예제로 다뤄보겠습니다.

소프트웨어 타이머란?

소프트웨어 타이머는 특정 시간 간격이 경과했을 때 자동으로 콜백 함수를 호출하는 메커니즘입니다. 실시간 시스템에서 반복적인 작업이나 일정 시간 이후 실행이 필요한 작업에 유용하게 사용됩니다.

소프트웨어 타이머의 주요 특징

  • 비차단 동작: 타이머는 백그라운드에서 실행되며, 주어진 시간 간격 이후 콜백 함수를 호출합니다.
  • 주기적 또는 단발성 사용: 타이머는 한 번 실행되거나 주기적으로 반복될 수 있습니다.
  • 시스템 리소스 효율화: 타이머를 통해 주기적인 작업을 효율적으로 처리할 수 있습니다.

CMSIS-RTOS v1의 소프트웨어 타이머

CMSIS-RTOS v1에서는 소프트웨어 타이머를 생성하고 관리하기 위한 API를 제공합니다.

주요 함수

osTimerNew()

타이머 객체를 생성합니다.

함수 원형:

osTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);

매개변수:

  • func: 타이머가 만료되었을 때 호출될 콜백 함수
  • type: 타이머 유형 (osTimerOnce 또는 osTimerPeriodic)
  • argument: 콜백 함수에 전달할 사용자 정의 인수
  • attr: 타이머 속성 (CMSIS-RTOS v1에서는 사용하지 않음)

반환값:

  • 성공 시 타이머 ID, 실패 시 NULL

osTimerStart()

타이머를 시작합니다.

함수 원형:

osStatus_t osTimerStart(osTimerId_t timer_id, uint32_t ticks);

매개변수:

  • timer_id: 시작할 타이머의 ID
  • ticks: 타이머 만료까지의 시간 (시스템 틱 단위)

반환값:

  • 성공 시 osOK, 실패 시 오류 코드

osTimerStop()

진행 중인 타이머를 중단합니다.

함수 원형:

osStatus_t osTimerStop(osTimerId_t timer_id);

예제: 주기적인 작업 수행

1. LED 점멸 제어

LED를 500ms 간격으로 켜고 끄는 예제를 살펴보겠습니다.

코드:

#include "cmsis_os2.h"
#include "Board_LED.h" // LED 제어를 위한 헤더 파일

// 타이머 콜백 함수
void LED_Toggle(void *argument) {
    static uint8_t led_state = 0;
    led_state = !led_state;
    LED_Set(0, led_state); // LED 상태 변경
}

int main(void) {
    osKernelInitialize();
    LED_Initialize();

    osTimerId_t led_timer = osTimerNew(LED_Toggle, osTimerPeriodic, NULL, NULL);
    if (led_timer != NULL) {
        osTimerStart(led_timer, 500); // 500ms 주기로 타이머 시작
    }

    osKernelStart();
    while (1) {
        // 메인 루프
    }
}

2. 센서 데이터 정기 업데이트

주기적으로 센서 데이터를 읽고 처리하는 예제입니다.

코드:

#include "cmsis_os2.h"
#include "Sensor.h" // 센서 읽기를 위한 헤더 파일

// 타이머 콜백 함수
void Sensor_Update(void *argument) {
    float sensor_data = ReadSensor(); // 센서 데이터 읽기
    ProcessSensorData(sensor_data);  // 센서 데이터 처리
}

int main(void) {
    osKernelInitialize();
    Sensor_Initialize();

    osTimerId_t sensor_timer = osTimerNew(Sensor_Update, osTimerPeriodic, NULL, NULL);
    if (sensor_timer != NULL) {
        osTimerStart(sensor_timer, 1000); // 1초 주기로 타이머 시작
    }

    osKernelStart();
    while (1) {
        // 메인 루프
    }
}

정리

CMSIS-RTOS v1의 소프트웨어 타이머는 주기적인 작업을 간단하고 효율적으로 처리할 수 있는 강력한 도구입니다. 이번 포스팅에서는 osTimerNew()osTimerStart()의 사용법을 배우고, LED 점멸 제어 및 센서 데이터 정기 업데이트 예제를 통해 실무 적용 방법을 살펴보았습니다. 여러분의 프로젝트에 적합한 주기적 작업에 소프트웨어 타이머를 활용해 보세요!

반응형

'FreeRTOS' 카테고리의 다른 글

FreeRTOS 이벤트 그룹[ Event Group ] 사용 방법  (0) 2025.01.17
FreeRTOS Idle Task와 Power Management  (0) 2025.01.16
FreeRTOS Semaphore와 Mutex 활용하기  (0) 2025.01.14
FreeRTOS Queue와 데이터 통신  (0) 2025.01.13
FreeRTOS Task  (0) 2025.01.12