티스토리 뷰

랩뷰 초급 강의 - LabVIEW의 기다림 함수에 대해 알아보자.



LabVIEW는 데이터를 처리하고자 할때 다수의 While문을 사용하여 처리를 하게 됩니다. 많은 사람들이 LabVIEW로 구현을 할 때 While문 안에 기다림 함수를 넣지않아 CPU 과부하를 만드는데요. 이러한 경우 간단한 프로그램을 구현했음에도 불구하고 CPU의 점유율이 100%에 육박하는 현상을 발생시키게 됩니다.


이러한 현상이 발생하는 이유는 LabVIEW의 While문은 내부적으로 CPU에서 각각의 Thread로 처리가 되는데 While문에 기다림 함수가 없으면 CPU가 관련 Thread를 무한루프로 돌리기 때문에 CPU 입장에서는 처리해야 하는 일이 많아지기 때문입니다.


이러한 현상을 해결하기 위해서는 기다림 함수를 사용해야 합니다. LabVIEW에서 제공하는 기본적인 기다림 함수는 1) 기다림 함수와 2) 다음 ms배수까지 기다림 함수로 구분할 수 있습니다. 


그럼 이 2개의 함수에 대해서 간략히 살펴보도록 하겠습니다.


기다림 함수 : 지정된 ms를 기다리고 ms 타이머의 값을 반환합니다. 0의 값을 기다릴 ms입력에 연결하여 현재 스레드가 CPU의 컨트롤을 양도하도록 강제합니다. 이 함수는 비동기적으로 시스템을 호출하나, 노드 자체는 동기적으로 작동합니다. 그러므로, 이 함수는 지정된 시간이 지날때까지 실행을 완료하지 않습니다.


다음 ms배수까지 기다림  함수:  ms 타이머의 값이 지정된 ms 배수의 배수가 될 때까지 기다립니다. 이 함수를 사용하여 여러 작업을 동기화합니다. 루프 안에서 이 함수를 호출하여 루프 실행 속도를 조절할 수 있습니다. 그러나, 첫번째 루프 주기가 짧을 가능성이 있습니다. 0의 값을 ms 배수 입력에 연결하여 현재 스레드가 CPU의 컨트롤을 양도하도록 강제합니다.


위의 말을 종합해 보자면, 기다림 (ms) 함수를 사용하면, LabVIEW는 사용자가 지정한 시간만큼 기다립니다. 다음 ms 배수까지 기다림 함수를 사용하면, LabVIEW는 밀리초 카운터를 모니터하고, 카운터가 사용자가 지정한 수의 배수가 될 때까지 기다립니다 좀더 자세히 알아볼까요! 


1) 기다림 함수



While문에서 사용된 기다림 함수는 특정 알고리즘 수행 후 입력되는 ms동안 while문을 멈추게(Sleep)하는 역할을 합니다. 아래의 그림을 보면 좀더 명확히 파악이 가능합니다. 


알고리즘 처리시간을 130ms, 기다림에 설정한 시간을 50ms라고 가정을 한다면 while문이 한바퀴를 도는데 걸리는 시간은 총 130 + 50 = 180ms가 됩니다.



2) 다음 ms 배수까지 기다림 함수



While문에서 사용된 다음 ms배수까지 기다림 함수는 특정 알고리즘 수행에 대한 시간을 기다림 시간에 대딥된 ms의 n을 곱한 값중 수행 시간보다는 크지만 가장 가까운 n의 값을 찾아 While문이 돌아가는 시간 = 기다림 설정 시간 * n으로 적용하여 While문을 처리하게 됩니다. 아래의 그림을 살펴보겠습니다. 


알고리즘 처리시간과 ms배수 기다림 시간에 설정한 값은 위와 동일합니다. 위의 과정을 거쳐서 While문이 돌아가는 시간을 살펴본다면,


알고리즘 수행 시간 = 130

130 <= 50 * n(n은 가능한 수중 가장 작은 수)

n = 3


따라서, While문이 한바퀴 도는데 걸리는 시간은 150ms, 알고리즘 처리 시간을 제외한 실질적으로 loop가 쉬는 시간은 20ms로 처리됩니다. 



3) 코드로 확인해보는 기다림 함수



테스트를 위해서 간략히 코드를 짜보았습니다. 위의 코드는 하나의vi이면 Case 구문의 참과 거짓 안의 코드를 구분하기 위해서 두개의 사진을 올린것이니 참고하시기 바랍니다.


코드를 간략히 설명을 드리자면, For문 횟수를 받아와서 For문 횟수 * 1ms만큼 쉬는 코는 For문과 다음 ms배수의 불리언 버튼값에 의해서 참이면 다음 ms배수 만큼 쉬고, 거짓이면 기다림 함수에 적용된 ms만큼 쉬게 됩니다.


프로그램을 실행해 보았습니다.


For문 횟수를 250이라 가정을 하면 For문이 다 돌아서 종료되는 시간은 총 250ms 입니다. 따라서 위의 설명대로라면 기다림 함수를 적용시 350ms(= 250 + 100)를 쉬어야 하고, 다음 ms 배수 기다림 함수를 적용시 300ms(250 + 50)라는 결과가 나타나야 합니다.


하지만 실행결과를 보면 두 함수 모두 For문이 돌아가는 시간인 250ms로 나옵니다. 




그 이유는 무엇일까요? 저의 설명이 틀렸을까요? ㅜㅜ

아닙니다. LabVIEW는 일반적으로 모든 노드에 대한 알고리즘이 병렬적으로 처리가 되기 때문에 위의 코드 뒷부분에 적용된 두개의 기다림함수의 시간이 무시가 되어 버리는 것입니다. 


이 부분에 대한 해결책 향후에 올리도록 하겠습니다.


이글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.


댓글