인터럽트 활성화


10

인터럽트가 활성화 된 경우 (예 : NXP LPC1778의 CAN 모듈에서 중재 손실 인터럽트) 발생하지만 인터럽트에 대해 ISR이 정의되지 않은 경우 어떻게되는지 알고 싶습니다.

이러한 인터럽트가 발생하면 해당 인터럽트 플래그가 설정된다는 것을 알고 있지만 ISR을 정의하지 않았으므로 그러한 인터럽트에 대한 제어 전송을 위해 저장된 인터럽트 벡터 오프셋 주소가 없으므로 제어는 다시 전달됩니다. 메인 루틴에서 폴링 플래그를 폴링하여 인터럽트 플래그를 재설정 할 수 있습니다 (이것은 내가 생각하고있는 것입니다).

무슨 일이 일어날 지에 대한 해결책이 정말 도움이 될 수 있습니다.

감사.

최신 정보:

내 uC에서 CAN 인터럽트를 활성화했지만 ISR을 정의하지 않았습니다. 내부 루프백 테스트를 수행 할 때 코드가 무한 루프에 들어갔습니다. LPC1778에서 실행되는 무한 루프의 디스 어셈블리 코드는 다음과 같습니다.

B       .
ENDP

따라서 인터럽트를 사용하는 경우 ISR을 사용하십시오.


3
주 함수에서 플래그를 폴링하기 위해 인터럽트를 활성화 할 필요는 없습니다. 플래그를 설정하는 조건이 발생하면 해당 인터럽트를 활성화했는지 여부에 관계없이 해당 플래그가 설정됩니다.
brhans

Ur은 "버스 중재 손실 인터럽트"를 활성화하지 않아도 버스 중재 손실 인터럽트 플래그가 설정된다고 말합니다 (인터럽트 상태 레지스터를 제외하고 버스 중재 손실을 표시 할 수있는 상태 레지스터는 없지만)?
AlphaGoku

예. 내가 작업 한 모든 MCU에서 인터럽트 플래그는 설정해야하는 조건이 발생할 때마다 설정됩니다. 인터럽트를 활성화하면 관련 플래그가 설정 될 때 MCU가 핸들러로 벡터화되고 인터럽트를 비활성화하면 플래그가 설정되어 있어도 핸들러로 벡터가 아닌 플래그를 무시하게 됩니다 . 인터럽트 비활성화 / 활성화는 플래그 설정 동작이 아닌 점프 투 인터럽트 핸들러 동작에만 영향을줍니다.
brhans

와우. 내가 알지 못하는 것. 고마워 따라서 모든 드라이버는 인터럽트가 활성화되지 않은 경우에도 주기적으로 인터럽트 상태 레지스터를 확인하고 재설정해야합니다. :)
AlphaGoku

중요한 경우에만 @AkshayImmanuelD. 인터럽트가 항상 비활성화되어 있고 플래그에 대해 신경 쓰지 않는 것이 있으면 설정 또는 해제 여부는 중요하지 않습니다.
hobbs

답변:


17

정의 된 ISR이없는 경우, 인터럽트 벡터에서 점프 명령의 위치는 null이거나 예외 루틴으로 점프하거나 프로그램 시작으로 점프하거나 "return from 인터럽트 "(예 : RTI) 명령.

다음은 이러한 경우를 처리하는 루틴 (무한한 루프에 들어갈 수 있음)을 처리하는 루틴에 벡터화되지 않은 세 개의 인터럽트와 하나의 합법적 인 벡터를 표시하는 ATMega 16 프로세서의 인터럽트 테이블 분해입니다.

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

누락 된 ISR을 처리하기 위해 앞에서 설명한 방법 중 어느 것이 마이크로 컨트롤러 및 컴파일러의 아키텍처에 따라 달라집니다. RTI 또는 이와 동등한 명령의 경우 즉시 응용 프로그램으로 돌아갑니다. 그러나 인터럽트가 에지 트리거가 아닌 레벨 트리거 된 경우 인터럽트가 다시 트리거되므로 무한 루프 상태가됩니다.

내부 인터럽트 (예 : UART에 의해 수신되는 문자)가 레벨 트리거 또는 에지 트리거로 간주되는지 여부는 칩의 아키텍처에 따라 달라질 수 있습니다. 외부 인터럽트는 일반적으로 하나 또는 다른 것으로 구성 할 수 있습니다.

다른 경우도 있지만 때로는 여러 인터럽트가 그룹화되어 동일한 벡터를 사용합니다. 이것은 단지 몇 번의 인터럽트가 있었을 수도있는 구형 프로세서의 경우에 특히 그렇습니다. 이 경우 인터럽트 원인의 상태를 폴링하여 인터럽트 원인을 결정했습니다. 이는 일종의 제안과 같습니다.

그러나 어떤 경우에도 시스템에 인터럽트가 있고 ISR이 정의되지 않은 것은 나쁜 습관입니다. 하지마


2
.... 또는 정의되지 않을 수 있습니다.
Wouter van Ooijen

@WoutervanOoijen 이것이 인터럽트 벡터가 null이라는 의미입니다.
tcrosley

1
상태 레지스터는 위에서 언급 한 것과 같은 몇 가지 오류를 표시 할 수 없습니다. 그러나 이러한 오류에는 인터럽트가 있습니다. 따라서 오류를 식별하고 ISR을 사용하지 않기 위해 인터럽트를 활성화하는 것으로 생각했습니다. Keil을 사용하여 LPC1778을 시뮬레이션하는 동안 예외가 발생하여 uC가 RTI를 사용해야한다고 생각합니다.
AlphaGoku

1
알아 두어야 할 사항-인터럽트를 활성화했지만 처리기가 플래그를 지우지 않으면 (또는 처리기가없고 기본 동작이 간단한 반환 인 경우) MCU가 영원히 종료 될 가능성이 높습니다 인터럽트 루프에 멈췄습니다.
brhans

1
ATSAM3X8E의 PIO 인터럽트는 에지 트리거 될 수 있지만 인터럽트 핸들러에서 ISR (인터럽트 상태 레지스터)을 읽을 때까지 설정된 인터럽트 조건은 지워지지 않으므로 루프 @brhans가 언급됩니다.
Simon Wright

1

MCU, 컴파일러 및 나머지 코드에 따라 다릅니다.

내 경험에서 :

  1. AVR-기본적으로 ISR을 지정하지 않으면 플래시의 인터럽트 벡터는 0x0000이됩니다. 즉,이 인터럽트가 발생할 때마다 응용 프로그램이 재설정으로 넘어갑니다.

    실제로 인터럽트가 필요하지만 핸들러가 필요하지 않은 경우 (예 : ADC 저잡음 파워 다운 모드를 사용하고 MCU를 깨우기 위해 인터럽트 만 사용) EMPTY_INTERRUPT 매크로를 사용해야합니다

  2. NXP Kinetis (ARM)-기본적으로 모든 벡터는 중단 점이있는 기본 핸들러를 가리키며 CPU는 단순히 중지하고 디버거에 알려줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.