# 타이밍 분석 및 지연 시간 측정

### 서론

Xenomai는 실시간 성능을 보장하기 위해 설계된 프레임워크로, 타이밍 분석과 지연 시간 측정은 핵심 요소이다. 이 섹션에서는 Xenomai 시스템의 타이밍 분석 방법과 지연 시간을 측정하는 다양한 기법을 다룬다.

### 타이밍 분석

#### 1. 주기적 작업의 타이밍 분석

주기적 작업의 타이밍 분석은 작업이 예상한 주기대로 실행되는지 확인하는 과정이다. 이는 일반적으로 다음과 같이 수행된다:

* **작업 주기 검증**: 작업이 예상 주기대로 실행되는지 확인
* **작업 간 간격 측정**: 연속적인 작업 간의 시간 간격을 측정

**예제**

작업 주기를 측정하기 위해서는 작업의 시작 시각과 종료 시각을 기록해야 한다. 이를 위해 Xenomai의 `rt_timer_read()` 함수를 사용할 수 있다.

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

#define TASK_PERIOD 1e6 // 1ms(1000ns)

void task(void *arg) {
    RTIME now, previous;

    previous = rt_timer_read();
    while (1) {
        rt_task_wait_period(NULL);
        now = rt_timer_read();

        printf("Task period: %lld ns\n", now - previous);
        previous = now;
    }
}

int main(void) {
    RT_TASK my_task;

    rt_task_create(&my_task, "MyTask", 0, 99, 0);
    rt_task_set_periodic(&my_task, TM_NOW, TASK_PERIOD);
    rt_task_start(&my_task, &task, NULL);
    
    pause();
    return 0;
}
```

위의 예제에서는 주기적인 작업의 실행 시간을 측정하여 `printf()`를 통해 출력한다.

#### 2. 불규칙한 작업의 타이밍 분석

불규칙한 작업의 타이밍 분석은 작업이 예기치 않게 실행되는 경우에 대한 분석을 포함한다. 이를 위해 이벤트 기반 접근 방식을 사용할 수 있다.

**예제**

예를 들어, 외부 인터럽트에 의해 실행되는 작업의 타이밍을 측정할 수 있다. 인터럽트를 처리하는 ISR에서 타이밍 데이터를 수집할 수 있다.

```c
#include <native/task.h>
#include <native/timer.h>
#include <native/intr.h>
#include <stdio.h>

RT_INTR my_interrupt;

void interrupt_handler(void *arg) {
    RTIME now = rt_timer_read();
    printf("Interrupt occurred at: %lld ns\n", now);
}

int main(void) {
    rt_intr_create(&my_interrupt, "MyInterrupt", 10, I_TRIGGER_EDGE);
    rt_intr_bind(&my_interrupt, 10, NULL);
    rt_intr_enable(&my_interrupt);

    rt_intr_wait(&my_interrupt, NULL);
    interrupt_handler(NULL);
    
    return 0;
}
```

위의 예제에서는 인터럽트 발생 시 타이밍을 측정하는 방법을 보여준다.

### 지연 시간 측정

지연 시간(latency)은 시스템이 입력을 받아 반응하는 데 걸리는 시간이다. 이는 실시간 시스템의 성능을 평가하는 데 중요한 요소이다.

#### 1. 사용자 공간 응용에서의 지연 시간 측정

사용자 공간에서 지연 시간을 측정하는 가장 기본적인 방법은 높은 우선순위의 작업을 만들고 이를 주기적으로 실행하며, 시간 지연을 기록하는 것이다.

**예제**

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

#define TASK_PERIOD 1e6 // 1ms(1000ns)

void task(void *arg) {
    RTIME now, previous, latency;

    previous = rt_timer_read();
    while (1) {
        rt_task_wait_period(NULL);
        now = rt_timer_read();

        latency = now - previous - TASK_PERIOD;
        printf("Task latency: %lld ns\n", latency);
        previous = now;
    }
}

int main(void) {
    RT_TASK my_task;

    rt_task_create(&my_task, "MyTask", 0, 99, 0);
    rt_task_set_periodic(&my_task, TM_NOW, TASK_PERIOD);
    rt_task_start(&my_task, &task, NULL);
    
    pause();
    return 0;
}
```

위의 예제에서는 작업의 지연 시간을 계산하여 `printf()`를 통해 출력한다.

#### 2. 커널 공간에서의 지연 시간 측정

커널 공간에서도 지연 시간을 측정할 수 있으며, 이는 더욱 높은 정밀도를 제공할 수 있다. Xenomai는 이러한 목적을 위해 다양한 API를 제공한다.

**예제**

```c
#include <rtdm/driver.h>
#include <native/timer.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

#define TASK_PERIOD 1000000 // 1ms

RT_TASK my_task;

void task_func(void *arg) {
    RTIME now, previous, latency;

    previous = rt_timer_read();
    while (1) {
        rt_task_wait_period(NULL);
        now = rt_timer_read();

        latency = now - previous - TASK_PERIOD;
        rt_printk("Kernel Task Latency: %lld ns\n", latency);
        previous = now;
    }
}

static int __init my_module_init(void) {
    rt_task_create(&my_task, "MyTask", 0, 50, 0);
    rt_task_set_periodic(&my_task, TM_NOW, rt_timer_ns2ticks(TASK_PERIOD));
    rt_task_start(&my_task, &task_func, NULL);
    
    return 0;
}

static void __exit my_module_exit(void) {
    rt_task_delete(&my_task);
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Kernel Space Latency Measurement Example");
```

위의 예제에서는 커널 공간에서 주기적 작업의 지연 시간을 측정하고 `rt_printk()`를 통해 출력하는 방법을 보여준다.

***

Xenomai를 사용한 타이밍 분석과 지연 시간 측정은 실시간 시스템의 평가와 최적화를 위한 필수 과정이다. 주기적 작업과 불규칙한 작업의 타이밍 분석 방법 및 사용자 공간과 커널 공간에서의 지연 시간 측정 방법을 살펴보았다. 이러한 기법을 이해하고 적용함으로써 Xenomai 기반 시스템의 성능을 효과적으로 관리할 수 있다.
