반응형
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
: 시작할 타이머의 IDticks
: 타이머 만료까지의 시간 (시스템 틱 단위)
반환값:
- 성공 시
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 |