아카데믹 회사 소개 행사 및 세미나 NI Developer Zone 기술 지원 솔루션 제품 및 서비스 문의 MyNI

문서 타입: 튜토리얼
NI 제공: 예
작성일: 2008. 5. 26


피드백


아니오

관련 카테고리

관련 링크 - Developer Zone

LabVIEW를 사용한 ARM 마이크로컨트롤러용 인터럽트 구동 프로그래밍

평가 0 건 | 5 중 0.00
언어 선택 | 인쇄

개요

본 튜토리얼은 인터럽트 구동 프로그래밍을 소개하며, ARM 마이크로컨트롤러용 NI LabVIEW Embedded Module을 사용하여 인터럽트를 관리하기 위한 단계를 설명합니다. 또한 어플리케이션 내에서 인터럽트를 사용할 때에 해결해야 할 설계 결정에 대해 다룹니다. 본 튜토리얼에서는 사용자가 LabVIEW 8.5, ARM 마이크로컨트롤러용 LabVIEW Embedded Module을 이미 설치하였으며, ARM 마이크로컨트롤러용 어플리케이션 구축 및 실행을 친숙히 다룰 수 있음을 전제로 합니다.

인터럽트와 인터럽트 핸들러 소개

인터럽트 구동 시스템에는 두 가지 컴포넌트인 인터럽트와 인터럽트 핸들러가 있습니다. 인터럽트는 이벤트 발생시에 현재 실행 프로그램 중단을 표시하기 위해 하드웨어가 생성한 신호입니다. 인터럽트 핸들러 (인터럽트 서비스 루틴)는 특정 인터럽트가 발생하였을 때, 프로세서가 실행하도록 등록된 코드의 부분을 의미합니다. 일단 프로세서가 인터럽트를 인지하도록 설정되면 현재 진행중인 과정을 중단하며, 시스템 상태를 저장하는 Context Switch를 실행하고, 인터럽트 핸들러를 실행합니다. 인터럽트 핸들러 코드가 실행을 완료하면 프로세서는 이전에 작동 중이었던 프로그램으로 컨트롤을 반환하게 됩니다.

인터럽트를 사용하면 정기적으로 데이터를 읽거나 쓸때에 유용합니다. 예를 들어, 디지털 음악 플레이어를 설계한다고 가정해봅니다. 시스템은 다음의 세 가지 요소로 구성될 것입니다. 즉, (1) 입력 (오디오 레벨과 필터를 조정하는 다양한 아날로그 다이얼), (2) 프로세서, 및 (3) 출력 (디지털-아날로그 변환기- DAC)입니다. 시스템은 다음과 같이 작동합니다. 프로세서가 다이얼의 값을 읽고 메모리로부터 오디오 파일을 스트리밍하고, 데이터에 필터링 알고리즘을 적용한 후, DAC에 값을 씁니다. 타이머 인터럽트를 사용하면 다이얼의 값을 정기적으로 읽을 수 있으므로 필터링 알고리즘의 파라미터를 결정할 수 있습니다. 두 번째 타이머 인터럽트는 DAC에 쓰도록 설정됩니다. 프로세서는 필터링 알고리즘을 사운드 파일에 계속적으로 적용하게 될 것이며, 레지스터를 쓰거나 읽기 위해서만 방해받게 됩니다.

인터럽트 관리

ARM 어플리케이션을 위한 인터럽트는 프로젝트의 빌드 스펙을 통해 처리됩니다. 빌드 스펙 프로퍼티 대화창을 통해 개발자들은 인터럽트 핸들러를 생성하고 지정하기 위한 두 가지 방법을 사용할 수 있습니다. 그 방법은 VI 사용 또는 타임드 루프 사용입니다. 두 가지 방법 모두 단일 프로젝트 내에서 사용되며, 어플리케이션 내에서 처리되도록 여러 개의 하드웨어 인터럽트를 허용합니다.

