# 시스템 설계 및 모듈화

Preempt RT 기반의 실시간 제어 시스템을 설계하고 모듈화하는 과정은 시스템의 요구 사항을 정확히 반영하면서, 효율적인 성능을 보장하기 위한 구조를 마련하는 것이 핵심이다. 이 장에서는 시스템 설계 원칙, 모듈화의 필요성, 각 모듈의 역할 및 인터페이스 정의, 그리고 모듈 간 통신 방법을 다룬다.

#### 시스템 설계 원칙

실시간 제어 시스템 설계는 다음과 같은 원칙을 기반으로 해야 한다:

1. **시간 결정성 (Determinism):** 시스템의 모든 동작은 예측 가능해야 하며, 시간 제한 내에 완료되어야 한다. 이는 Preempt RT의 핵심 목표 중 하나로, 모든 태스크의 응답 시간이 명확하게 정의되어야 한다.
2. **안정성 (Stability):** 시스템이 예기치 않은 상황에서도 안정적으로 동작해야 한다. 예를 들어, 하드웨어 고장이나 소프트웨어 오류가 발생했을 때도 시스템은 일정한 수준의 기능을 유지해야 한다.
3. **모듈성 (Modularity):** 시스템은 독립적으로 개발 및 테스트가 가능한 모듈들로 나누어져야 한다. 모듈 간의 의존성을 최소화하여 유지보수와 확장이 용이하도록 설계해야 한다.
4. **성능 (Performance):** 실시간 제어 시스템은 높은 성능을 유지해야 한다. 이는 낮은 레이턴시, 높은 스루풋, 그리고 적은 오버헤드를 포함한다.

#### 모듈화의 필요성

모듈화는 복잡한 시스템을 관리 가능한 부분으로 나누어, 개발, 테스트, 유지보수를 용이하게 한다. 모듈화의 주요 이점은 다음과 같다:

* **재사용성 (Reusability):** 모듈화된 컴포넌트는 다른 프로젝트에서 재사용할 수 있다.
* **독립적 개발 (Independent Development):** 각 모듈은 별도의 팀이나 개발자가 독립적으로 개발할 수 있다.
* **유지보수성 (Maintainability):** 모듈 단위로 문제를 해결하거나 기능을 추가하는 것이 용이한다.

#### 모듈 설계

모듈 설계 시, 시스템의 주요 기능을 각 모듈에 배분하며, 다음과 같은 요소들을 고려한다:

1. **입출력 모듈 (I/O Modules):** 센서 데이터 수집 및 액추에이터 제어를 담당하는 모듈이다. 이 모듈은 하드웨어와 직접적으로 상호작용하며, 데이터를 표준화된 포맷으로 변환하여 시스템 내의 다른 모듈과 통신한다.
2. **제어 알고리즘 모듈 (Control Algorithm Module):** 입력 데이터를 바탕으로 제어 알고리즘을 실행하여, 시스템의 상태를 결정하고, 필요한 출력을 계산한다. 이 모듈은 실시간성을 가장 중시해야 하며, 따라서 최적화된 코드를 사용해야 한다.
3. **통신 모듈 (Communication Module):** 모듈 간 데이터 전송을 처리한다. 실시간 요구 사항을 충족하기 위해, 통신의 지연을 최소화하고, 데이터의 무결성을 보장하는 것이 중요하다.
4. **로그 및 모니터링 모듈 (Logging and Monitoring Module):** 시스템의 동작을 기록하고, 실시간으로 모니터링할 수 있게 한다. 이 모듈은 비실시간 작업이므로, 전체 시스템 성능에 영향을 미치지 않도록 설계되어야 한다.
5. **에러 처리 모듈 (Error Handling Module):** 시스템에서 발생하는 오류를 감지하고, 이에 따른 대응을 결정한다. 예를 들어, 경미한 오류는 시스템이 계속 동작하도록 허용할 수 있지만, 심각한 오류는 시스템을 안전 모드로 전환시킬 수 있다.

