본문 바로가기
Engineering

[cRIO] 4. LabVIEW Real-Time Application - 첫번째

by 투썬 아빠 2013. 2. 25.



지난 포스팅에서 cRIO의 두 가지 프로그래밍 방법과, 어떤 경우에 각각의 방법을 적용하는지, 어떤 특징이 있는지 알아보았습니다. 이번에는 LabVIEW를 이용한 Real-Time 어플리케이션 개발에 대해 알아보겠습니다. 내용이 많기 때문에 주요한 내용들로 나누어 포스팅 하겠습니다. 이번 장에서 중요하게 볼 내용은 Deterministic/Nondeterministic입니다. 즉, 정시성이 필요한 프로세스와 그렇지 않은 프로세스의 구분에 대해 알아볼 것이며 정시성이 필요한 프로세스는 어떻게 개발해야 하는지, 데이터는 어떻게 관리할 것인지에 대해 알아보겠습니다.

 

이 내용들은 NI에서 제공하는 'NI LabVIEW for CompactRIO Developer's Guide'를 바탕으로 작성하였음을 미리 알려드립니다.

 

 1. Designing a Top-Level RTOS VI

LabVIEW를 이용한 Real-Time 어플리케이션을 개발할 때, 아래 그림과 같이 Top-Level Skeleton VI를 구성하는 것이 좋습니다.

 

<그림 1 Top-Level Skeleton VI>

 

 Top -Level Skeleton VI는 실제 동작하는 VI라기 보다는 개발하고자 하는 어플리케이션의 개요를 나타내는 정도로 이해하시면 됩니다. 각각의 프로세스 루프는 Sub VI 내부에 구성이 되어 있으며 각 Sub VI는 하나 이상의 프로세스를 지닐 수 있습니다. 위와 같이 Top-Level VI를 구성하면 어플리케이션 전체의 시스템을 파악하는데 유용합니다.

 이렇게 Top-Level VI를 만들어서 시스템의 전체적인 구조를 생성하였다면 각 프로세스에 대해 고려해야 합니다. 예를 들면, 정시성이 보장되어야 하는 프로세스는 어느 것인가? 그렇지 않은 프로세스는 어느 것인가? 각 프로세스 간에 데이터를 공유한다면 어떤 방법으로 프로세스간 데이터 통신을 구성할 것인가? 해당 어플리케이션에 적합한 디자인 패턴은 무엇이며, 메모리 관리는 어떻게 할 것인가? 등이 되겠습니다.

 

  1. Deterministic and Nondeterministic Processes

Real-Time 어플리케이션을 개발할 때, 두 단계의 신뢰성이 요구됩니다. 데이터 계측 및 제어 프로그램을 일반 PC에서 범용 OS(Windows와 같은) 를 사용하는 것은 부적합 합니다. Windows와 같은 범용 OS는 다양한 원인에 따라 지연시간이 발생할 수 있습니다. 예를 들자면 백그라운드로 동작하고 있는 백신 프로그램이나, Windows 내부 프로그램, 화면 업데이트 등이 될 것입니다. 때문에 Real-Time 어플리케이션을 만들 때 가장 먼저 고려해야 할 것(1단계)는 어떠한 방해 없이 특정 속도로 프로그램이 동작해야 하는 것입니다.cRIO의 RTOS를 이용하면 Timed Loop를 이용함으로써, (Real-Time 프로그래밍에 대한 special한 지식이 없어도) 신뢰성을 가지는 어플리케이션을 개발할 수 있습니다.

 

<그림 2 Jitter란?>

 

신뢰성의 2단계는 정시성과 지터입니다. 정시성이란 프로세스가 주어진 시간(동작을 위한 루프타임)내에 동작하는가? 입니다. 지터는 개발자가 원하는 동작 타이밍과 실제 동작한 타이밍의 오차입니다. 아무리 뛰어난 임베디드 컨트롤러일지라도 어느 정도의 지터는 있기 마련입니다. 대신 이 지터가 프로그램 동작의 허용범위 내에 있어야 합니다.

cRIO는 위와 같은 위와 같이 어플리케이션 동작의 신뢰성을 보장하기 위해 2가지 프로그래밍 방법을 지원합니다.


1.LabVIEW FPGA를 이용

 RTOS는 범용 OS에 비해 정시성, 신뢰성에서 우수하지만 프로그래밍을 올바로 하지 않을 경우 문제점이 있을 수 있습니다. 하지만 FPGA 코드는 OS가 아닌 H/W를 바탕으로 동작합니다. 때문에 중요한 태스크의 충돌이나 멈춤 현상이 일어나지 않는 것을 보장합니다.

 

2. LabVIEW Real-Time의 Timed Loop를 이요

 Timed-Loop는 While Loop에 비해 그 사용이 조금 어렵지만, 정시성을 보장하기 위한 태스크에 적합하게 디자인 되어있고, 지터의 발생도 최소화 합니다.


다음 챕터에서는 Deterministic Process(정시성을 보장해야하는 프로세스)를 실행하기 위해 Timed Loop를 어떻게 사용하는지, VI 프로퍼티는 어떻게 설정하는지에 대해 알아보겠습니다. 설명을 덧붙이자면, RTOS를 이용하여도 Timed Loop를 사용하지 않는다면 정시성을 보장하기 어렵습니다.

    

 3. Implementing Deterministic Processes