다음 섹션에서는 VI와 타임드 루프를 사용한 인터럽트 핸들러 생성 방법을 설명하겠습니다. 주어진 예제에서는 그림 1: ARM 인터럽트용 프로젝트 보기를 사용하여 상위 레벨의 VI와 빌드 스펙을 포함한 ARM 프로젝트를 설명하겠습니다.

그림 1: ARM 인터럽트용 프로젝트 보기

본 프로젝트에는 주요 어플리케이션을 생성하고 MCB2300 ARM 하드웨어를 타겟으로 하는 단일 VI가 포함됩니다. 어플리케이션은 Processor Status 창에 문자열을 프린트합니다. 그림 2: ARM 주요 어플리케이션 VI는 VI의 블록 다이어그램을 나타냅니다. 본 다이어그램에는 Processor Status 창에 문자열을 프린트하는 타임드 루프로 구성되어 있습니다.

그림 2: ARM 주요 어플리케이션 VI

VI를 인터럽트 핸들러로 사용

다음 단계에서는 인터럽트 핸들러가 될 새로운 VI 생성 방법에 대해 설명합니다.

1. 프로젝트 탐색기에서 ARM 타겟을 마우스 오른쪽 클릭하고 새로 만들기>>VI를 선택합니다. 프로젝트에 새로운 VI가 추가됩니다. 본 VI는 인터럽트 핸들러로 사용될 것입니다. 파일>>다른 이름으로 저장을 선택하여 파일을 저장합니다. 본 예제에서는 파일을 ISR1.vi로 저장합니다.

 2. 이제 인터럽트 처리를 위한 코드를 작성할 수 있습니다. 새로 생성된 VI의 블록 다이어그램을 열고, ARM 팔레트에서 Console Output.vi를 불러옵니다. 문자열 상수를 생성하면 이는 Processor Status 창에 디스플레이 됩니다.  본 VI는 코드가 실행되었음을 나타내는 콘솔에 프린트됩니다. 코드를 둘러싼 루프 구조가 없음을 확인합니다. 이는 타이머 인터럽트의 주기적인 속성을 나타내게 될 것입니다.

 3.  이제 인터럽트 핸들러 코드가 완성되었으므로, 핸들러는 이제 인터럽트에 지정되어야 합니다. 프로젝트 탐색기에서 빌드 스펙 아래의 어플리케이션을 마우스 오른쪽 클릭하고 프로퍼티를 선택합니다.

4. 그 후, 빌드 스펙 프로퍼티 창이 뜹니다.

5.  항목 아래에서 Manage Interrupts를 선택합니다. 본 예제에 사용되는 하드웨어는 세 가지 타이머 인터럽트를 제공합니다. Timer 1은 본 데모에 사용됩니다. 인터럽트 목록에서 Timer 1을 선택하고 체크박스 Use interrupt을 클릭합니다.

6.  Interrupt Handler 박스에서 VI 라디오 버튼을 선택합니다. 화살표를 사용하여 ISR1.vi를 선택하여 인터럽트 핸들러로 지정합니다. 프로젝트 내의 모든 VI는 Top-Level VI를 제외하고는 인터럽트 핸들러로 사용될 수 있습니다.

7.  본 예제를 위해, 시작 상태가 활성화될 것입니다. 선택적으로 인터럽트는 시작에서 비활성화될 수도 있으며, 어플리케이션에서 프로그램적으로 활성화될 수도 있습니다. 이에 관한 토픽은 본 튜토리얼의 후반에서 다루게 됩니다. 또한, Timer 1 인터럽트 주파수는 Configure 버튼 및 Timer Configuration 대화창을 사용하여 구성될 수 있습니다.

8.  확인 버튼을 클릭합니다. 인터럽트 핸들러 셋업이 이제 완성되었습니다. 프로젝트를 구축실행합니다. Processor Status 창은 아래의 이미지와 유사하게 나타납니다. 인터럽트 핸들러는 주기적으로 호출되어 주요 루프의 실행을 방해하고, 문자열을 Processor Status 창으로 출력합니다.

타임드 루프를 인터럽트 핸들러로 사용

