Atmel AVR Studio에서 AVR 컨트롤러를 인터럽트합니다. 인터럽트 - AVR 공부 - 기사 카탈로그 - 마이크로컨트롤러 - 쉽습니다! 마이크로컨트롤러 인터럽트를 프로그래밍할 환경

인터럽트 시스템은 모든 제어 시스템의 중요한 부분입니다.

마이크로프로세서 시스템이 기능을 얼마나 효율적으로 수행하는지는 주로 작동에 따라 달라집니다. MK-51 인터럽트 시스템의 일반적인 구조는 그림 1에 나와 있다. 14.3.

MK-51 제품군의 마이크로컨트롤러는 5가지 인터럽트 소스를 지원합니다.

* 입력 INT0 및 INT1(포트 라인 P3: 각각 P3.2 및 P3.3)을 통해 도착하는 두 개의 외부 인터럽트;

* 타이머/카운터 T/C0 및 T/C1에서 두 번의 중단;

* 직렬 포트 인터럽트.

인터럽트 요청은 마이크로컨트롤러의 특수 기능 레지스터에 기록됩니다. INT0, INT1, T/C0 및 T/C1의 플래그 IE0, IE1, TF0, TF1 인터럽트 요청은 TCON 제어 레지스터(표 14.4)에 포함되어 있고 플래그 RI TI는 직렬 포트에서 인터럽트를 요청합니다. 직렬 포트를 제어하기 위한 SCON 레지스터에 있습니다.

표 14.4. TCON 레지스터 형식

0 IT0 인터럽트 유형 설정 INT0

1 IE0 인터럽트 요청 플래그 INT0

2 IT1 인터럽트 유형 설정 INT1

3 IE1 인터럽트 요청 플래그 INT1

4 TR0 타이머/카운터 활성화 0

5 TF0 오버플로 플래그(인터럽트 요청) 타이머/카운터 0

6 TR1 타이머/카운터 1 활성화

7 TF1 타이머/카운터 1의 오버플로 플래그(인터럽트 요청)

플래그 TF0 및 TF1은 해당 타이머/카운터가 오버플로될 때(더 정확하게는 T/Cx가 "모두 1" 상태에서 "모두 0" 상태로 전환될 때) 하드웨어에 의해 설정됩니다.

플래그 IE0 및 IE1은 각각 외부 인터럽트 IT0 및 IT1의 하드웨어에 의해 설정됩니다. 외부 요청으로 인해 해당 입력의 신호 레벨이 낮을 때 또는 이 신호가 높은 레벨에서 낮은 레벨로 전환될 때(주파수가 MK의 외부 클록 주파수의 절반을 초과하지 않는 경우) 플래그가 설정될 수 있습니다.

요청 유형은 TCON 제어 레지스터의 IT0 및 IT1 비트를 설정하는 소프트웨어로 구성됩니다. ITx = 0으로 설정하면 인터럽트 시스템이 낮은 신호 레벨을 요청하도록 구성되고, ITx = 1 - 인터럽트가 낮은 신호 레벨을 요청하도록 설정됩니다.

TI 및 RI 플래그는 각각 전송 종료 후 또는 수신 종료 후에 직렬 인터페이스 하드웨어에 의해 설정됩니다.

지정된 모든 인터럽트 요청 플래그는 프로그래밍 방식으로 설정 및 재설정에 사용할 수 있습니다. 소프트웨어에서 인터럽트 요청 플래그를 설정하면 하드웨어에서 동일한 플래그를 설정하는 것과 동일한 마이크로컨트롤러의 응답이 발생합니다.

플래그 TF0 및 TF1은 제어가 해당 인터럽트 루틴으로 전송될 때 하드웨어에 의해 재설정됩니다.

IEx 플래그 재설정은 인터럽트가 INTx 신호의 하강을 감지하도록 구성된 경우에만 인터럽트를 서비스할 때 하드웨어에서 수행됩니다. 요청 신호의 레벨을 감지하도록 인터럽트가 구성된 경우 IEx 플래그 재설정은 요청을 제거하기 위해 인터럽트 소스에 작용하는 인터럽트 서비스 프로그램에 의해 수행되어야 합니다.

TI 및 RI 플래그는 소프트웨어로만 재설정할 수 있습니다.

각 유형의 인터럽트는 IE 인터럽트 활성화 레지스터의 해당 비트를 설정하거나 삭제하여 개별적으로 활성화 또는 비활성화됩니다. 이 레지스터에는 모든 인터럽트에 대한 일반 비활성화 비트도 포함되어 있습니다. IE 레지스터의 형식은 표에 나와 있습니다. 14.5.

표 14.5. IE 레지스터 비트 할당

위치 등록

비트 니모닉

기능

모든 소스로부터의 방해 금지

사용되지 않음

사용되지 않음

인터럽트 비활성화 직렬 포트

T/C1 타이머/카운터 인터럽트 비활성화

인터럽트 비활성화 외부 소스 INT1

타이머/카운터 인터럽트 비활성화 T/C0

외부 소스 INT0의 인터럽트 비활성화

각 인터럽트 유형에는 프로그래밍 방식으로 두 가지 우선 순위(0 - 최저 또는 1 - 최고) 중 하나를 할당할 수 있습니다.

우선순위는 IP 인터럽트 우선순위 레지스터에서 해당 비트를 설정하거나 삭제하여 구성됩니다. 이 레지스터의 형식은 표에 나와 있습니다. 14.6.

우선순위가 다른 소스로부터 동시에 인터럽트 요청이 수신되면 우선순위가 더 높은 소스의 요청이 먼저 처리됩니다.

동일한 우선순위를 가진 여러 인터럽트 요청을 동시에 수신하는 경우 처리 순서는 마이크로컨트롤러 하드웨어에 의해 결정되며 소프트웨어로 변경할 수 없습니다. 이 순서는 다음과 같은 폴링 인터럽트 요청 플래그의 순서에 해당합니다.

IT0 -> TF0 -> IT1 -> TF1 -> (RI, TI)

표 14.6. IP 레지스터 비트 할당

레지스터 위치 비트 니모닉 기능

7 - 사용되지 않음

6 - 사용되지 않음

5 - 사용되지 않음

4 PS 직렬 포트 인터럽트 우선순위

3 PT1 타이머/카운터 인터럽트 우선순위 T/C1

2 PX1 외부 소스로부터의 인터럽트 우선순위 INT1

1 PT0 타이머/카운터 인터럽트 우선순위 T/C0

0 PX0 외부 소스로부터의 인터럽트 우선순위 INT0

하드웨어로 구현된 인터럽트 핸들러 호출은 다음 작업으로 구성됩니다.

* 프로그램 카운터의 값을 스택에 저장합니다.

각 인터럽트 소스에 대한 인터럽트 핸들러 진입점은 하드웨어에 고정되어 있습니다. 그 값은 표에 나와 있습니다. 14.7.