이전에 언급했듯이 대부분의 어플리케이션은 각각의 프로세스로 분류하여 개발 됩니다. 그리고 각 프로세스는 정시성을 보장해야 할 것과 그렇지 않아도 될 것으로 분류됩니다. 정시성을 보장해야 하는 프로세스는 항상 정확한 동작시간을 보장해야 합니다. 이런 정시성을 위해서는 해당 작업을 위한 충분한 리소스 확보도 필요합니다.

 일정한 주기에 데이터를 수집하고 이 데이터를 디스크에 저장하는 어플리케이션을 생각해봅시다. 데이터 수집은 반드시 정확한 타이밍에 정확한 양을 수집해야 합니다. 때문에 수집 태스크는 정시성을 보장할 수 있는 Timed Loop를 사용하는 것이 좋습니다. 하지만 데이터 저장의 경우 수집된 데이터의 손실만 없다면 언제 저장되어도 무방합니다. 또한 약간의 동작시간 오차는 허용할 수 있습니다. 그렇기 때문에 While Loop를 이용하는 것이 좋습니다. 아래 그림을 보면 정시성이 필요한 태스크와 그렇지 않은 태스크의 예를 볼 수 있습니다.

 

<그림 3 Deterministic / Nondeterministic 태스크의 예>

    

 Real-Time 어플리케이션을 구현하다 보면 하나 이상의 Deterministic 태스크를 구현해야 할 때가 있습니다. 이럴 경우에는 각 태스크 별로 우선순위를 정해야 합니다. LabVIEW Real-Time에서는 Timed-Loop와 VI 프로퍼티에서 우선순위를 지정할 수 있습니다. 하나씩 알아보겠습니다.

 

1. Timed Loop

Timed-Loop는 While Loop와 유사하나 정시성 보장을 위한 추가적인 기능이 있습니다. Timed Loop를 이용하면 Loop의 동작 주기와 우선순위를 설정할 수 있습니다. 우선순위가 높은 Timed-Loop는 블록 다이어그램 내의 다른 Timed-Loop에 비해 높은 우선순위를 가집니다. 이는 Timed-Loop의 설정에서 결정이 됩니다. 이와 같은 설정은 Timed-Loop좌측의 입력 노드를 더블클릭하면 나타나는 대화상자(설정창)에서 설정할 수 있습니다.

 

<그림 4 Timed-Loop의 설정 대화상자>

 

Timed-Loop의 동작 주기와 우선순위를 지정하려면 설정 대화상자의 Loop Timing Attributes >> Period, Priority를 설정해야 합니다. Period는 말 그대로 Loop 타이밍을 뜻하고 Priority는 우선순위를 의미합니다. 하나의 VI 내에 2개 이상의 Timed-Loop가 사용될 경우 이 Priority값이 큰 Timed-Loop가 보다 높은 우선순위를 가집니다.

Timed-Loop를 사용할 때 고려해야 할 것 중 하나는 바로 리소스 사용입니다. Real-Time 어플리케이션을 개발할 때 하나 이상의 태스크로 구성된 경우가 많습니다. 이런 경우 우선순위가 가장 높은 태스크(Timed-Loop)의 리소스 사용량이 100%에 육박하게 되면 CPU가 Sleep하는 타이밍이 나타나지 않기 때문에 다른 태스크가 동작하지 않습니다. 때문에 Timed-Loop 이 외의 태스크도 동작할 수 있도록 여유(Time Budget이라 표현함)를 두어야 합니다. (http://anisyw.tistory.com/entry/cRIO-2-Designing-a-cRIO-Software-Architecture의 1. 기본적인 cRIOdml 구조 >> Process를 참고하십시오) Real-Time 어플리케이션을 개발할 때는 CPU의 사용량이 80%를 넘지 않도록 Time Budget을 두시기 바랍니다. 이에 대한 내용은 LabVIEW Real-Time Help의 Avoid Jitter (Real-Time Module)을 참고하시기 바랍니다.


2. VI 프로퍼티

 Timed-Loop를 사용하는 것 만 아니라 VI 프로퍼티를 이용해서도 우선 순위를 정할 수 있습니다. 이 경우 정시성을 고려해야 하는 부분을 SubVI화 하여 해당 SubVI의 우선순위를 지정하는 것입니다. 하나의 어플리케이션에서 VI 프로퍼티를 이용한 우선순위 지정과 Timed-Loop를 이용한 우선순위 지정은 가급적 하지 마시기 바랍니다. 꼭 해야 하는 경우에는 반드시 각각에 대해 정확한 이해가 필요합니다. 만약 VI 프로퍼티를 이용하여 우선순위를 지정하려고 하는데 해당 VI에 Timed-Loop가 포함된 경우 VI 프로퍼티의 우선순위는 무시되며, Timed-Loop의 우선순위가 적용됩니다.


    <그림 5 VI 프로퍼티 대화상자>

 

VI 프로퍼티를 이용한 우선순위 설정은 대화상자의 카테고리 >> 실행 >> 우선순위에서 가능합니다. 총 6가지의 우선순위가 있으며, 일반 while loop는 normal Priority에 해당합니다. 그리고 Timed-Loop는 High Priority와 time critical Priority 사이 정도입니다. 즉, time critical priority로 설정된 vi는 Timed-loop 보다 높은 우선순위를 가지는 것입니다.

 

  이상으로 cRIO의 Top-Level VI와 Deterministic, Priority 설정에 대해 알아보았습니다. 다음 포스팅에서는 프로세스간 데이터 통신과 Real-Time 어플리케이션에 유용한 디자인 패턴에 대해 알아보겠습니다.

 

 

 

 

 

 

 


댓글