다른 방법으로 타임드 루프를 인터럽트 핸들러로 사용하는 방법이 있습니다. 본 섹션에서는 인터럽트 핸들러로 작동하는 타임드 루프를 생성하는데 필요한 단계에 대해 설명하겠습니다. 여기서 다시 한번 그림 1과 그림 2가 어플리케이션의 기본으로 사용됩니다.

1. Main ARM Application.vi로 시작하여, 타임드 루프가 추가되고, 그 후에 인터럽트 핸들러로 사용되게 됩니다. Programming » Structures» Timed Loop 팔레트에서 Timed Loop을 선택합니다. VI 안에 두 번째 타임드 루프를 생성하면 Processor Status 창으로 출력하게 됩니다.

2. 타임드 루프는 외부 타이밍 소스에 응답하기 위해 구성되어야 합니다. 입력 노드를 마우스 오른쪽 클릭하여 입력 노드 설정을 선택합니다. 타이밍 소스 터미널 사용을 선택합니다.   

3.  이제, Programming » Timed Loop 팔레트에서 Create External Timing Source.vi를 사용합니다. 타이밍 소스 이름을 정하고 타임드 루프의 입력 노드로 연결합니다. 이는 인터럽트 핸들러로 사용될 타임드 루프 구조의 이름이 될 것입니다.

4. VI를 인터럽트 핸들러로 사용 섹션에서 살펴보았듯이 빌드 스펙 프로퍼티 창을 엽니다. 프로젝트 탐색기에서, 빌드 스펙 아래의 어플리케이션을 마우스 오른쪽 클릭하고, 프로퍼티를 선택합니다. 항목 아래에서 Manage Interrupts을 선택합니다. 본 예제에서는 Timer 2가 사용됩니다. 인터럽트 목록에서 Timer 2를 선택하고 체크박스 Use interrupt를 클릭합니다.

5.  Interrupt Handler 박스에서 Timed 루프 라디오 버튼을 선택합니다.

6. 이전에 지정되었던 Timed 루프의 이름을 입력합니다. (본 예제에서 “Interrupt Handler”) 추가적으로, 인터럽트의 Startup State 및 주파수가 구성됩니다.

  

 7.  확인 버튼을 클릭합니다. 타임드 루프는 이제 인터럽트를 처리할 수 있도록 구성되었습니다. 어플리케이션을 구축실행합니다. 여기서 다시 한번, 인터럽트 핸들러는 주기적으로 호출됩니다. 루프가 단일 반복을 완성하였다면 컨트롤이 프로세서로 보내집니다.

 

 인터럽트 핸들러인 VI와 타임드 루프 사용의 중요한 한가지 차이점은 타임드 루프 인터럽트 핸들러는 VI 인터럽트 핸들러가 방해할 수 있다는 점입니다. 이는 시스템에 인터럽트 핸들러가 두 개 또는 그 이상 존재할 때 발생할 수 있습니다. 타임드 루프 인터럽트 핸들러가 실행하고 VI 인터럽트 핸들러가 처리하는 인터럽트가 발생하였을 경우, 타임드 루프는 방해받게 됩니다.

타임드 루프 방식을 사용하면 단일 인터럽트만을 사용하는 어플리케이션에서 유익합니다. 즉, 여러 개의 VI를 개발하는 대신 주요 어플리케이션 로직으로 동일한 VI 내에서 타임드 루프를 가지게 됨으로써 코드가 더욱 단순화됩니다.

인터럽트 VI 팔레트 사용

 인터럽트 핸들러를 지정할 수 있는 기능 이외에도 LabVIEW는 ARM » Interrupts 팔레트에 위치한 다음의 VI를 통해 인터럽트를 프로그램적으로 활성화 및 비활성화할 수 있는 매커니즘을 제공합니다.

ARM 인터럽트 활성화는 기존에 비활성화된 인터럽트를 활성화할 때 사용합니다. 인터럽트는 프로그램적으로 비활성화될 수 있으며, 또는 인터럽트는 Manage Interrupts 창을 통해 시작시에 비활성화될 수도 있습니다. 본 VI는 인터럽트 숫자가 지정한 단일 인터럽트에서 작동합니다.   