표 14.7. 인터럽트 핸들러의 진입점 주소

인터럽트 소스

인터럽트 핸들러의 진입점 주소

외부 인터럽트( 이토)

타이머 카운터(TFO)

외부 인터럽트(IT1)

타이머 카운터(TF1)

직렬 포트(R1 또는 T1)

인터럽트 핸들러의 첫 번째 명령은 지정된 주소에 위치해야 합니다. 원칙적으로 이러한 명령은 프로그램 내에서 실제 핸들러가 위치한 곳으로 무조건 점프하는 명령이다.

인터럽트 처리 루틴으로 전환하면 IE 레지스터의 상태에 관계없이 자동으로 서비스되는 인터럽트의 우선순위 레벨과 동일한 우선순위 레벨을 갖는 모든 인터럽트가 비활성화됩니다. 즉, 동일한 우선순위 레벨을 가진 중첩된 인터럽트가 비활성화됩니다. . 따라서 낮은 우선순위 인터럽트(IP 레지스터의 해당 비트에 "0"이 있음)는 높은 우선순위 인터럽트(IP 레지스터의 해당 비트에 "1"이 있음)에 의해 중단될 수 있지만 우선순위가 낮은 것. 높은 우선순위 인터럽트 서비스는 다른 소스에 의해 중단될 수 없습니다.

인터럽트 핸들러로부터의 복귀는 인터럽트 핸들러가 호출될 때 거기에 저장된 PC 프로그램 카운터의 값과 인터럽트 우선순위 논리를 스택에서 복원하는 RETI 명령을 사용하여 수행됩니다.


중단에 대해 이야기합시다.인터럽트라는 단어는 그 자체로 의미가 있으며 추가 작업을 수행하기 위해 프로세스가 잠시 중지됩니다. 인터럽트는 외부일 수도 있고 내부일 수도 있습니다. 제 친구에게서 들은 간단한 예를 들어보겠습니다.

그는 부엌에서 설거지를 할 준비를 하고 설거지를 시작하며 소매를 걷어붙였습니다... 하지만 설거지에 기름기가 많았고 주방 선반 중 하나에서 기름진 설거지용 세제를 찾기 위해 잠시 멈춰야 했습니다. 그 후 그는 다시 일을 계속했습니다. 그런데 어느 순간 전화벨이 울렸고 그는 다시 일을 멈추고 전화를 받았고 시어머니가 전화를 해서 자기가 방문할 예정이라고 해서 식료품을 사러 가게에 먼저 가야 한다고 했습니다. 도착했다. 나는 가게에 갔다가 그 후에야 설거지를했습니다.

이 예는 두 가지 유형의 중단을 보여줍니다. 첫 번째는 주요 작업 실행(기름기가 많은 접시용 세제 검색)과 관련되어 있으며, 두 번째는 중단입니다. 전화– 외부 중단.
마이크로 컨트롤러에서는 다른 소스에서 들어오는 신호로 인해 외부 인터럽트가 발생하고, 마이크로 컨트롤러 자체에 내장된 장치로 인해 내부 인터럽트가 발생합니다. 방해가 왜 그렇게 매력적일까요?
첫 번째는 다른 기능을 수행하기 위해 기본 프로세스를 중지한 다음 이 프로세스를 계속할 수 있다는 것입니다.
두 번째, 아마도 많은 경우 주요 기능은 내부로 인해 모든 기능을 수행하는 프로세스를 가속화하는 것으로 간주됩니다. 추가 장치. 우리의 예로 돌아가 보겠습니다. 아내가 이미 집에 도착했을 때 내 친구가 설거지를 시작했다고 가정해 보겠습니다. 기름진 접시를보고 그는 그녀에게 식기 세척액을 찾아달라고 요청하고 그가 씻는 동안 그녀는 이미 그에게이 액체를 가져올 것입니다. 그런데 전화벨이 울렸고, 아내가 전화를 받아 어머니와 통화한 뒤 가게로 갔습니다. 함께하면 모든 것이 매우 빠르게 완료되었습니다!
그리고 막히는 것이 훨씬 더 쉽습니다. 메인 프로그램이 없습니다.
내 친구는 소파에 앉아 아무것도 하지 않고 있는데, 가정부는 더러운 접시를 보고 그에게 그것에 대해 이야기하고 허락을 받고 씻기 시작합니다. 전화벨이 울리면 아내에게 전화를 받으라고 하고, 아내는 통화 중이고, 대화는 식료품점으로 가는데... 뷰티! 이 경우 여러 I/O 장치가 마이크로 컨트롤러에서 동시에 작동하고(현대 마이크로 컨트롤러에는 상당히 많을 수 있음) 전체 프로세서 성능이 여러 번 향상되지만 장치의 인터럽트는 순차적으로 처리됩니다(동시가 아님). ), 우선순위에 따라(이 예에서는 아내가 가정부보다 우선순위가 높습니다).

여러 레지스터가 인터럽트 관리를 담당합니다.
SREG – 상태 레지스터(주). 입출력 장치의 표를 살펴보겠습니다. SREG 레지스터의 일곱 번째 비트는 다음과 같습니다. I(인터럽트) 플래그는 전역 인터럽트 활성화 플래그라고 합니다.플래그가 생략되면(7번째 비트가 0임) 모든 인터럽트가 비활성화됩니다. 플래그가 올라가면(I를 1로 설정) 인터럽트를 활성화합니다.

I 플래그는 다음 명령으로 설정 및 재설정됩니다.
SEI - 인터럽트 활성화
CLI - 인터럽트 비활성화
작동할 인터럽트는 다음과 같은 레지스터를 사용하여 설정됩니다. 인터럽트 마스크.
인터럽트 마스크는 다음과 같이 지정됩니다.
TIMSK,..,..,.. – 타이머 및 기타 내장 장치의 인터럽트 관리.
GIMSK(메가 제품군의 GIKR) - 모든 외부 인터럽트 관리.
인터럽트 마스크는 인터럽트 플래그에 따라 달라집니다.
각각 TIFR 및 GIFR(전역 인터럽트 활성화 플래그와 혼동하지 마십시오).

