# RTAI(실시간 애플리케이션 인터페이스)에서의 마이그레이션

### Xenomai와 RTAI 비교

#### 실시간 성능

Xenomai와 RTAI는 모두 높은 실시간 성능을 제공하지만, Xenomai는 RTDM(Real-Time Driver Model)와 같은 더 나은 드라이버 모델과 다양한 API를 지원함으로써 개발자에게 더 많은 옵션을 제공한다.

#### 아키텍처

Xenomai는 이중 커널 (Dual Kernel) 아키텍처를 사용하여 이식성과 응답성을 높인다. 이는 핵심 실시간 부분을 co-kernel로 분리함으로써 이루어진다. 반면, RTAI는 Adeos I-pipe를 사용하여 Linux 커널을 패치한다.

#### API 호환성

RTAI에서 Xenomai로 마이그레이션할 때 가장 큰 일반적인 문제는 API 호환성이다. Xenomai는 다양한 API 집합을 제공하여 기존의 RTAI 코드를 수정 없이 사용할 수 있게끔 한다.

### 마이그레이션 단계

#### 1. 패치 및 빌드

**Xenomai 패치 적용**

Xenomai를 설치하려면 먼저 Linux 커널에 Xenomai 패치를 적용해야 한다. Xenomai 패치는 Linux 커널에 실시간 기능을 추가한다. 이를 수행하려면 다음 단계를 따른다.

1. Xenomai 다운로드

   ```bash
   git clone https://gitlab.denx.de/Xenomai/xenomai.git
   ```
2. Xenomai 패치 적용

   ```bash
   cd xenomai
   sudo ./scripts/prepare-kernel.sh --linux=/path/to/linux --arch=your_arch --verbose
   ```
3. 커널 컴파일 및 설치

   ```bash
   cd /path/to/linux
   make menuconfig  # 필요에 따라 설정
   make -j$(nproc)
   sudo make modules_install
   sudo make install
   ```

#### 2. 환경 설정

**Xenomai 라이브러리와 헤더 설치**

1. Xenomai 빌드 스크립트 실행

   ```bash
   cd xenomai
   sudo ./scripts/bootstrap 
   ./configure --with-core=cobalt --enable-smp --disable-tls
   make -j$(nproc)
   sudo make install
   ```
2. 환경 변수 설정

   ```bash
   export PATH=/usr/xenomai/bin:$PATH
   export LD_LIBRARY_PATH=/usr/xenomai/lib:$LD_LIBRARY_PATH
   ```

#### 3. 코드 변경

**실시간 태스크(API) 변환**

1. RTAI에서 사용된 실시간 태스크 생성 API를 Xenomai의 그와 대응하는 API로 변환한다.

   RTAI 코드:

   ```c
   RT_TASK my_task;
   rt_task_init(&my_task, my_task_function, 0, 1024, 0, 0, 0);
   ```

   Xenomai 코드:

   ```c
   RT_TASK my_task;
   rt_task_create(&my_task, "MyTask", 0, 50, 0);
   rt_task_start(&my_task, &my_task_function, NULL);
   ```
2. 주기적 실행 태스크의 경우, 적절하게 태스크 주기를 설정한다.

   RTAI 코드:

   ```c
   rt_task_make_periodic(&my_task, rt_get_time(), nano2count(1000000));
   ```

   Xenomai 코드:

   ```c
   rt_task_set_periodic(NULL, TM_NOW, rt_timer_ns2ticks(1000000));
   ```

#### 4. 실시간 드라이버 변환

RTAI에서 사용된 실시간 드라이버를 Xenomai에서 사용하는 RTDM(Real-Time Driver Model)로 변환한다.

1. RTAI 드라이버 초기화 코드:

   ```c
   int init_module(void) {
       ... // 일반적인 초기화 코드
   }

   void cleanup_module(void) {
       ... // 종료 코드
   }
   ```
2. Xenomai RTDM 드라이버 변환 코드:

   ```c
   static int __init my_rtdm_module_init(void) {
       ... // RTDM 초기화 코드
       return 0;
   }

   static void __exit my_rtdm_module_exit(void) {
       ... // RTDM 종료 코드
   }

   module_init(my_rtdm_module_init);
   module_exit(my_rtdm_module_exit);
   ```

   Xenomai의 RTDM API들은 RTAI와는 달리 보다 표준화되어 있으며, 리소스 관리 및 데이터 구조 정의에서 많은 부분이 자동화되어 있다. 이는 마이그레이션 시 코드의 가독성과 유지보수성을 높일 수 있다.

#### 5. 문제 해결 및 테스트

**커널 로그 확인**

RTAI에서 Xenomai로의 마이그레이션 후, 시스템의 실시간 성능을 확인하기 위해 커널 로그를 주기적으로 확인해야 한다.

```bash
dmesg | grep Xenomai
```

**실시간 태스크 스케줄링 확인**

실시간 태스크의 스케줄링이 올바르게 이루어지고 있는지 확인한다. 이는 Xenomai가 제공하는 `latency` 또는 `switchtest`와 같은 기본 제공 벤치마킹 도구를 사용하여 테스트할 수 있다.

```bash
latency -t 1
switchtest -p
```

#### 6. 업데이트 및 유지보수

Xenomai 커널 및 라이브러리는 정기적으로 업데이트된다. 따라서 Xenomai의 최신 릴리스를 주기적으로 확인하고 적용하는 것이 중요하다. 이는 보안 취약점 수정, 성능 향상 및 새로운 기능 추가를 포함한다.

#### 7. 문서화

마이그레이션 후에는 코드 변경 사항과 새로운 시스템 아키텍처에 대한 문서를 철저하게 작성하는 것이 중요하다. 이는 향후 유지보수 및 새 개발자 교육에 도움이 된다.

***

RTAI에서 Xenomai로의 마이그레이션은 실시간 성능 향상, 다양한 API 지원, 그리고 강력한 드라이버 모델 등 여러 가지 이점을 제공한다. 그러나 마이그레이션 과정에서 API 변경, 드라이버 모델 차이 등을 고려하여 적절한 계획과 테스트가 필요하다. 이 가이드가 마이그레이션을 성공적으로 수행하는 데 도움이 되길 바란다.
