ARM Core - 5. ARM 기반의 OS와 임베디드 시스템 개발 (2. RTOS 활용 및 실습 가이드)
2025. 3. 7. 13:45ㆍ정보기술/하드웨어
2. RTOS 활용 및 실습 가이드
1. RTOS 개요
1) RTOS란?
RTOS(Real-Time Operating System)는 임베디드 시스템에서 실시간 응답이 중요한 애플리케이션을 위한 운영체제이다.
- 하드 리얼타임 시스템: 엄격한 응답 시간이 요구됨 (예: 항공우주, 의료 기기)
- 소프트 리얼타임 시스템: 일정 수준의 응답 보장이 필요하지만 약간의 지연이 허용됨 (예: IoT, 자동차)
2) RTOS의 주요 기능
기능 | 설명 |
태스크 관리(Task Management) | 다중 태스크(스레드) 생성 및 실행 |
스케줄링(Scheduling) | 태스크의 실행 순서를 관리 |
인터럽트 처리(Interrupt Handling) | 외부 이벤트를 감지하고 빠르게 응답 |
동기화 및 통신(Synchronization & IPC) | 세마포어, 메시지 큐, 이벤트 플래그 지원 |
메모리 관리(Memory Management) | 제한된 리소스를 효율적으로 사용 |
2. Zephyr OS 및 FreeRTOS 개요
1) Zephyr OS
- Linux Foundation에서 개발한 오픈소스 RTOS
- IoT 및 임베디드 시스템용으로 최적화
- CMake 및 Kconfig 기반으로 프로젝트를 관리
- POSIX API와 호환 가능
- 다양한 네트워크 및 보안 기능 지원 (TLS, Bluetooth, Wi-Fi)
Zephyr OS의 주요 특징
특징 | 설명 |
모듈화된 커널 | 필요 기능만 빌드하여 리소스 절약 |
멀티스레딩 지원 | 다양한 태스크를 효율적으로 실행 |
다양한 보드 지원 | STM32, NRF52, ESP32 등 |
2) FreeRTOS
- Amazon에서 관리하는 오픈소스 RTOS
- 임베디드 시스템에서 가장 널리 사용됨
- 커널이 가볍고, 리소스 사용량이 적음
- 태스크 우선순위 기반 스케줄링
- AWS IoT 및 클라우드 서비스와 통합 가능
FreeRTOS의 주요 특징
특징 | 설명 |
Preemptive Scheduling | 우선순위 기반 스케줄링 지원 |
인터럽트 지원 | 빠른 응답 시간 보장 |
저전력 모드 | 배터리 기반 디바이스에서 유용 |
다양한 아키텍처 지원 | ARM Cortex-M, RISC-V 등 |
3. RTOS에서 Task 생성 및 스케줄링 예제
1) FreeRTOS에서 Task 생성 예제
(1) 기본 Task 생성 및 실행
#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>
void Task1(void *pvParameters) {
while (1) {
printf("Task 1 실행 중...\n");
vTaskDelay(pdMS_TO_TICKS(1000)); // 1초 대기
}
}
void Task2(void *pvParameters) {
while (1) {
printf("Task 2 실행 중...\n");
vTaskDelay(pdMS_TO_TICKS(500)); // 0.5초 대기
}
}
int main(void) {
// 태스크 생성
xTaskCreate(Task1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 1000, NULL, 2, NULL);
// 스케줄러 시작
vTaskStartScheduler();
// 실행되지 않음 (스케줄러가 실행되기 때문)
while (1);
}
보완 설명
- pdMS_TO_TICKS(1000)은 설정된 시스템 틱 주기(Tick Rate)에 따라 정확히 1초가 아닐 수 있음
- 예를 들어, 기본적으로 1틱 = 1ms (1000Hz)로 설정되어 있으면 1000ms가 정확하지만, 다른 주기에서는 다를 수 있음
- configTICK_RATE_HZ 설정 값에 따라 지연 시간이 달라질 수 있음:
#define configTICK_RATE_HZ 1000 // 1ms 단위 (정확한 1초)
- 틱 주기가 500Hz로 설정되면 pdMS_TO_TICKS(1000)은 실제로 2초가 될 수 있음
2) Zephyr OS에서 Task 생성 예제
(1) 기본 스레드 생성
#include <zephyr.h>
#include <sys/printk.h>
void Thread1(void) {
while (1) {
printk("Zephyr - Thread 1 실행 중...\n");
k_sleep(K_MSEC(1000)); // 1초 대기
}
}
void Thread2(void) {
while (1) {
printk("Zephyr - Thread 2 실행 중...\n");
k_sleep(K_MSEC(500)); // 0.5초 대기
}
}
// 스레드 정의
K_THREAD_DEFINE(thread1_id, 1024, Thread1, NULL, NULL, NULL, 1, 0, 0);
K_THREAD_DEFINE(thread2_id, 1024, Thread2, NULL, NULL, NULL, 2, 0, 0);
4. RTOS의 Task 스케줄링 방식
1) FreeRTOS의 우선순위 기반 스케줄링
- FreeRTOS에서는 태스크의 우선순위(Priority)를 지정하여 실행 순서를 조절한다.
- 높은 우선순위를 가진 태스크가 먼저 실행되며, 같은 우선순위일 경우 Round Robin 방식으로 실행된다.
2) Zephyr OS의 스케줄링 방식
Zephyr OS는 선점형 스케줄링(Preemptive Scheduling)과 협력형 스케줄링(Cooperative Scheduling)을 지원한다.
Zephyr OS의 스케줄링 모드
스케줄링 방식 | 설명 |
Preemptive Scheduling | 우선순위가 높은 태스크가 낮은 태스크를 중단하고 실행 |
Cooperative Scheduling | 태스크가 자발적으로 실행을 넘겨줄 때까지 실행 유지 |
Zephyr OS에서 협력형 스케줄링 적용 예제
void cooperative_task(void) {
while (1) {
printk("협력형 태스크 실행 중...\n");
k_yield(); // CPU를 다른 태스크에 넘겨줌
}
}
- k_yield()를 호출해야 다른 태스크로 전환됨
- 이 방식은 FreeRTOS와 차이가 있으며, 타 태스크가 실행될 기회를 명시적으로 제공해야 함
5. RTOS 실습 요약
실습 내용 | 설명 |
Zephyr OS 개요 | IoT 및 산업용 임베디드 시스템에 적합 |
FreeRTOS 개요 | 경량 RTOS로 저전력 및 실시간 기능 지원 |
Task 생성 및 실행 | FreeRTOS와 Zephyr OS에서 태스크 생성 |
Task 스케줄링 | FreeRTOS(우선순위), Zephyr OS(선점적/협력적) |
6. 결론
- FreeRTOS에서 vTaskDelay(pdMS_TO_TICKS())는 시스템 틱 주기에 따라 실제 지연 시간이 달라질 수 있음
- Zephyr OS는 선점형 스케줄링과 협력형 스케줄링을 모두 지원하며, k_yield()를 사용해 명시적 컨텍스트 스위칭이 가능
- 실제 RTOS 프로젝트에서는 스케줄링 방식과 태스크 우선순위를 적절히 조정하여 시스템 성능을 최적화할 필요가 있음
이러한 내용을 바탕으로 실시간 시스템을 더욱 효과적으로 설계할 수 있다.