인터럽트 실행 순서:
마이크로컨트롤러가 켜지면 모든 인터럽트 플래그는 0으로 재설정됩니다. 인터럽트를 활성화하려면 프로그램은 SREG 레지스터의 플래그 I을 1로 설정해야 합니다. 그런 다음 로컬 인터럽트 세트(필요한 인터럽트)로 마스크 레지스터를 등록합니다. .
인터럽트 요청(신호)이 도착하면 인터럽트 플래그를 발생시킵니다(인터럽트가 비활성화된 경우에도 중첩된 인터럽트와 서로 다른 인터럽트 간의 우선 순위를 구성하기 위해). 인터럽트가 비활성화되지 않은 경우 컨트롤러는 적절한 담당자에게 연락합니다. (인터럽트 벡터) - 인터럽트 벡터, 현재 프로그램을 일시 중지합니다.
인터럽트 벡터인터럽트가 발생할 때 프로그램이 진행되는 프로그램 영역의 고정 라인입니다.
인터럽트 벡터의 전체 목록을 호출합니다. 인터럽트 벡터 테이블, 위치한 프로그램 코드의 시작 부분에.
따라서 인터럽트 벡터에 접근하는 순간 SREG 레지스터의 I 플래그와 인터럽트를 발생시킨 플래그는 0으로 리셋되어 다른 인터럽트는 비활성화된다. 인터럽트가 실행되는 동안 다른 인터럽트 요청이 발생하면 해당 인터럽트에 대한 플래그가 계속 발생합니다. 현재 인터럽트가 완료되면 SREG 레지스터의 I 플래그가 올라가서 다음 인터럽트를 실행할 수 있습니다. 여러 요청이 도착하고 해당 플래그가 발생하면 테이블의 주소에서 벡터가 더 작은 인터럽트(메모리 시작 부분에 더 가깝습니다)가 먼저 실행됩니다. 두 번째가 이어집니다. 또한, 프로그래머는 인터럽트 프로그램 실행 중에 다른 인터럽트가 발생할 경우 소위 중첩된 인터럽트를 구성할 수 있습니다. 그런 다음 현재 인터럽트의 실행이 중지되고 새로운 인터럽트가 실행된 후 중지된 인터럽트의 실행이 재개됩니다.

예를 들어, ATtiny2313에 대한 인터럽트 벡터 표는 다음과 같습니다.

Atmega16의 인터럽트 벡터 테이블은 다음과 같습니다.

비교해 보면 테이블이 전혀 일치하지 않습니다.
ATtiny 제품군에서 인터럽트 벡터 라인은 16비트를 차지하고 Mega 제품군에서는 32비트를 차지합니다. (인터럽트 벡터의 주소에 주의하세요. 프로그램 영역의 주소 라인은 16비트로 표시됩니다. -비트 단어).

ATtiny2313의 프로그램 코드는 다음과 같습니다.
.cseg .org 0 rjmp 재설정 rjmp INT_0 rjmp INT_1 rjmp Timer1_capt1 rjmp Timer1_comp1 rjmp Timer1_OVF1 rjmp Timer0_OVF0 rjmp UART_RX rjmp UART_UDRE rjmp UART_TX rjmp ANA_COMP rjmp PCINT rjmp Timer1_compB rjmp Timer0_comp A rjmp Timer0_compB rjmp USI_START rjmp USI_OVERFLOW rjmp EE_READY rjmp WDT_ OVERFLOW

보시다시피, 인터럽트 벡터는 인터럽트 프로그램 라벨에 대한 상대적 점프를 생성합니다. 아래 표에는 옵션이 나와 있습니다. 1. 방해가 없는 경우 2, 3. 입력 INT_1에 외부 인터럽트가 있습니다.
레이블이 "비어 있는" 경우(레이블 아래에 프로그램이 없음) 아무 일도 일어나지 않으며 프로그램은 나머지 레이블을 순차적으로 "실행"하여 안전하게 명령에 도달합니다. RETI - 인터럽트 복귀 - 인터럽트 핸들러에서 빠져나옴표의 첫 번째 열에 표시된 대로

예를 들어 INT_1 입력에서 인터럽트 프로그램을 실행하려면 목록에서 INT_1: 라벨을 제거해야 합니다. 이는 표의 두 번째 열에 개략적으로 표시되어 있습니다.
그러나 프로그래머가 매번 모든 인터럽트를 작성하고 이에 대한 별도의 레이블을 작성하는 것은 불편하며, 특히 테이블이 상당히 큰 최신 모델에서는 더욱 그렇습니다. 인터럽트는 사용되지 않습니다. 그러면 프로그램은 표의 세 번째 열에 표시된 대로 표시됩니다.

AVR 컨트롤러는 모델에 따라 1~8개의 입력을 가질 수 있습니다. 외부 인터럽트.
외부 인터럽트 관리 시스템을 생각해 보자. 이를 위해 모델에 따라 다음과 같은 I/O 레지스터 조합이 제공됩니다(해당 데이터시트 참조).
- GIMSK, EIFR, PCMSK, MCUCR;
- GIKR, GIFR, MCUCR;
- EIMSK, EICR, EIFR;
GIMSK, GIKR, EIMSK - 인터럽트 마스크,
EIFR, PCMSK, GIFR, EIFR – 인터럽트 플래그
허가 또는 금지의 경우 외부 인터럽트제어 레지스터는 다음과 같습니다: GIMSK-(일반 인터럽트 마스크 레지스터)(Tiny), GICR-(일반 인터럽트 제어 레지스터)(Mega), MCUCR – (MCU 제어 레지스터)




EIFR- 외부 인터럽트 플래그 레지스터: 1 - 활성화, 0 - 비활성화. 각 비트(플래그)는 해당 핀이 인터럽트 소스로 작동하도록 허용합니다.

GIMSK 레지스터 제어 비트:
비트 7 – INT1: 외부 인터럽트 요청 1 활성화 – INT1 인터럽트 활성화 비트: 1 – 활성화, 0 – 비활성화. INT1 핀이 출력으로 구성되어 있어도 인터럽트가 생성됩니다. INT1 비트는 EIFR 플래그 레지스터에서 인터럽트로 설정됩니다. INT1 핀은 클록 생성기와 동기화됩니다.

비트 6 – INT0: 외부 인터럽트 요청 0 활성화 - 인터럽트 활성화 비트 INT0: 1 – 활성화, 0 – 비활성화. INT0 핀이 출력으로 구성되어 있어도 인터럽트가 생성됩니다. INT0 비트는 EIFR 플래그 레지스터에서 인터럽트로 설정됩니다. INT10 핀은 클록 생성기와 동기화됩니다.

비트 5 - PCIE: 핀 변경 인터럽트 활성화 – PCINT0…7 핀의 인터럽트 활성화 비트: 1 – 활성화, 0 – 비활성화. PCINT0...7 핀 중 하나를 변경하면 인터럽트가 발생합니다. 핀 PCINT0...7은 PCMSK 플래그 레지스터의 비트를 통해 개별적으로 중단되도록 구성됩니다.

PCMSK- 핀 변경 마스크 레지스터 - 플래그 레지스터 PCMSK: 1 - 허용됨, 0 - 비활성화됨. 각 비트(플래그)는 해당 핀이 인터럽트 소스로 작동하도록 허용합니다. PCINT0...7 핀은 클럭 생성기와 동기화되지 않습니다. 핀 중 하나에 변경이 발생하면 인터럽트가 발생합니다.

메가8

그리고 해당 플래그 레지스터


비트 7

