Linux/Kernel Driver

Real-Time Linux: 개념과 필요성, RT_PREEMPT 패치 적용 및 실시간 특성 구현

임베디드 친구 2025. 3. 29. 12:51
728x90
반응형

Real-Time Linux: 개념과 필요성, RT_PREEMPT 패치 적용 및 실시간 특성 구현

리눅스 커널은 그 유연성과 기능으로 인해 임베디드 시스템에서 널리 사용됩니다. 그러나 기본 리눅스 커널은 실시간성을 보장하지 않습니다. 임베디드 시스템에서 정해진 시간 내에 작업이 반드시 완료되어야 하는 경우, Real-Time Linux(RT Linux)가 필요합니다. 이번 포스팅에서는 Real-Time Linux의 개념과 필요성을 이해하고, RT_PREEMPT 패치를 적용하여 실시간 특성을 구현하는 방법을 Rockchip RK3399 플랫폼을 기준으로 설명하겠습니다.


Real-Time Linux의 개념 및 필요성

Real-Time Linux란?

Real-Time Linux는 리눅스 커널에 실시간성을 부여하여 정해진 시간 내에 작업을 수행할 수 있도록 보장하는 커널입니다. 이는 RT_PREEMPT 패치를 통해 구현됩니다.

  • Hard Real-Time: 정해진 시간 내에 작업을 반드시 완료해야 하는 경우.
  • Soft Real-Time: 정해진 시간 내에 작업이 완료되지 않더라도 허용 가능한 경우.

Real-Time이 필요한 이유

다음과 같은 임베디드 시스템에서 Real-Time Linux가 필요합니다:

  • 산업 자동화: 기계 제어 및 센서 데이터 처리.
  • 로봇 공학: 로봇의 실시간 동작 제어.
  • 의료 장비: 심박수 모니터링, 수술 로봇.
  • 멀티미디어 시스템: 오디오 및 비디오 스트리밍의 지연 최소화.

RT_PREEMPT 패치 적용

RT_PREEMPT 패치는 리눅스 커널에 실시간 특성을 추가하는 패치입니다. 이 패치를 통해 커널은 더 낮은 레이턴시를 제공하며, 실시간 작업을 우선 처리할 수 있습니다. RK3399 플랫폼에 RT_PREEMPT 패치를 적용하는 방법을 단계별로 살펴보겠습니다.

1. 환경 설정

필요한 도구 설치

RT_PREEMPT 패치를 적용하려면 다음 도구가 필요합니다:

sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev bc

커널 소스 코드 다운로드

Rockchip RK3399에 맞는 커널 소스 코드를 다운로드합니다:

git clone https://github.com/rockchip-linux/kernel.git -b stable-4.19
cd kernel

2. RT_PREEMPT 패치 다운로드 및 적용

RT_PREEMPT 패치 다운로드

다음 링크에서 원하는 커널 버전에 맞는 RT_PREEMPT 패치를 다운로드합니다:

https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/

예를 들어, 4.19 버전에 대한 패치를 다운로드합니다:

wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.19/patch-4.19.94-rt39.patch.gz
gzip -d patch-4.19.94-rt39.patch.gz

패치 적용

패치를 적용합니다:

patch -p1 < patch-4.19.94-rt39.patch

3. 커널 구성

make menuconfig 명령을 사용하여 RT_PREEMPT를 활성화합니다:

make menuconfig

아래 설정을 활성화합니다:

  1. Kernel Features > Preemption Model > Fully Preemptible Kernel (RT) 선택.
  2. 기타 필요한 모듈 선택.

구성을 저장한 후 종료합니다.

4. 커널 빌드 및 설치

커널을 빌드하고 설치합니다:

make -j$(nproc)
make modules_install
make install

5. 부팅 테스트

커널 빌드가 완료되면 장치를 재부팅하여 새로운 커널로 부팅합니다:

sudo reboot

부팅 후, 아래 명령을 통해 실시간 커널이 적용되었는지 확인합니다:

uname -a
dmesg | grep -i 'PREEMPT'

실시간 특성 구현 예제

RT_PREEMPT 커널에서 실시간 작업을 구현하는 간단한 예제를 보겠습니다. 이 예제는 높은 우선순위의 실시간 스레드를 생성하여 특정 작업을 수행합니다.

C 코드 예제

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

void *real_time_task(void *arg) {
    struct sched_param param;
    param.sched_priority = 80; // 높은 우선순위
    if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &param)) {
        perror("Failed to set scheduling policy");
        return NULL;
    }

    while (1) {
        printf("Real-time task running...\n");
        usleep(100000); // 100ms 대기
    }
    return NULL;
}

int main() {
    pthread_t thread;
    if (pthread_create(&thread, NULL, real_time_task, NULL)) {
        perror("Failed to create thread");
        return EXIT_FAILURE;
    }

    pthread_join(thread, NULL);
    return EXIT_SUCCESS;
}

컴파일 및 실행

위 코드를 컴파일하고 실행합니다:

gcc -o realtime_task realtime_task.c -pthread
sudo ./realtime_task

출력:

Real-time task running...
Real-time task running...
...

결론

이번 포스팅에서는 Real-Time Linux의 개념과 필요성을 이해하고, RT_PREEMPT 패치를 적용하여 실시간 특성을 구현하는 방법을 살펴보았습니다. RT_PREEMPT를 통해 일반 리눅스 커널을 실시간 커널로 변환할 수 있으며, 이를 통해 다양한 실시간 임베디드 시스템에서 높은 성능과 신뢰성을 제공할 수 있습니다.

실제 프로젝트에 적용할 때는 시스템 요구사항에 따라 커널 구성을 세부 조정해야 하며, 실시간 작업의 우선순위와 스케줄링 정책을 신중히 설정해야 합니다.

반응형