컨트롤러는 언제 ISR로 이동해야하는지 어떻게 알 수 있습니까?


12

나는 핵심 수준의 것들에 대해 이야기하고 있습니다.

내가 이해하는 한 컨트롤러 코어는 메모리에서 가져온 명령 (Fetch-Decode-Execute)을 실행합니다. 인터럽트가 도착하면 코어 / ALU는 어떻게 ISR로 점프하기로 결정합니까?

우리 또는 컴파일러가 인터럽트 상태를 폴링하는 명령을 추가하지 않기 때문에 인터럽트가 제공되어야한다는 것을 어떻게 알 수 있습니까?

답변:


13

누락 된 것은 코어 메모리에서 가져온 opcode를 실행하는 것 이상을 수행한다는 것입니다. 인터럽트를 구현하는 특정 논리가 있습니다.

인터럽트 감지 하드웨어가 인터럽트 시간을 알리는 신호를 표명 할 때 일반적으로 메모리에서 가져 오지 않은 특수 명령이 코어에 걸리게됩니다. 대부분의 경우 이것은 인터럽트 벡터 주소에 대한 CALL 명령어입니다. 기존 명령 실행 메커니즘을 사용하여 현재 PC를 호출 스택에 저장하고 인터럽트 벡터 주소로 변경합니다. 또한 프리 페치 된 명령어 등을 버리는 방법도 다룹니다.

또한 특별한 인터럽트 테이킹 로직은 동일한 인터럽트 조건으로 인해 다음 사이클에서 인터럽트 벡터 주소에 대한 다른 호출이 발생하지 않도록 인터럽트를 비활성화해야합니다. 프로세서마다 다른 처리 방법이 있습니다. 가장 간단한 방법은 인터럽트를 완전히 비활성화하는 것입니다. 인터럽트 서비스 루틴이 끝날 때 소프트웨어가 인터럽트를 다시 활성화해야합니다. 다른 프로세서에는 인터럽트 우선 순위가 있습니다. 이 레벨은 우선 순위가 높은 인터럽트 조건 만 새 인터럽트를 유발할 수 있도록 충돌합니다. 그러면 인터럽트 우선 순위는 CALL 리턴 주소와 함께 자동으로 저장되고 코드가 인터럽트에서 리턴 될 때 복원됩니다.


1
종종, 그것은 보통 아니다 CALL인터럽트 (참조, 다른 방법으로 종료 될 때, 명령 RETRETI).
glglgl

1
인터럽트 감지 하드웨어가 신호를 어서 트 할 때 메모리 대신 CPU가 다른 곳에서 점프하도록 명령을받는다고 생각할 수 있습니다. 이 명령을 실행 하시겠습니까?
Swanand '12

3

일반적으로 최신 마이크로 컨트롤러에는 인터럽트 관리를 담당하는 전용 인터럽트 컨트롤러 (IC) 장치가 있습니다. 또한 각 주변 구성 요소로부터가는 인터럽트 출력 (들)을 보유 0하는 1일부 조건 (예를 몇 가지 작업을 완료이 주변에 대한) 적용 (또는 그 반대도 마찬가지)를. 이 출력은 인터럽트 컨트롤러에 연결됩니다. CoreCPU는이 특정 인터럽트를 무시 어느 IC 말할 수있다 (이를 마스크) 또는 특정 신호를 트리거로 발생하고 MCU가 수행 할 작업을 판단 할 때마다 MCU에 통지하기. 일반적인 방법은 IC가 MCU에 어떤 인터럽트가 발생했는지 알려주고 해당 처리 코드로 점프하도록하는 것입니다.


2

컴퓨터 코어에는 트리거 된 특정 인터럽트에 해당하는 새로운 값이 프로그램 카운터에 걸리는 하드웨어가 있습니다. 인터럽트 루틴이 완료된 후 돌아 오는 위치를 기억하기 위해 하드웨어가 인터럽트 주소를 프로그램 카운터에 잼하기 전에 프로그램 카운터의 현재 값이 스택으로 푸시됩니다. 인터럽트 루틴이 완료되면 프로그램 카운터의 원래 값이 스택에서 다시 복원됩니다.

인터럽트 시간에 프로그램 카운터에 걸리는 값은 일반적으로 두 가지 방식 중 하나로 결정됩니다. 한 가지 접근 방식은 각 인터럽트 유형에 대한 고정 주소를 프로그램 카운터에 걸리고 컴퓨터 코어는 해당 고정 위치에서 실행을 시작합니다. 고정 위치의 공간은 종종 크기가 제한되므로 실제 인터럽트 서비스 위치로 이동하는 고정 주소에서 점프 명령을 코딩하는 것이 일반적입니다. 다른 체계는 인터럽트 벡터 테이블이라는 것을 사용합니다. 여기서 하드웨어는 인터럽트 유형에 따라 벡터 테이블에 고정 주소 오프셋을 생성합니다. 그런 다음 하드웨어는 해당 테이블 위치에서 내용을 꺼내고 해당 값을 주소로 사용하여 프로그램 카운터에 잼합니다.


2

컨트롤러에는 다음에 실행될 명령어가 저장된 주소를 추적 하는 프로그램 카운터에 대한 레지스터 가 있습니다. (이 레지스터는 점프가 실행될 때도 기록됩니다.)

컨트롤러에는 ISR이 저장된 주소 인 인터럽트 벡터 (또는 때때로 인터럽트 유형에 따라 둘 이상)가 있습니다. 이 주소는 항상 동일합니다. 프로그램이 시작되는 재설정 벡터와 같습니다.

(벡터의 공간이 전체 프로 시저를 저장하기에 충분하지 않기 때문에 실행하기 위해 실제 코드로 점프하는 점프 명령이 종종이 벡터에 저장됩니다. 그러나 중요한 것은 항상 ISR이 동일한 위치에 있다는 것입니다 위치.)

인터럽트가 발생하면 컨트롤러에 인터럽트 벡터로 프로그램 카운터를 쓰는 전용 하드웨어가 있습니다. 그런 다음 컨트롤러가 다음 명령어 사이클에 도달하면 프로그램 카운터가 가리키는 주소 (인터럽트 벡터)에서 명령어를 가져옵니다.

(컨트롤러의 한 명령 사이클에는 수행하는 다른 작업이 있습니다. 프로그램 카운터가 가리키는 주소에서 다음 명령을 가져옵니다. 프로그램 카운터를 늘리고 명령을 디코딩하여 실행합니다.)

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