# Xenomai 명령어 참고

#### 1. `latency`

`latency` 명령어는 실시간 시스템에서 지연 시간을 측정하는 데 사용된다. Xenomai의 주요 기능들 중 하나로서, 이 명령어는 다양한 실시간 스케줄링 시나리오 하에서 메모리 액세스 및 CPU 처리 지연을 자세히 분석할 수 있다.

사용법:

```sh
latency [options]
```

주요 옵션:

* `-t`: 셀 주기 간격을 지정한다. 기본값은 1000 마이크로초이다.
* `-p`: 고우선순위 작업의 우선순위를 지정한다.
* `-h`: 도움말 메시지를 출력한다.

예제:

```sh
latency -t 500 -p 98
```

#### 2. `xeno-load`

`xeno-load` 명령어는 Xenomai 애플리케이션을 실행하기 전에 필요한 모듈 및 환경 설정을 로드하고 관리하는 데 사용된다.

사용법:

```sh
xeno-load [options] <module> [args]
```

주요 옵션:

* `-r`: 모듈 제거.
* `-d`: 디버그 모드 활성화.
* `-m`: 모듈 로드 경로 지정.

예제:

```sh
xeno-load -d my_module param1 param2
```

#### 3. `xeno-test`

`xeno-test`는 Xenomai 실시간 스택의 성능을 평가하기 위한 기본적인 시스템 테스트 프로그램이다. 다양한 부하 조건에서 시스템의 성능을 평가할 수 있다.

사용법:

```sh
xeno-test [options]
```

주요 옵션:

* `-s`: 테스트 실행 시간을 설정한다. 기본값은 60초이다.
* `-l`: 로그 파일을 지정하여 결과를 저장한다.
* `-h`: 도움말 메시지를 출력한다.

예제:

```sh
xeno-test -s 120 -l test_results.log
```

#### 4. `xeno-regression`

`xeno-regression` 명령어는 Xenomai의 회귀 테스트를 수행하는 데 사용된다. 각기 다른 테스트 케이스들을 자동으로 실행하여 시스템의 안정성을 평가할 수 있다.

사용법:

```sh
xeno-regression [options]
```

주요 옵션:

* `-c`: 특정 테스트 케이스를 실행한다.
* `-a`: 모든 기본 테스트 케이스를 실행한다.
* `-v`: 자세한 출력 모드를 활성화한다.

예제:

```sh
xeno-regression -a -v
```

#### 5. `switchtest`

`switchtest` 명령어는 여러 스레드 간의 스위칭 지연을 측정한다. 실시간 스레드 간의 컨텍스트 스위칭 성능을 평가할 수 있는 중요한 도구이다.

사용법:

```sh
switchtest [options]
```

주요 옵션:

* `-t`: 테스트 시간(초)을 설정한다. 기본값은 60초이다.
* `-i`: 스위치 간격을 설정한다.
* `-h`: 도움말 메시지를 출력한다.

예제:

```sh
switchtest -t 120 -i 1000
```

#### 6. `xenomai-stats`

`xenomai-stats` 명령어는 Xenomai 커널의 다양한 통계 정보를 출력하는 데 사용된다. 실시간 애플리케이션의 성능 분석과 최적화에 유용하다.

사용법:

```sh
xenomai-stats [options]
```

주요 옵션:

* `-c`: 카테고리별 통계를 출력한다.
* `-r`: 실시간 스케줄러의 통계를 출력한다.
* `-m`: 메모리 사용량 통계를 출력한다.

예제:

```sh
xenomai-stats -r
```

#### 7. `xeno-config`

`xeno-config` 명령어는 Xenomai 라이브러리와 컴파일러 플래그를 가져오는 데 사용된다. 특히, Xenomai 기반 애플리케이션을 빌드할 때 유용하다.

사용법:

```sh
xeno-config [options]
```

주요 옵션:

* `--cflags`: 컴파일러 플래그를 출력.
* `--libs`: 링크에 필요한 라이브러리를 출력.
* `--version`: 설치된 Xenomai의 버전을 출력.

예제:

```sh
gcc -o my_app my_app.c $(xeno-config --cflags --libs)
```

#### 8. `rtdmbench`

`rtdmbench` 명령어는 RTDM (Real-Time Driver Model) 인터페이스를 통해 실시간 응답을 측정한다. 특히, 장치 드라이버의 응답 지연을 평가할 때 유용하다.