#### 모듈 간 인터페이스 정의

모듈 간 인터페이스는 명확하게 정의되어야 하며, 이 인터페이스를 통해 모듈들이 데이터를 교환하고 상호작용하게 된다. 인터페이스 정의 시 고려할 사항은 다음과 같다:

1. **데이터 형식 (Data Format):** 각 모듈은 데이터를 일정한 포맷으로 주고받아야 한다. 예를 들어, 센서 데이터는 정규화된 형태로 제어 모듈에 전달되어야 한다.
2. **통신 프로토콜 (Communication Protocol):** 모듈 간 통신은 표준화된 프로토콜을 사용해야 한다. 실시간 시스템에서는 일반적으로 공유 메모리, 메시지 큐, 혹은 FIFO 방식의 통신을 사용한다.
3. **동기화 (Synchronization):** 모듈 간 데이터 일관성을 유지하기 위해 동기화 메커니즘이 필요하다. 예를 들어, 제어 모듈이 센서 데이터를 읽기 전에, 해당 데이터가 최신 상태임을 보장해야 한다.
4. **에러 처리 (Error Handling):** 인터페이스에서 발생할 수 있는 오류 상황을 정의하고, 이를 처리하는 방법을 명확히 해야 한다. 예를 들어, 데이터 전송 중 오류가 발생했을 때, 재시도 로직을 구현할 수 있다.

#### 모듈 간 통신

실시간 시스템에서 모듈 간 통신은 매우 중요한 역할을 하며, 통신의 지연을 최소화하고 데이터의 무결성을 보장해야 한다. Preempt RT를 사용하는 실시간 제어 시스템에서는 주로 다음과 같은 통신 메커니즘을 활용한다.

**공유 메모리 (Shared Memory)**

공유 메모리는 여러 모듈이 동시에 접근할 수 있는 메모리 영역을 제공하여, 데이터를 빠르게 교환할 수 있는 방법이다. 공유 메모리를 사용할 때는 다음 사항들을 고려해야 한다:

* **동기화:** 여러 모듈이 동시에 데이터를 읽고 쓸 수 있으므로, \*\*뮤텍스 (Mutex)\*\*나 \*\*스핀락 (Spinlock)\*\*을 사용하여 데이터 일관성을 유지해야 한다.
* **캐시 일관성:** 멀티코어 환경에서는 각 코어가 캐시 데이터를 사용하기 때문에, 캐시 일관성을 유지하기 위한 메커니즘을 구현해야 한다.
* **오버헤드:** 공유 메모리 접근 시 동기화 오버헤드가 발생할 수 있으며, 이로 인해 실시간성을 해치지 않도록 주의해야 한다.

**메시지 큐 (Message Queue)**

메시지 큐는 모듈 간에 데이터를 교환하는 큐 기반의 통신 방법이다. 메시지 큐는 데이터의 순서를 보장하며, 다음과 같은 특징을 갖는다:

* **비동기 통신:** 송신자는 메시지를 큐에 넣고, 수신자는 큐에서 메시지를 꺼내서 처리한다. 이 과정에서 송신자와 수신자는 동시에 동작할 필요가 없다.
* **우선순위:** 특정 메시지에 우선순위를 부여하여 중요한 메시지가 먼저 처리되도록 할 수 있다.
* **크기 제한:** 메시지 큐의 크기는 한정적이므로, 큐가 가득 찬 경우 메시지를 버리거나, 송신자가 대기하도록 설계해야 한다.

**실시간 버스 (Real-time Bus)**

산업용 실시간 제어 시스템에서는 **CAN (Controller Area Network)**, **EtherCAT**, **PROFINET** 등과 같은 실시간 버스를 사용하여 모듈 간에 데이터를 교환할 수 있다. 이들 실시간 버스는 낮은 레이턴시와 높은 신뢰성을 보장하는 통신 방법을 제공한다.