비트 6 – INT0: 외부 인터럽트 요청 0 활성화 - 인터럽트 활성화 비트 INT0: 1 – 활성화, 0 – 비활성화. INT0 핀이 출력으로 구성되어 있어도 인터럽트가 생성됩니다. INT0 비트는 GIFR 플래그 레지스터에서 인터럽트로 설정됩니다.



GIFR – 일반 인터럽트 플래그 레지스터: 1 – 활성화, 0 – 비활성화. 각 비트(플래그)는 해당 핀이 인터럽트 소스로 작동하도록 허용합니다.

GICR 레지스터 제어 비트:
비트 7– : 외부 인터럽트 요청 1 활성화 – 인터럽트 활성화 비트 INT1: 1 - 허용됨, 0 - 금지됨. INT1 핀이 출력으로 구성되어 있어도 인터럽트가 생성됩니다. INT1 비트는 GIFR 플래그 레지스터에서 인터럽트로 설정됩니다.

비트 6 – INT0: 외부 인터럽트 요청 0 활성화 - 인터럽트 활성화 비트 INT0: 1 - 허용됨, 0 - 금지됨. INT0 핀이 출력으로 구성되어 있어도 인터럽트가 생성됩니다. INT0 비트는 GIFR 플래그 레지스터에서 인터럽트로 설정됩니다.

비트 5 – INT2: 외부 인터럽트 요청 2 활성화 - 인터럽트 활성화 비트 INT2: 1 - 허용됨, 0 - 금지됨. INT2 핀이 출력으로 구성되어 있어도 인터럽트가 생성됩니다. INT2 비트는 GIFR 플래그 레지스터에서 인터럽트로 설정됩니다.

모든 컨트롤러의 INT0 및 INT1 입력 기능은 MCUCR 레지스터의 하위 비트에 의해 제어됩니다.

MCUCR – MCU 제어 레지스터
제어 비트:
비트 1, 0 - ISC01, ISC00(인터럽트 감지 제어 0 비트 1 및 비트 0) - 이 비트의 상태는 INT0 인터럽트를 생성하는 INT0 핀의 이벤트를 결정합니다.
ISC01=0, ISC00=0 – 논리적 0 수준;
ISC01=0, ISC00=1 – 논리적 상태의 모든 변경;
ISC01=1, ISC00=0 – 하강 에지에서;
ISC01=1, ISC00=1 – 상승 에지에서.

비트 3, 2 - ISC11, ISC10(인터럽트 감지 제어 1 비트 1 및 비트 0) - 이 비트의 상태는 INT1 인터럽트를 생성하는 INT1 핀의 신호 레벨을 결정합니다.
ISC11=0, ISC10=0 – 논리적 0 레벨;
ISC11=0, ISC10=1 – 논리적 상태의 모든 변경;
ISC11=1, ISC10=0 – 하강 에지에서;
ISC11=1, ISC10=1 – 상승 에지.

뭐, 외부 방해에 대해서는 최소한으로 얘기한 것 같군요.
인터럽트가 작동하려면 이에 따라 인터럽트를 등록해야 한다는 것은 분명합니다.
신호의 상승 에지에서 아주 작게 시작된 INT1의 인터럽트 초기화를 추가해 보겠습니다.

Ldi r16.0x80 ; r16에 숫자 0b10000000 ldi r17.0x0C 를 씁니다. r17에 숫자 0b00001100을 MCUCR,r17에 씁니다. 인터럽트는 상승 에지에서 생성됩니다. ISC11=1, ISC10=1 out GIMSK,r16 ; 마스크를 INT0 sei로 설정하세요
그건 그렇고,tiny2313에서 인터럽트를 생성할 수 있습니다. 모든 PCINT0…7 핀에서, Mega 최대 시리즈 48에서는 이러한 기능을 사용할 수 없습니다...
프로그램 충돌을 일으킬 수 있는 인터럽트가 발생할 수 있는 작업이 있습니다. 이러한 경우 작업을 시작하기 전에 CLI를 작성하고 SEI 후에 작성합니다. 이러한 작업을 다음과 같이 부릅니다. 원자.
인터럽트의 목적은 이벤트를 포착하는 것이기 때문에 인터럽트 프로그램은 간결하고 최대 속도로 실행되는 것이 바람직합니다. 에 따르면 여러가지 이유프로그램이 느리게 실행되므로 이벤트를 기록하고 조금 나중에 처리하는 것으로 충분합니다.

제시된 자료를 불필요한 정보로 복잡하게 만들지 않기 위해 독자들은 데이터시트를 사용하고 모든 것이 명확하지 않은 경우 포럼에 더 자주 질문하는 것이 좋습니다.
다음으로 내장 타이머를 기반으로 한 내부 인터럽트에 대해 자세히 살펴보겠습니다. 독자. 투표에 참여하려면 사용자 이름과 비밀번호를 사용하여 사이트에 등록하고 로그인하세요.

ATmega8 마이크로컨트롤러의 장점 중 하나는 광범위한 인터럽트입니다.

방해하다메인 프로그램의 실행이 일시 중단되고 특정 유형의 인터럽트를 처리하는 함수가 호출되는 이벤트입니다.

인터럽트는 내부 인터럽트와 외부 인터럽트로 구분됩니다. 내부 인터럽트 소스에는 내장된 마이크로컨트롤러 모듈(타이머, USART 트랜시버 등)이 포함됩니다. 외부 신호가 마이크로컨트롤러 핀에 도착하면 외부 인터럽트가 발생합니다(예: RESET 및 INT 핀의 신호). 인터럽트 발생으로 이어지는 신호의 특성은 제어 레지스터에 설정됩니다. MCUCR, 특히 입력 INT 0에 대한 ISC00(비트 0) 및 ISC01(비트 1) 비트에서; INT1 입력의 경우 ISC10(비트2) 및 ISC11(비트3)입니다.

ATmega8 마이크로컨트롤러에서는 각 인터럽트마다 고유한 속성이 있습니다. 인터럽트 벡터(지정된 인터럽트 루틴으로 점프하는 명령이 저장되는 프로그램 메모리 영역의 시작 부분에 있는 주소) Mega8에서는 모든 인터럽트의 우선순위가 동일합니다. 여러 개의 인터럽트가 동시에 발생하는 경우 벡터 번호가 낮은 인터럽트가 먼저 처리됩니다.

Atmega8의 인터럽트 벡터

주소 인터럽트 소스 설명
0x0000 초기화 신호 재설정
0x0001 INT0 INT0 입력에서 외부 인터럽트 요청
0x0002 INT1 INT1 입력에서 외부 인터럽트 요청
0x0003 T/C1 타이머 캡쳐 T/C1
0x0004 T/C1 T/C1 일치 타이머 비교 레지스터 A 일치
0x0005 T/C1 타이머 T/C1의 비교 레지스터 B와 일치
0x0006 T/C1 T/C1 카운터 오버플로
0x0007 T/C0 T/C0 카운터 오버플로
0x0008 SPI SPI 데이터 전송 완료
0x0009 UART UART 트랜시버가 데이터 수신을 완료했습니다.
0x000A UART UART 데이터 레지스터가 비어 있습니다.
0x000B UART UART 트랜시버를 통한 데이터 전송이 완료되었습니다.
0x000C ANA_COMP 아날로그 비교기의 인터럽트

