RTOS란 무엇인가? STM32에서 간단한 예제 구현하기

황윤성·2024년 9월 27일

STM32

목록 보기
3/3

1. RTOS란 무엇인가?

RTOS(Real-Time Operating System)는 실시간으로 동작하는 운영체제로, 임베디드 시스템에서 주로 사용됩니다. 일반적인 OS와 달리, RTOS는 작업의 응답 시간을 보장하며, 결정론적 행동을 요구하는 시스템에 필수적입니다. 특히 산업 자동화, 자동차, 항공우주 같은 분야에서 자주 사용됩니다.

RTOS의 종류

-Hard RTOS
엄격한 실시간성을 요구하는 시스템에서 사용됩니다. 모든 태스크가 정해진 시간 안에 반드시 완료되어야 하며, 일정 시간 내에 응답하지 못하면 시스템에 치명적인 문제가 발생할 수 있습니다. 이런 시스템에서는 시간 초과가 허용되지 않습니다.

-Soft RTOS
덜 엄격한 실시간성을 요구하는 시스템에 사용됩니다. 데드라인을 지키는 것이 중요하긴 하지만, 일정 시간 내에 태스크를 완료하지 못해도 시스템이 완전히 실패하는 것은 아닙니다. 대신 성능 저하나 품질 문제가 발생할 수 있습니다.

2. 왜 FreeRTOS를 사용해야 할까?

FreeRTOS는 오픈소스 실시간 운영체제로, 경량화되어 다양한 임베디드 시스템에서 활용됩니다. STM32 같은 MCU에서 사용하기에도 적합하며, 다중 태스크를 쉽게 관리할 수 있게 도와줍니다.

3. STM32에서 FreeRTOS 간단 예제

이번 실습에서는 STM32 보드에서 FreeRTOS를 활용하여, 두 개의 LED를 서로 다른 주기로 깜빡이게 하는 예제를 만들어 보겠습니다.

IOC 세팅을 먼저 해보겠습니다.
11번 timer를 사용하겠습니다.

이번 글에서는 FREERTOS에서 두개의 Task를 사용할 예정이라 LED1, LED2 두개를 만들어주었습니다.

#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* 스레드 핸들 정의 */
osThreadId_t led1Handle;
osThreadId_t led2Handle;

/* 스레드 속성 정의 */
const osThreadAttr_t led1_attributes = {
  .name = "led1",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};

const osThreadAttr_t led2_attributes = {
  .name = "led2",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};

void StartTask02(void *argument);
void StartTask03(void *argument);

/* FreeRTOS 초기화 함수 */
void MX_FREERTOS_Init(void) {
  led1Handle = osThreadNew(StartTask02, NULL, &led1_attributes);
  led2Handle = osThreadNew(StartTask03, NULL, &led2_attributes);
}

/* LED1 스레드 함수 (0.5초마다 깜빡임) */
void StartTask02(void *argument) {
  for(;;) {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // LED1 토글
    osDelay(500); // 500ms 대기
  }
}

/* LED2 스레드 함수 (1초마다 깜빡임) */
void StartTask03(void *argument) {
  for(;;) {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6); // LED2 토글
    osDelay(1000); // 1000ms 대기
  }
}

코드 설명 :
1. 스레드 생성 : 두 개의 스레드를 생성하여 LED1과 LED2를 각각 제어합니다.
2. Task 함수 : StartTask02는 0.5초마다, StartTask03은 1초마다 LED를 깜빡이게 만듭니다.

4. 실행 결과


좌측의 LED가 PA5(LED1), 우측의 LED가 PA6(LED2)에 연결한 모습입니다.
LED1은 0.5초 간격으로 깜빡이고, LED2는 1초 간격으로 깜빡이는 것을 확인할 수 있습니다.

이번 예제에서는 FreeRTOS를 이용해 STM32 보드에서 간단한 다중 태스크를 구현해 보았습니다. RTOS는 실시간 응답이 중요한 시스템에서 매우 유용하며, 더 복잡한 작업에서도 효율적인 스케줄링을 가능하게 합니다.

profile
하드웨어 엔지니어 꿈나무

0개의 댓글