2

ARM에서 인터럽트를 처리하는 방법에 대해 읽었으며 하드웨어 인터럽트가 0x00000018 주소가 실행될 때마다 알게되었습니다. 이는 일반적으로 존중받는 인터럽트 처리기로 점프되지만 많은 수의 다른 모듈에 대한 인터럽트 처리기.다중 인터럽트 처리기 공유 주소 주소 0x00000018

그런 다음 이러한 다양한 처리기가 주소 0x00000018에 매핑되는 방법은 무엇입니까?

또한 ARM CPU가 인터럽트 발생을 알게되는 방법은 irq 또는 fiq가이를 결정한 사람과 인터럽트를 발생시킨 장치,이 인터럽트에 대해 존중받는 처리기에 매핑하는 방법입니다.

어떤 보디라도 모든 인터럽트 처리기가 수행하는 것을 볼 수있는 간단한 인터럽트 처리기 코드를 가리킬 수 있습니까?

답변

5

ARM CPU에는 일반적으로 장치가 인터럽트를 생성하려고 할 때 어설 션되는 두 개의 핀 (FIQ 및 IRQ)이 있습니다. 이 경우 CPU는 간단히 모드를 전환하고 주소 0x00000018으로 점프합니다.

그러나 일반적으로 인터럽트 핀 수보다 많은 장치가 있기 때문에 일반적으로 CPU와 장치 간 인터럽트 컨트롤러가 있습니다. 이것을 CPU에 더 많은 인터럽트를 연결하기위한 허브로 생각할 수 있습니다. 인터럽트 컨트롤러는 수신하는 특정 종류의 인터럽트에 대해 FIQ를 어서 트하도록 구성 할 수 있습니다.

일반적으로 인터럽트 처리기는 인터럽트 컨트롤러에 인터럽트를 발생시킨 핀을 요청한 다음 적절한 처리기를 호출합니다.

작은 프로젝트에서 사용했던 인터럽트 처리기 코드의 오류 검사없이 삭제 된 버전입니다.

#include <types.h> 
#include <irq.h> 

static void (*irq_handlers[32])(void); 

void __attribute__((interrupt)) handle_irq() { 
    int irq = irq_hw_get_and_ack(); 

    if (irq_handlers[irq]) { 
     irq_handlers[irq](); 
    } 
} 

void setup_irq() { 
    irq_hw_init(); 
    cpu_enable_irq(); 
} 

void irq_request(int irq, void (*func)(void)) { 
    irq_handlers[irq] = func; 
    irq_hw_enable(irq); 
} 

void irq_unrequest(int irq) { 
    irq_hw_disable(irq); 
    irq_handlers[irq] = NULL; 
} 
+0

대단히 감사합니다. 나는 dwelch에도 질문을했는데, 주소 0x0000018에 매핑 된 인터럽트 핸들러가 하나 뿐이며이 핸들러는 모듈에 특정한 다른 핸들러를 돌볼 책임이 있습니까? , 당신이 내게 어떤 코드를 제안 할 수 위대한 "인터럽트 처리기 일반적으로 인터럽트 컨트롤러가 어떤 인터럽트를 발생시킨 다음 적절한 처리기를 호출합니다"제안 할 수 있습니다. 인터럽트 처리기가 인터럽트 컨트롤러에 어떤 핀이 인터럽트를 발생시키는 지 묻습니다. –

+0

정확한 SoC 및 구성에 따라 다르지만 일반적으로 일종의 메모리 매핑 IO 레지스터 읽기가 필요합니다. – tangrs

+0

좋은 tangrs, 당신은 나의 이해에 주소 0x0000018에 매핑 된 하나의 인터럽트 처리기가 있는지 확인하시기 바랍니다이 처리기는 모듈에 특정 다른 처리기 돌보는 책임이 있습니까? –

2

프로세서에는 하나의 인터럽트 만있는 것이 일반적입니다. x86은 잠시 동안 그런 것처럼 보였을 것입니다. 암은 전통적으로 두 개 였지만 새로운 코어의 수가 32,256 개로 많습니다.

여기서 언급 한 tangrs는 일반적으로 프로세서 외부에있는 것으로, 팔의 경우에는 칩 자체이지만 팔 코어 자체는 아니다. 뭔가 많은 인터럽트 입력과 하나 또는 몇 개의 인터럽트 프로세서로가는 출력 또는 출력이 있습니다. 프로세서 인터럽트가 발생하면 프로세서/코어 외부의이 논리/하드웨어로 누가 그 원인을 확인하고 거기에 도달했는지 확인합니다.

또한 중첩 된 인터럽트 컨트롤러를 갖는 것은 일반적이지 않습니다. 예를 들어, 하나의 출력으로 8 개의 입력을들 수 있습니다. 그리고 그 8 개의 입력 중 일부 또는 각각에 대해 또 다른 8 대 1 인터럽트 컨트롤러가 있습니다. 그러면 소프트웨어는 간단히 경로를 따라 가야합니다. 첫 번째 레벨 인터럽트 컨트롤러를 확인하여 인터럽트가 발생한 인터럽트를 확인한 다음 인터럽트를 분리 할 때까지 다음 계층 컨트롤러를 알아야합니다.

또한 이러한 공유 인터럽트 시스템의 경우 기본적으로 프로그램이 중지되고 인터럽트 벡터가 호출되는 시점부터 "동시에"여러 인터럽트가 발생할 수 있다는 것을 알고 있고 인터럽트를 수행합니다 시작 물건과 결국 인터럽트 상태 레지스터를 읽고, 하나 이상 올 수 있습니다. 당신이 그걸 처리하는 방법을 결정할 필요가/시스템/논리에 따라 그들 중 하나에서 반환하는 경우 다른 사람이 당신을 다시 데려 올 수도 인터럽트 핸들러는 임 펜션이 펜딩 중 하나만 처리 할 수 ​​있도록합니다. 다른 논리에서는 돌아 오기 전에 모든 보류를 처리해야 할 수도 있습니다.

암은 반드시 인터럽트 나 핀 라인에 묶여있는 것을 제어하지 않기 때문에 인터럽트 시스템이 특정 암 칩에 대해 어떻게 작동하는지에 대한 다양한 벤더의 모든 솔루션을 얻을 수 있습니다.

+0

고마워요 @ dwelch, 프로세서 인터럽트가 발생하면 누가이 논리/프로세서 외부의 하드웨어로 인해 누가 그걸 일으켰는지 확인합니다. 여기 프로세서 원인을 확인한 프로세서가 프로세서를 확인 했나요? 주소 0x0000018에 매핑되는 하나의 인터럽트 처리기이며이 처리기는 모듈과 관련된 다른 처리기를 처리합니다. –

+0

방금 ​​하나의 인터럽트 처리기 코드 https://github.com/xinu-os/xinu/blob/master/system/arch/arm/irq_handler.S를 찾았습니다. 줄 번호 69에서 모듈 특정 인터럽트로 점프합니다. 이 이해가 잘됩니까? –

+0

예 소프트웨어가 인터럽트 컨트롤러 및/또는 주변 장치를 검사합니다 (결국 인터럽트를 생성 할 수있는 주변 장치를 확인). –