사용법:

```sh
rtdmbench [options]
```

주요 옵션:

* `-t`: 테스트 실행 시간을 설정한다.
* `-d`: 디바이스 파일을 지정한다.
* `-i`: 인터럽트 핸들링을 활성화한다.

예제:

```sh
rtdmbench -t 120 -d /dev/rtdm/rtc0
```

#### 9. `xeno-cal`

`xeno-cal` 명령어는 Xenomai 커널의 타이머와 관련된 캘리브레이션 작업을 수행한다. 주로 타이머의 정확도를 보정하는 데 사용된다.

사용법:

```sh
xeno-cal [options]
```

주요 옵션:

* `-t`: 캘리브레이션 주기를 설정한다.
* `-v`: 자세한 출력을 활성화한다.
* `-h`: 도움말 메시지를 출력한다.

예제:

```sh
xeno-cal -t 1000 -v
```

#### 10. `xeno-test-run`

`xeno-test-run` 명령어는 여러 가지 Xenomai 테스트를 한번에 실행하고 통합된 결과를 제공한다. 주로 대규모 시스템 검증에 사용된다.

사용법:

```sh
xeno-test-run [options] <test_name>
```

주요 옵션:

* `-a`: 모든 기본 테스트를 실행한다.
* `-o`: 지정된 파일에 결과를 출력한다.
* `-l`: 특정 테스트 목록을 지정한다.

예제:

```sh
xeno-test-run -a -o results.log
```

#### 11. RTDM 인터페이스

RTDM 인터페이스는 Xenomai의 실시간 드라이버 모델로, 하드 실시간 특성을 제공하는 드라이버를 개발하는 데 사용된다.

**드라이버 등록 예제:**

```c
struct rtdm_driver my_driver = {
    .profile_info = RTDM_PROFILE_INFO(my_driver_name,
                                      RTDM_CLASS_SERIAL,
                                      RTDM_SUBCLASS_GENERIC,
                                      0),
    .device_flags = RTDM_NAMED_DEVICE | RTDM_EXCLUSIVE,
    .device_count = 1,
    .context_size = sizeof(struct my_device_context),
    .ops = {
        .open = my_driver_open,
        .close = my_driver_close,
        .ioctl_rt = NULL,
        .ioctl_nrt = my_driver_ioctl,
    },
    .device_name = "my_driver_name",
};
```

**드라이버 등록:**

```c
rtdm_dev_register(&my_driver);
```

**드라이버 해제:**

```c
rtdm_dev_unregister(&my_driver);
```

#### 12. 사용자 공간 애플리케이션

**간단한 실시간 태스크 예제:**

```c
#include <native/task.h>
#include <native/timer.h>
#include <rtdk.h>
#include <signal.h>

RT_TASK my_task;

void task_proc(void *arg)
{
    rt_printf("Hello, Xenomai!\n");
}

int main(int argc, char *argv[])
{
    signal(SIGINT, catch_signal);
    rt_print_auto_init(1);

    rt_task_create(&my_task, "My Task", 0, 50, 0);
    rt_task_start(&my_task, &task_proc, NULL);

    pause();

    rt_task_delete(&my_task);
    return 0;
}
```

#### 13. Xenomai 설정 및 튜닝

* **고정 우선순위 결정**: 애플리케이션 및 시스템 작업의 우선순위를 고정 시킨다.
* **irqbalance 비활성화**: `irqbalance` 서비스는 비활성화해 실시간 성능을 향상시킨다.
* **CPU 격리**: 특정 CPU를 실시간 태스크만 처리하도록 격리한다 (커널 파라미터 `isolcpus` 사용).

#### 추가 정보 및 리소스

* **Xenomai 메일링 리스트**: 최신 정보를 교환하고 문제 해결을 논의할 수 있다.
* **공식 문서**: Xenomai의 공식 문서를 통해 추가적인 상세 정보를 얻을 수 있다.
* **소스 코드 참조**: Xenomai의 Git 리포지토리에서 최신 소스 코드를 확인할 수 있다.

이 모든 명령어와 그 용례는 실시간 성능을 극대화하고 Xenomai의 기능을 활용하는 데 중요하다. 각 명령어의 사용법과 옵션을 숙지하면 더 효율적으로 시스템을 관리하고 문제를 해결할 수 있다.
