# Xenomai 애플리케이션 개발: 도구 및 워크플로우

Xenomai 기반 애플리케이션을 개발하기 위해선 올바른 도구와 워크플로우를 잘 이해하고 사용하는 것이 매우 중요하다. 이 단원에서는 Xenomai 애플리케이션 개발에 필수적인 도구와 워크플로우에 대해 다룬다.

#### 개발 환경 설정

Xenomai 애플리케이션을 개발하기 위해선 먼저 개발 환경을 설정해야 한다. 다음은 기본적인 설정 단계이다:

1. **Xenomai 설치**
   * 먼저, Xenomai를 시스템에 설치해야 한다. 이를 위해 Xenomai의 공식 웹사이트에 방문해 최신 버전을 다운로드하고 설치한다.
   * 커널 패치를 적용하고, Xenomai 라이브러리를 빌드하고 시스템에 설치한다. 이는 보통 다음과 같은 명령어로 수행된다:

     ```sh
     cd /path/to/xenomai
     ./scripts/bootstrap
     ./configure --with-core=cobalt --enable-smp
     make
     sudo make install
     ```
2. **개발 도구 설치**
   * Xenomai 애플리케이션을 개발하기 위해 필요한 개발 도구로는 GCC, GDB, make 등이 있다. 이 도구들은 대부분의 리눅스 배포판에서 기본적으로 제공되지만, 필요 시 패키지 매니저를 통해 설치할 수 있다:

     ```sh
     sudo apt-get install build-essential
     sudo apt-get install gdb
     ```

#### 프로젝트 구성

개발을 시작하기 전에 프로젝트의 디렉토리 구조와 필요한 파일을 준비해야 한다. 일반적인 프로젝트 구성은 다음과 같다:

```
project/
├── src/
│   ├── main.c
│   └── some_module.c
├── include/
│   └── some_header.h
├── Makefile
└── README.md
```

* `src/` 디렉토리는 모든 소스 파일을 포함하며, `main.c`에서 프로젝트의 진입점을 정의한다.
* `include/` 디렉토리는 헤더 파일들을 포함한다.
* `Makefile`은 프로젝트의 빌드를 자동화하기 위한 파일이다.

#### Makefile 작성

효율적인 빌드를 위해 Makefile을 작성한다. 간단한 Xenomai 프로젝트를 위한 기본적인 Makefile은 다음과 같다:

```makefile
CC = gcc
CFLAGS = -I/usr/xenomai/include
LDFLAGS = -L/usr/xenomai/lib -lxenomai -lpthread

SRCS = $(wildcard src/*.c)
OBJS = $(SRCS:.c=.o)
TARGET = my_xenomai_app

all: $(TARGET)

$(TARGET):$(OBJS)
    $(CC) -o$@ $^$(LDFLAGS)

%.o: %.c
    $(CC) -c -o$@ $<$(CFLAGS)

clean:
    rm -f $(TARGET)$(OBJS)
```

#### 기본적인 애플리케이션 구조

Xenomai를 활용하여 기본적인 애플리케이션을 작성하는 예제이다. 다음은 `main.c` 파일이다:

```c
#include <stdio.h>
#include <xenomai/init.h>
#include <xenomai/native/task.h>

#define TASK_PRIO 99
#define TASK_MODE 0
#define TASK_STKSZ 4096

RT_TASK demo_task;

void task_body(void *arg) {
    printf("Hello Xenomai!\n");
}

int main(int argc, char *argv[]) {
    int err;

    err = rt_task_create(&demo_task, "DEMO", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (err) {
        fprintf(stderr, "Failed to create task: %s\n", strerror(-err));
        return 1;
    }

    err = rt_task_start(&demo_task, &task_body, NULL);
    if (err) {
        fprintf(stderr, "Failed to start task: %s\n", strerror(-err));
        return 1;
    }

    pause();  // Wait indefinitely

    return 0;
}
```

이 애플리케이션은 간단한 Xenomai 태스크를 생성하고 실행하며, 실행 시 "Hello Xenomai!" 메시지를 출력한다.

#### 컴파일 및 실행

프로젝트를 컴파일하고 실행하려면 터미널에서 프로젝트 루트 디렉토리로 이동한 후 `make` 명령을 실행한다:

```sh
make
```

정상적으로 컴파일되면, 생성된 실행 파일을 실행한다:

```sh
sudo ./my_xenomai_app
```

출력은 다음과 같이 나타난다:

```
Hello Xenomai!
```

#### 디버깅 및 문제 해결

Xenomai 애플리케이션을 개발하는 동안 발생할 수 있는 버그와 문제들을 디버깅하는 것은 중요한 스킬이다. 다음은 몇 가지 주요 디버깅 및 문제 해결 도구와 방법들이다.