인터럽트 관리

ATmega8에서는 4개의 레지스터가 인터럽트 관리를 담당합니다.

김스크(일명 GICR) - 입력 INT0, INT1의 신호를 기반으로 인터럽트를 금지/활성화합니다.

GIFR- 모든 외부 인터럽트 관리

팀스크, TIFR- 타이머/카운터의 중단 관리

등록하다 김스크(GICR)

INTFx=1: INTx 입력에서 인터럽트가 발생했습니다. 인터럽트 처리 루틴에 진입하면 INTFx는 자동으로 로그 상태로 재설정됩니다. 0

등록하다 팀스크

7 6 5 4 3 2 1 0
TOIE1
OCIE1A
OCIE1B
-
티시
-
TOIE0
-

TOIE1=1: T/C1 오버플로 인터럽트 활성화됨

OCIE1A=1: 비교 레지스터 A가 활성화된 카운터 T/C1의 내용과 일치할 때 인터럽트

OCIE1B=1: 비교 레지스터 B가 활성화된 카운터 T/C1의 내용과 일치할 때 중단됩니다.

티시=1: 캡처 조건이 충족되면 인터럽트가 활성화됩니다.

TOIE0=1: T/C0 오버플로 인터럽트 활성화됨

등록하다 TIFR

7 6 5 4 3 2 1 0
TOV1
OCF1A
OCF1B
-
ICF1
-
TOV0
-

TOV1=1: T/C1 오버플로 발생

OCF1A=1: 비교 레지스터 A가 카운터 T/C1의 내용과 일치하는 것이 허용됩니다.

OCF1B=1: 비교 레지스터 B는 허용된 카운터 T/C1의 내용과 일치합니다.

ICF=1: 캡쳐 조건 충족

TOV0=1: T/C0 오버플로 발생

인터럽트 처리 서브루틴에 진입하면 해당 인터럽트에 해당하는 TIFR 레지스터 플래그가 자동으로 로그 상태로 재설정됩니다. 0

인터럽트는 SREG 상태 레지스터(비트 7 = 1)에서 일반 인터럽트가 활성화된 경우에만 작동합니다. 인터럽트가 발생하면 이 비트는 자동으로 0으로 재설정되어 후속 인터럽트가 비활성화됩니다.

이 예에서는 INT0 핀이 풀업 입력 모드에서 활성화됩니다. 버튼을 사용하여 핀을 접지로 단락시키면 로직 0이 설정되고(신호의 에지가 공급 전압에서 0으로 떨어짐) 인터럽트 핸들러가 트리거되어 포트의 제로 핀에 연결된 전구가 켜집니다. 비

무효 램프ON()
{
포트B.0=1;
DDRB.0=1;
}

인터럽트 무효 ext_int0_isr(void)
{
램프 ON();
}

DDRD.2=0;
포트D.2=1;

