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 프로젝트에서는 스케줄링 방식과 태스크 우선순위를 적절히 조정하여 시스템 성능을 최적화할 필요가 있음
이러한 내용을 바탕으로 실시간 시스템을 더욱 효과적으로 설계할 수 있다.