* **CAN:** 낮은 데이터 전송률(최대 1 Mbps)이지만, 높은 신뢰성과 오류 감지 기능을 제공하여, 자동차 및 산업 자동화 시스템에서 널리 사용된다.
* **EtherCAT:** 이더넷 기반의 실시간 통신 프로토콜로, 낮은 지연 시간과 높은 데이터 전송률을 제공한다. 주로 산업용 로봇이나 고속 제어 시스템에서 사용된다.
* **PROFINET:** 산업 자동화에서 사용되는 실시간 이더넷 표준으로, 높은 유연성과 통합성을 제공한다.

#### 모듈 간 데이터 흐름

모듈 간 데이터 흐름은 시스템의 성능과 실시간성을 좌우하는 중요한 요소이다. 효율적인 데이터 흐름 설계를 위해 다음을 고려해야 한다:

1. **데이터 경로 최적화:** 데이터가 모듈 간에 흐르는 경로를 최소화하여 지연 시간을 줄이고, 불필요한 데이터 복사를 피해야 한다. 이를 위해, 데이터가 여러 모듈을 거치는 것을 피하고, 필요한 모듈 간 직접적인 데이터 전송을 고려한다.
2. **데이터 패킷 크기 조정:** 통신 패킷의 크기를 최적화하여 전송 오버헤드를 줄이다. 너무 작은 패킷은 헤더 오버헤드가 커지며, 너무 큰 패킷은 전송 지연을 초래할 수 있다.
3. **주기적 vs. 이벤트 기반 데이터 전송:** 데이터 전송 방식은 주기적으로 데이터를 전송하는 방법과, 이벤트가 발생했을 때만 데이터를 전송하는 방법이 있다. 실시간 시스템에서는 주기적 전송을 사용하여 예측 가능성을 높이는 경우가 많지만, 시스템 요구사항에 따라 이벤트 기반 전송이 더 효율적일 수 있다.
4. **버퍼 관리:** 데이터 전송 시 버퍼를 사용하여 데이터를 일시적으로 저장할 수 있다. 버퍼 크기와 관리 방법은 시스템의 성능에 큰 영향을 미칠 수 있으며, 특히 버퍼 오버플로우나 언더플로우가 발생하지 않도록 주의해야 한다.

#### 모듈화된 시스템의 타이밍 분석

모듈화된 실시간 제어 시스템에서는 각 모듈이 지정된 시간 내에 작업을 완료하는지 분석하는 것이 중요하다. 타이밍 분석은 시스템의 시간적 요구 사항을 충족시키기 위해 필수적이다.

**응답 시간 분석**

모듈의 응답 시간 $R$은 모듈이 작업을 시작한 시점부터 완료할 때까지 걸리는 시간으로 정의된다. 응답 시간 분석은 다음과 같이 진행된다:

$$
R = C + I
$$

여기서 $C$는 모듈의 계산 시간이고, $I$는 다른 태스크나 인터럽트에 의해 발생하는 지연 시간이다. 각 모듈의 응답 시간을 분석하여, 시스템의 실시간성을 보장할 수 있다.

**스케줄링 분석**

모듈화된 시스템에서 각 모듈이 적절하게 스케줄링되었는지 분석하는 것도 중요하다. 이를 위해 다양한 스케줄링 알고리즘을 적용할 수 있으며, 각 알고리즘의 특성을 고려하여 최적의 방법을 선택해야 한다.

예를 들어, \*\*고정 우선순위 스케줄링 (Fixed-Priority Scheduling)\*\*은 실시간 시스템에서 널리 사용되는 방법으로, 각 모듈에 우선순위를 부여하여 스케줄링하는 방식이다. 이 방법은 주로 짧은 작업이 높은 우선순위를 갖도록 설정하여 긴 작업에 의해 지연되지 않도록 설계한다.

스케줄링 분석 시, 각 모듈의 완료 시간과 시스템 전체의 응답 시간을 계산하여, 모든 작업이 기한 내에 완료될 수 있는지를 확인해야 한다.