SREG|= (1 동안(1) (

위의 예에서는 Code Vision AVR(인터럽트 void ext_int0_isr(void))에서 인터럽트 벡터를 설정하는 방법도 보여줍니다. 인터럽트 벡터는 다른 경우에도 유사하게 설정됩니다.

EXT_INT0 2
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC 11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
트와이 18
SPM_준비 19

부분 AVR 마이크로컨트롤러다수의 주변 장치(ADC, 타이머/카운터, EXTI, 아날로그 비교기, EEPROM, USART, SPI, I2C 등)가 포함되며, 각 장치는 데이터/신호 및 기타 정보에 대해 특정 작업을 수행할 수 있습니다. 이러한 장치는 AVR 마이크로컨트롤러를 기반으로 하는 모든 종류의 장치를 개발할 때 애플리케이션 효율성을 향상하고 비용을 절감하기 위해 마이크로컨트롤러에 통합됩니다.

프로세서는 데이터 메모리에 있는 I/O 레지스터를 통해 주변 장치와 통신/제어하여 일반 변수처럼 사용할 수 있습니다. 각 장치에는 자체 I/O 레지스터가 있습니다.

모든 I/O 레지스터는 데이터 레지스터, 제어 레지스터, 상태 레지스터의 세 그룹으로 나눌 수 있습니다.

제어 레지스터를 사용하여 장치는 특정 주파수, 정확도 등으로 하나의 모드에서 작동하도록 구성되고 데이터 레지스터를 사용하여 작업 결과를 읽습니다. 이 장치의(아날로그에서 디지털로의 변환, 수신된 데이터, 타이머/카운터 값 등). 여기에는 복잡한 것이 없는 것 같습니다(실제로 여기에는 복잡한 것이 없습니다 :)). 장치를 켜고 원하는 작동 모드를 표시한 다음 남은 것은 쿠폰을 자르고 기성 데이터를 읽는 것뿐입니다. 계산에 사용하세요. 모든 주변 장치는 마이크로컨트롤러 코어와 병렬로, 심지어는 다른 주파수에서도 작동하기 때문에 전체 질문은 바로 이 데이터를 "언제" 읽어야 하는가입니다(장치가 작업을 완료했거나 아직 데이터를 처리 중입니까). 프로세서와 프로세서 간의 동기화 주변기기.

이미 짐작하셨겠지만, 장치와 프로세서 간의 통신과 동기화를 구현하기 위해 특정 장치의 현재 작동 상태를 저장하는 "상태 레지스터"가 사용됩니다. 장치가 있을 수 있는 각 상태는 "비트 입력"에 해당합니다. 레지스터 상태"(플래그), 이 장치의 현재 상태 또는 개별 기능(작업 완료/완료되지 않음, 데이터 처리 중 오류, 레지스터 비어 있음 등)에 대해 "말하는" 현재 값입니다.

프로세서와 주변 장치 간의 통신 메커니즘은 이 장치의 특정 기능을 담당하는 플래그 폴링을 통해 구현됩니다. 특정 플래그(디바이스 상태)의 값에 따라 프로그램 실행 흐름(분기)을 변경할 수 있습니다. 예:

특정 플래그가 설정되어 있는지 확인(일부 이벤트가 발생함):

if (RegX & (1<< Flag) ) // RegX 레지스터의 플래그가 설정된 경우
{
// 뭔가를 해라
}

일부 작업(이벤트)이 완료되기를 기다리는 중:

동안(!(RegX & (1<

플래그 쿼리는 프로그램 크기와 프로그램 속도 측면에서 리소스를 많이 사용하는 작업입니다. AVR 마이크로 컨트롤러의 총 플래그 수는 상당히 크기 때문에(장점), 플래그를 폴링하여 프로세서와 장치 간의 통신을 구현하면 작성하는 프로그램의 효율성(코드 속도/코드 크기)이 감소합니다. 또한, 프로그램이 매우 혼란스러워지며, 이는 코드를 자세히 디버깅하더라도 감지하기 어려운 오류가 나타나는 원인이 됩니다.

AVR 마이크로 컨트롤러용 프로그램의 효율성을 높이고 이러한 프로그램의 생성 및 디버깅 프로세스를 용이하게 하기 위해 개발자는 모든 주변 장치에 "인터럽트 소스"( 인터럽트 소스), 일부 장치에는 여러 인터럽트 소스가 있을 수 있습니다.

인터럽트 소스를 사용하여 구현됩니다. 동기화 메커니즘, 프로세서와 주변 장치 사이, 즉 프로세서는 장치가 이에 대한 준비가 된 경우에만 주변 장치에서 데이터 수신, 플래그 폴링 및 기타 작업을 시작합니다(데이터 처리 완료, 작업 중 오류를 보고함). 데이터 처리, 레지스터가 비어 있는 경우 등), "인터럽트 요청"을 생성하여( 중단 요청), 일부 플래그(장치/기능/이벤트 상태)의 값에 따라 달라집니다.

문헌에서는 "인터럽트 요청"(IRQ)부터 "인터럽트 서비스 절차"(ISR)까지 전체 이벤트 체인을 인터럽트( 방해하다).

인터럽트란 무엇입니까?


인터럽트는 이벤트 발생을 프로세서에 알리는 신호입니다. 이 경우 현재 명령 시퀀스의 실행이 일시 중지되고 제어가 이 이벤트에 해당하는 인터럽트 처리 프로시저로 전환된 후 코드 실행이 중단된 지점부터 정확히 계속됩니다(제어 반환). (위키)

인터럽트 루틴(인터럽트 서비스 루틴)은 특정 이벤트가 발생할 때 실행되어야 하는 함수/서브루틴에 지나지 않습니다. 다른 모든 기능과의 차이점을 강조하기 위해 "절차"라는 단어를 사용하겠습니다.

절차와 단순 함수의 주요 차이점은 일반적인 "함수에서 복귀"(어셈블리 명령 RET) 대신 "인터럽트에서 복귀"(어셈블러 명령 RETI)를 사용해야 한다는 것입니다. 인터럽트에서 복귀".

AVR 인터럽트 속성:

  • AVR 마이크로컨트롤러의 일부인 각 주변 장치에는 적어도 하나의 인터럽트 소스가 있습니다. 이러한 모든 인터럽트 중에는 재설정 인터럽트도 포함되어야 하며 그 목적은 다른 모든 인터럽트와 다릅니다.
  • 각 인터럽트에는 인터럽트 서비스 루틴을 가리키는 엄격하게 할당된 벡터(링크)가 있습니다. 모든 인터럽트 벡터는 프로그램 메모리의 맨 처음에 위치하며 함께 "인터럽트 벡터 테이블"을 형성합니다.
  • 각 인터럽트는 특정 "인터럽트 활성화 비트"와 연결됩니다. 따라서 특정 인터럽트를 사용하려면 해당 "인터럽트 활성화 비트" - 로그에 기록해야 합니다. 단위. 또한 특정 인터럽트를 활성화했는지 여부에 관계없이 마이크로 컨트롤러는 SREG 상태 레지스터의 "글로벌 인터럽트 활성화 비트"에 논리 인터럽트가 기록될 때까지 이러한 인터럽트 처리를 시작하지 않습니다. 무기한), 일반 인터럽트 활성화 비트에 논리 0을 써야 합니다.

Reset 인터럽트는 다른 모든 인터럽트와 달리 비활성화할 수 없습니다. 이러한 인터럽트를 마스크 불가능 인터럽트라고도 합니다.

  • 각 인터럽트에는 엄격하게 정의된 우선순위가 있습니다. 인터럽트의 우선순위는 "인터럽트 벡터 테이블"의 위치에 따라 다릅니다. 테이블의 벡터 번호가 낮을수록 인터럽트의 우선순위가 높아집니다. 즉, 가장 높은 우선순위는 인터럽트 벡터 테이블의 첫 번째 위치에 있는 재설정 인터럽트입니다. 테이블에 따라 메모리 프로그램에서 외부 인터럽트 INT0은 "인터럽트 벡터 테이블"의 리셋 인터럽트 다음으로 리셋보다 우선 순위가 낮지만 다른 모든 인터럽트보다 우선 순위가 높습니다.

Reset 벡터를 제외한 인터럽트 벡터 테이블은 GICR 레지스터의 IVSEL 비트를 설정하여 플래시 메모리의 Boot 섹션 시작 부분으로 이동할 수 있습니다. 리셋 벡터는 퓨즈 비트(BOOTRST)를 프로그래밍하여 플래시 메모리의 부트 섹션 시작 부분으로 이동할 수도 있습니다.



그림 1 ATmega16 인터럽트 벡터 테이블

인터럽트 루틴 프로토타입


함수를 인터럽트 처리 루틴으로 선언하려면 컴파일러/링커가 필요한 인터럽트를 해당 처리 루틴과 올바르게 식별하고 연결할 수 있도록 특정 프로토타입 규칙을 따라야 합니다.

첫째, 인터럽트 서비스 루틴은 어떤 것도 인수로 받아들일 수 없으며(void), 어떤 것도 반환할 수 없습니다(void). 이는 AVR의 모든 인터럽트가 비동기식이기 때문에 프로그램 실행이 어디서 중단되는지, 누구로부터 값을 수신하고 누구에게 반환할지, 진입 시간을 최소화하고 인터럽트를 종료합니다.

무효 isr(무효)

둘째, 함수 프로토타입 이전에 인터럽트 처리 절차임을 명시해야 합니다. 아시다시피 C 언어에서는 main 함수에 사용되는 코드만 실행됩니다. main 함수의 인터럽트 처리 프로시저는 어디에도 사용되지 않으므로 컴파일러가 이를 불필요하다고 "버리는" 일이 없으므로 프로시저 프로토타입 이전에 이 함수가 인터럽트 처리 프로시저임을 표시해야 합니다.

AVR Studio 환경에서의 인터럽트 처리 절차 프로토타입

#포함하다

ISR (XXX_벡터)
{

}

AVR Studio(AVR GCC)에서 각 인터럽트 루틴은 ISR 매크로 정의로 시작하고 그 뒤에 괄호 안에 다음 구성이 옵니다.

XXX_벡터

여기서 "XXX"는 인터럽트 벡터의 이름입니다. 특정 AVR 마이크로컨트롤러에 대한 모든 벡터 이름은 마이크로컨트롤러 데이터시트의 "인터럽트 벡터 테이블"이나 해당 헤더 파일에서 찾을 수 있습니다. 예를 들어 ATmega16 마이크로 컨트롤러의 "인터럽트 벡터 테이블"은 그림 1에 표시되어 있으며 소스 열에는 인터럽트 벡터의 모든 이름이 나열되어 있습니다. 이름은 이 마이크로 컨트롤러의 헤더 파일(C :\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\avr\iom16.h), 그림 2 참조. 우리가 해야 할 일은 테이블에서 필요한 벡터의 이름을 찾아 접미사를 추가하는 것뿐입니다. "_vect"를 사용합니다.


그림 2 AVR Studio용 ATmega16 헤더 파일

예를 들어 USART(USART, Rx Complete)를 통해 바이트를 수신하기 위한 인터럽트 처리 절차를 작성해 보겠습니다.

ISR (USART_RXC_vect)
{
// 인터럽트 핸들러 본체
}

그런데 AVR Studio에서 인터럽트를 사용하기 전에 프로젝트에 헤더 파일 io.h 및 Interrupt.h를 포함해야 합니다.

#포함하다
#포함하다

avr-libc의 인터럽트 처리 섹션 소개에서 AVR Studio(AVR GCC)의 인터럽트 처리기에 대해 자세히 알아볼 수 있습니다.

ImageCraft 환경의 인터럽트 처리 절차 프로토타입

#pragma 인터럽트_핸들러 : iv_XXX
무효의< handler_name>(무효의)
{
// 인터럽트 핸들러 본체
}

ImageCraft 환경에서 프로토타입 인터럽트 루틴은 다음과 같습니다.

무효의< handler_name>(무효의)

어디 , 이것은 이 인터럽트 핸들러에 부여하려는 이름입니다. 인터럽트 처리 절차를 선언하기 위한 요구 사항 중 하나는 함수 프로토타입 전에 인터럽트 처리기임을 표시해야 한다는 것입니다. 이는 pragma 지시문을 사용하여 수행됩니다. 인터럽트_핸들러 :

#pragma 인터럽트_핸들러 : iv_XXX

어디 이는 인터럽트 핸들러로 사용될 함수의 이름이며, "iv_XXX" 구성은 "iv_"라는 접두어가 붙은 인터럽트 벡터(XXX)의 이름입니다. AVR Studio의 경우와 마찬가지로 모든 벡터 이름은 특정 AVR 마이크로컨트롤러에 대한 정보는 특정 마이크로컨트롤러 데이터시트의 "인터럽트 벡터 테이블"이나 해당 헤더 파일에서 찾을 수 있습니다(그림 3 참조).


그림 3 ImageCraft IDE용 ATmega16 헤더 파일

예를 들어 ImageCraft 환경에서 USART(USART, Rx Complete)를 통해 바이트를 수신하기 위한 인터럽트를 처리하는 절차는 다음과 같습니다.

#pragma Interrupt_handler usart_rxc_isr: iv_USART_RXC
무효 usart_rxc_isr(무효)
{
// 인터럽트 핸들러 본체
}

ImageCraft IDE의 인터럽트 처리 절차에 대한 자세한 내용은 개발 환경의 도움말->AVR 프로그래밍->인터럽트 처리기 메뉴에서 찾을 수 있습니다.

때로는 여러 인터럽트 핸들러가 동일한 작업을 수행해야 하는 경우 프로그램 메모리를 절약하기 위해 여러 인터럽트 벡터를 동일한 인터럽트 루틴으로 지정할 수 있습니다.

AVR Studio에서는 다음과 같이 보입니다.

ISR (INT0_vect)
{
// 뭔가를 해라
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect) ) ;

먼저 특정 벡터(이 경우 INT0)에 대한 인터럽트 처리 절차가 나옵니다. 다른 모든 프로시저는 다음 구문을 사용하여 모든 인터럽트 핸들러를 참조할 수 있습니다.

ISR (YYY_vect, ISR_ALIASOF(XXX_vect) ) ;

여기서 YYY는 벡터 XXX에 대해 이전에 선언된 인터럽트 핸들러를 참조하는 인터럽트 벡터의 이름입니다.

ImageCraft에서는 다음과 같이 표시됩니다.

#pragma 인터럽트_핸들러 : iv_XXX : iv_YYY
무효의< handler_name>(무효의)
{
// 인터럽트 핸들러 본체
}

#pragma 인터럽트_핸들러 : iv_XXX
#pragma 인터럽트_핸들러 : iv_YYY
무효의< handler_name>(무효의)
{
// 인터럽트 핸들러 본체
}

여기서 벡터 XXX와 YYY는 동일한 인터럽트 핸들러를 나타냅니다. .

AVR 마이크로 컨트롤러에서 인터럽트는 어떻게 작동합니까?

1. " 중단 요청"(IRQ).

그런데 여러 인터럽트 처리 요청이 동시에 발생하는 경우 우선 순위가 가장 높은 인터럽트가 먼저 처리되고 다른 모든 요청은 우선 순위가 높은 인터럽트가 완료된 후에 처리됩니다.

2. 시험.

이 인터럽트에 대한 활성화 비트(인터럽트 활성화 비트)가 설정되고 프로세서 상태 레지스터(SREG)의 I비트(일반 인터럽트 활성화 비트)가 설정되면 프로세서는 인터럽트 서비스 루틴 준비를 시작합니다. 인터럽트 활성화 비트(SREG 레지스터의 I비트)가 재설정되어 다른 모든 인터럽트가 비활성화됩니다. 이는 다른 이벤트가 현재 인터럽트 처리를 방해할 수 없도록 하기 위해 발생합니다.

그런데 인터럽트 처리 절차에서 I비트를 로그 상태로 설정한 경우. 활성화된 인터럽트는 현재 인터럽트의 처리를 차례로 중단할 수 있습니다. 이러한 인터럽트를 중첩된 인터럽트라고 합니다.

3. 준비.

프로세서는 현재 어셈블리 명령어의 실행을 완료한 후 다음 명령어의 주소를 스택(PC->STACK)에 배치합니다. 다음으로, 프로세서는 어떤 인터럽트 소스가 "인터럽트 요청"(IRQ)을 제출했는지 확인한 후 벡터 테이블(각 인터럽트 소스에 단단히 할당되어 있음)에서 이 소스(링크)의 벡터를 사용하여 다음으로 진행합니다. 인터럽트 처리 절차(JMP 명령) 즉, 프로세서는 최소 4클럭 사이클을 소비합니다(요청이 나타나는 순간과 현재 명령의 실행 기간에 따라 다름). 이는 IRQ에 비해 매우 좋은 응답 시간입니다. 다른 제조업체의 마이크로 컨트롤러.

그런데 마이크로 컨트롤러가 절전 모드에 있는 동안 IRQ가 발생하면 IRQ에 대한 응답 시간은 퓨즈 비트 SUT1 및 SUT0(시작 시간)에 저장된 시간과 함께 4개의 클록 사이클만큼 증가합니다.

인터럽트 - 프로세서의 즉각적인 응답이 필요한 이벤트입니다. 응답은 프로세서가 현재 프로그램의 처리를 중단한다는 것입니다( 중단된 프로그램) 그리고 다른 프로그램( 프로그램 중단), 이번 행사를 위해 특별히 제작되었습니다. 이 프로그램이 완료되면 프로세서는 중단된 프로그램 실행으로 돌아갑니다.

중단이 필요한 각 이벤트에는 다음이 수반됩니다. 인터럽트 신호, 이에 대해 컴퓨터에 알리고 전화를 걸었습니다. 중단 요청.

프로그램 상태해당 시점(예: 마지막 명령이 실행된 후)의 모든 저장 요소 상태 집합을 나타냅니다. 인터럽트가 발생하면 마이크로 컨트롤러는 프로그램 카운터의 내용을 스택에 저장하고 해당 인터럽트 벡터의 주소를 스택에 로드합니다. 인터럽트 서비스 루틴의 마지막 명령은 메인 프로그램으로 복귀하여 이전에 저장된 프로그램 카운터를 복원하는 명령이어야 합니다. 인터럽트 핸들러가 실행되는 동안 일부 정보가 변경될 수 있습니다. 따라서 인터럽트 핸들러로 이동할 때에는 변경되는 요소들을 저장해 둘 필요가 있다. 그러한 요소의 집합은 다음과 같습니다. 프로그램 상태 벡터. 이 경우 메모리 셀의 상태에 대한 다른 정보는 중요하지 않거나 프로그래밍 방식으로 복원될 수 있습니다.

벡터 초기 상태 프로그램의 초기 실행에 필요한 모든 정보가 포함되어 있습니다. 대부분의 경우 초기 상태 벡터에는 시작되는 프로그램의 시작 주소라는 하나의 요소만 포함됩니다.

인터럽트 벡터는 인터럽트 프로그램(핸들러)의 초기 상태에 대한 벡터이며 시작 주소를 포함하여 핸들러로 이동하는 데 필요한 모든 정보를 포함합니다. 각 인터럽트 유형에는 해당 핸들러의 실행을 시작하는 자체 인터럽트 벡터가 있습니다. 일반적으로 인터럽트 벡터는 짧은 주소를 가진 특별히 할당된 고정 메모리 위치에 저장됩니다. 인터럽트 벡터 테이블. 적절한 인터럽트 프로그램으로 점프하려면 프로세서에 인터럽트 벡터와 이 벡터의 주소가 있어야 합니다. 이 주소에는 일반적으로 인터럽트 처리 서브루틴으로의 무조건 점프 명령이 있습니다.

일반적으로 저장 및 반환 제어는 인터럽트 핸들러에 할당됩니다. 이 경우 핸들러는 프로그램 전환을 보장하는 준비(프롤로그)와 최종(에필로그) 부분과 요청에 의해 요청된 작업을 수행하는 실제 중단 프로그램의 세 부분으로 구성됩니다. 응답 시간은 인터럽트 요청을 수신한 순간부터 인터럽트 프로그램이 실행을 시작할 때까지의 시간 간격으로 정의됩니다.


티피– 중단에 대한 시스템 응답 시간
t z- 중단된 프로그램의 상태를 저장하는 시간
t ppr– 실제 중단 프로그램의 시간;
t in– 중단된 프로그램의 상태를 복원하는 시간

요청 소스가 여러 개인 경우 들어오는 요청을 처리하는 특정 순서를 설정해야 합니다. 우선순위 관계또는 서비스 규율. 가능한 모든 프로세서 인터럽트 유형의 집합은 다음과 같습니다. 인터럽트 시스템마이크로 컨트롤러. 서비스 규정에 따라 동시에 수신된 여러 요청 중 어떤 요청을 먼저 처리해야 하는지, 이 요청하나 또는 다른 인터럽트 핸들러를 인터럽트합니다.
인터럽트가 처리되는 동안 우선순위가 높은 인터럽트 요청이 수신되면 우선순위가 높은 인터럽트 핸들러로 제어가 넘어가고 우선순위가 낮은 인터럽트 핸들러가 일시 중지됩니다. 발생 중첩 중단. 서로를 일시 중단할 수 있는 최대 프로그램 수를 호출합니다. 중단의 깊이.

동일한 소스(동일 우선순위)에서 새 요청이 도착할 때까지 인터럽트 요청이 처리되지 않으면 인터럽트 시스템 포화. 이 경우 인터럽트 요청의 일부가 손실됩니다. 정상 작동마이크로 컨트롤러는 허용되지 않습니다.

인터럽트 시스템의 특징이다:

  • 총 인터럽트 요청 수 인터럽트 요청 소스 수;
  • 인터럽트 표현 유형 - 원칙적으로 인터럽트 요청은 논리 신호 레벨로 표현됩니다.
  • 인터럽트 우선순위 - 각 인터럽트 요청이 처리되는 순서를 결정합니다. 우선순위가 높을수록 인터럽트 프로그램 실행 지연이 짧아집니다.
  • 응답 시간 – 인터럽트 요청이 나타난 후 인터럽트 프로그램 실행이 시작될 때까지의 시간 간격입니다.
  • 중단 지연 – 프로그램 저장 및 복원에 소요되는 총 시간으로 결정됩니다.
  • 깊이는 일반적으로 인터럽트 시스템의 우선 순위 수준 수와 일치합니다.
  • 인터럽트 시스템 포화;
  • 허용되는 프로그램 중단 순간(일반적으로 다음 명령 실행 종료).

인터럽트 마스킹마이크로컨트롤러에게 각 유형의 인터럽트에 응답하거나 이를 무시하도록 지시하는 데 사용됩니다. 인터럽트 마스크는 비트가 인터럽트 요청 소스에 할당된 이진 코드를 나타냅니다. 이진 코드의 한 비트는 마이크로컨트롤러가 이러한 유형의 인터럽트를 처리하도록 지시합니다. 반대로 0비트는 마이크로컨트롤러가 지정된 유형의 인터럽트 처리를 진행하는 것을 허용하지 않습니다.
일반적으로 인터럽트를 마스킹하는 것 외에도 전역 인터럽트 활성화 비트도 있습니다. 이 비트의 0 값은 모든 인터럽트 핸들러를 비활성화합니다(하드웨어 재설정 및 실행 프로그램 시작 부분으로 점프 제외).
인터럽트 마스크 바이너리 코드 외에 바이너리 코드도 있습니다. 인터럽트 플래그, 이는 마이크로컨트롤러에 지정된 요청이 있는 여러 소스가 있는 경우 인터럽트 핸들러가 인터럽트 소스를 설정할 수 있도록 합니다.




맨 위