ARM 인터럽트 비활성화는 인터럽트 숫자가 지정한 단일 인터럽트를 비활성화 할 때 사용됩니다.

ARM 글로벌 인터럽트 활성화는 프로그램적으로 비활성화 되었거나 또는 인터럽트 관리자 창을 통해 비활성화되었던 모든 인터럽트를 활성화합니다.

ARM 글로벌 인터럽트 비활성화는 시스템 내에서 모든 인터럽트를 비활성화합니다. 이는 시간이 매우 중대하며 절대로 외부의 이벤트에 대해 방해 받아서는 안되는 작업을 수행할 때에 유용합니다.

ARM 어플리케이션에서 인터럽트를 사용할 때 설계 고려사항

시스템의 각 인터럽트에는 프로그램적으로 지정될 수 없는 우선 순위가 있습니다. MCB2300 하드웨어의 경우, Timer 1은 가장 최고의 우선 순위이며, Timer 2는 두 번째의 우선 순위입니다. Timer 3는 사용가능한 인터럽트 중 가장 낮은 우선 순위를 가집니다. 2개 또는 그 이상의 인터럽트가 정확하게 동일한 시간에 일어난다면, 가장 높은 우선 순위의 인터럽트가 실행됩니다. 인터럽트를 처리하는 동안에 인터럽트 핸들러는 앞에서 언급한 인터럽트를 위한 타임드 루프를 사용하는 경우를 제외하고는 방해받을 수 없습니다. 다른 인터럽트 핸들러가 실행 중일 때에 발생한 인터럽트는 큐에 있게 됩니다. 그러나, 각 외부 트리거의 최종 인터럽트만이 작동하게 됩니다. 예를 들어, Timer 1을 위한 인터럽트 핸들러가 실행되는 동안에 Timer 2에 다섯 개의 인터럽트가 발생하였다면, Timer 2에 대한 다섯번째 인터럽트만이 Timer 1의 인터럽트 핸들러가 완료된 후에 처리됩니다.

어플리케이션을 설계할 때에 인터럽트를 잃을 수도 있다는 사실을 명심하는 것이 중요합니다. 프로그래머들이 인터럽트를 잃을 수 있는 확률을 최소화하기 위해 실행하는 두가지 보편적인 구조가 있습니다. 첫 번째 방식은 인터럽트 핸들러 내에서 소비한 시간을 제한하는 것입니다. 주요 어플리케이션이 프로세서 집약적인 연산을 수행하는 동안에 변수에 읽거나 쓰기에만 사용을 한정합니다. 또 다른 방법으로는 인터럽트 핸들러 내에서 단일 인터럽트를 사용하고 프로세서 집약적인 연산을 사용하기 위해 소프트웨어를 구축하는 것입니다. 주요 어플리케이션은 그 후 인터럽트가 생성될때까지 대기하게 됩니다. 본 아키텍처는 원하는 기능이 각 인터럽트의 데이터에서 주기적으로 작동하도록 할 때 사용됩니다. 본 아키텍처에서 프로그래머들은 인터럽트를 잃지 않기 위해서 인터럽트의 기간보다 인터럽트 핸들러 실행 시간이 더욱 짧은지를 확인해야 합니다.

평가 0 건 | 5 중 0.00
언어 선택 | 인쇄

법적 정보
"이 튜토리얼 (이 ""튜토리얼"")은 내쇼날인스트루먼트 (""NI"")가 개발한 것 입니다. 이 튜토리얼에 대한 내쇼날인스트루먼트의 기술 지원이 가능하더라도, 이 튜토리얼의 내용은 완전하게 테스트 및 검증되지 않을 수 있으며, NI는 어떠한 방식으로도 품질 또는 관련 제품 및 드라이버의 새로운 버전에 따른 컨텐츠의 지속적인 지원을 보장하지 않습니다. 이 튜토리얼은 어떠한 종류의 보증 및 NI.COM의 이용 약관에 명시된 특정한 제약 규정에 대한 전제 없이 있는 그대로 제공됩니다. (http://ni.com/legal/termsofuse/unitedstates/us/)