**GDB를 이용한 디버깅**

리눅스 기반 시스템에서 가장 널리 사용되는 디버깅 도구는 GDB(GNU Debugger)이다. Xenomai 애플리케이션도 GDB로 디버깅할 수 있다. 다음은 기본적인 사용 방법이다:

1. **디버깅 심볼 포함하여 컴파일하기**
   * 디버깅을 위해서는 응용 프로그램을 컴파일할 때 디버깅 심볼을 포함해야 한다. Makefile에서 `-g` 플래그를 추가한다:

     ```makefile
     CFLAGS = -g -I/usr/xenomai/include
     ```
2. **GDB 시작하기**
   * GDB를 시작하려면, 컴파일된 애플리케이션을 GDB와 함께 실행한다:

     ```sh
     sudo gdb ./my_xenomai_app
     ```
3. **GDB 명령어 사용하기**
   * 기본적인 GDB 명령어로는 `run`(프로그램 시작), `break`(브레이크포인트 설정), `next`(다음 라인 실행), `continue`(프로그램 계속 실행), `print`(변수 값 출력) 등이 있다.

     ```sh
     gdb> break main
     gdb> run
     gdb> next
     gdb> print variable_name
     ```

**로깅 및 트레이싱**

디버깅 외에도 로깅과 트레이싱 도구를 통해 실시간 시스템에서 발생하는 문제를 분석할 수 있다.

1. **Dmesg 확인하기**
   * 커널 메시지를 확인하여 시스템 레벨에서 발생하는 문제를 파악한다:

     ```sh
     dmesg | tail -n 50
     ```
2. **Xenomai 누로스(Nucleus) 트레이싱**
   * Xenomai는 자체적인 트레이싱 기능을 제공한다. 이를 통해 실시간 태스크 스케줄링 및 타이밍 관련 문제를 분석할 수 있다.
   * 트레이싱을 활성화하려면 `xeno-config`에서 필요한 옵션을 설정하고, `cobalt` 트레이서를 실행한다:

     ```sh
     xeno-config --skin=native --cflags
     xeno-config --skin=native --ldflags
     ```
   * 트레이서를 실행하여 실시간 데이터 수집을 시작한다:

     ```sh
     sudo trace-cmd start -p xenomai_cobalt -P <pid_of_your_xenomai_task>
     sudo trace-cmd stop
     sudo trace-cmd report > trace_report.txt
     ```

**문제 해결 방법 공유**

실시간 시스템에서 발생하는 문제는 매우 다양할 수 있으며, 이를 해결하기 위해서는 경험과 커뮤니티의 지원이 필요할 때가 많다.

* **커뮤니티 포럼 및 메일링 리스트**
  * Xenomai 공식 포럼과 메일링 리스트에 가입하여 문제를 공유하고 해결 방법을 찾을 수 있다.
* **버그 트래커 사용**
  * 발견된 버그나 원하는 기능 요청은 Xenomai의 공식 버그 트래커에 보고하여 다른 개발자들과 정보를 공유한다.

#### 성능 튜닝

실시간 애플리케이션의 성능을 최적화하기 위해 다음과 같은 성능 튜닝 기법을 고려할 수 있다.

1. **RT 태스크 우선순위 조정**
   * 태스크의 우선순위를 적절하게 설정하여 중요한 태스크가 우선적으로 처리되도록 한다.

     ```c
     rt_task_create(&task, "TASK", TASK_STKSZ, 99, TASK_MODE);
     ```
2. **커널 파라미터 조정**
   * `/proc` 파일 시스템을 통해 Xenomai 및 리눅스 커널의 설정을 조정하여 시스템 성능을 최적화한다.

     ```sh
     sudo sysctl -w kernel.sched_rt_runtime_us=-1
     ```
3. **메모리 잠금**
   * `mlockall` 함수를 사용하여 애플리케이션이 사용하는 메모리를 잠금으로써 페이지 폴트로 인한 지연을 방지한다:

     ```c
     #include <sys/mman.h>
     mlockall(MCL_CURRENT | MCL_FUTURE);
     ```

***

이 장에서는 Xenomai 애플리케이션 개발을 위해 필요한 도구와 워크플로우에 대해 살펴보았다. 개발 환경 설정, 프로젝트 구성, 빌드 및 디버깅 방법을 이해하고, 성능 튜닝 기법을 적용함으로써 효율적이고 안정적인 실시간 애플리케이션을 개발할 수 있다. 이 모든 과정을 통해 여러분의 Xenomai 애플리케이션 개발 여정이 더욱 원활하고 성공적이기를 바란다.
