문제

모든 마이크로 프로세서에서 FIQ와 IRQ 인터럽트 시스템의 차이점을 알고 싶습니다 : ARM926EJ.

도움이 되었습니까?

해결책

현대 팔 CPU (및 일부)의 특징.

특허에서 :

하나 이상의 인터럽트를 처리 할 수있는 디지털 데이터 프로세서에서 빠른 인터럽트를 수행하는 방법이 제공됩니다. 빠른 인터럽트 요청이 수신되면 플래그가 설정되고 프로그램 카운터 및 조건 코드 레지스터가 스택에 저장됩니다. 인터럽트 서비스 루틴이 끝나면 인터럽트 지침의 수익은 디지털 데이터 프로세서의 상태를 포함하는 조건 코드 레지스터를 검색하고 플래그가 설정되었는지 여부를 확인합니다. 플래그가 설정되면 빠른 인터럽트가 서비스되었으므로 프로그램 카운터 만 사용되지 않음을 나타냅니다.

다시 말해, FIQ는 더 높은 우선 순위 인터럽트 요청이며, 요청 서비스 중에 IRQ 및 기타 FIQ 핸들러를 비활성화하여 우선 순위가 지정됩니다. 따라서 활성 FIQ 인터럽트를 처리하는 동안 다른 인터럽트가 발생할 수 없습니다.

다른 팁

팔 호출 FIQ 그만큼 빠른 인터럽트, 그 의미와 함께 IRQ ~이다 정상 우선 순위. 모든 실제 시스템에서는 두 장치보다 더 많은 인터럽트 소스가있을 것이므로 이러한 여러 소스의 마스킹, 우선 순위 등을 허용하고 인터럽트 요청 라인을 프로세서로 구동 할 수있는 외부 하드웨어 인터럽트 컨트롤러가 있습니다.

어느 정도까지, 이것은 두 인터럽트 모드를 중복시키고 많은 시스템이 사용하지 않는 것의 구별을 만듭니다. nFIQ 전혀, 또는 비가킹 가능한 것과 유사한 방식으로 그것을 사용하십시오 (NMI) 다른 프로세서에서 발견 된 인터럽트 (그러나 FIQ 대부분의 ARM 프로세서에서 소프트웨어 마스크가 가능합니다).

그렇다면 팔은 왜 FIQ를 "빠르게"호출합니까?

  1. FIQ 모드에는 자체 전용 은행 레지스터가 있으며 r8-r14. R14는 FIQ에서 리턴 주소 (+4)를 보유하는 링크 레지스터입니다. 그러나 FIQ 핸들러가 사용하도록 작성할 수있는 경우 r8-r13,이 은행 레지스터를 두 가지 방법으로 활용할 수 있습니다.
    • 하나는 인터럽트 서비스 루틴 (ISR)에서 사용하는 레지스터를 밀고 팝업하는 오버 헤드가 발생하지 않는다는 것입니다. 이렇게하면 ISR로 출입 할 때 상당수의 사이클을 절약 할 수 있습니다.
    • 또한 핸들러는 한 통화에서 다음 호출로 레지스터로 지속되는 값에 의존 할 수 있으므로 예를 들어 r8 하드웨어 장치에 대한 포인터로 사용될 수 있으며 핸들러는 동일한 값에 의존 할 수 있습니다. r8 다음 번에 호출됩니다.
  2. 예외 벡터 테이블 끝의 FIQ 위치 (0x1C) FIQ 핸들러 코드가 벡터 테이블의 끝에 직접 배치되면 브랜치가 필요하지 않음을 의미합니다. 코드는 직접 실행할 수 있습니다. 0x1C. 이것은 ISR에 진입 할 때 몇 사이클을 절약합니다.
  3. FIQ는 IRQ보다 우선 순위가 높습니다. 이것은 코어가 FIQ 예외를 취하면 자동으로 IRQ를 마스킹한다는 것을 의미합니다. IRQ는 FIQ 핸들러를 방해 할 수 없습니다. 반대는 사실이 아닙니다. IRQ는 FIQ를 마스크하지 않으므로 FIQ 핸들러 (사용 된 경우)가 IRQ를 방해 할 수 있습니다. 또한 IRQ 및 FIQ 요청이 동시에 발생하면 핵심은 FIQ를 먼저 처리합니다.

그렇다면 왜 많은 시스템이 FIQ를 사용하지 않습니까?

  1. FIQ 핸들러 코드는 일반적으로 C로 작성할 수 없습니다. 어셈블리 언어로 직접 작성해야합니다. FIQ를 사용하기 위해 ISR 성능에 대해 충분히 관심을 갖는 경우, C로 코딩하여 테이블에 몇 사이클을 남기고 싶지 않을 수도 있지만 더 중요한 것은 C 컴파일러가 제한을 따르는 코드를 생성하지 않는 것입니다. 레지스터 만 사용합니다 r8-r13. ARM을 준수하는 C 컴파일러에 의해 생성 된 코드 ATPCS 프로 시저 호출 표준은 대신 레지스터를 사용합니다 r0-r3 스크래치 값의 경우, 올바른 것을 생성하지 않습니다 cpsr 기능 끝에 반환 코드 복원.
  2. 모든 인터럽트 컨트롤러 하드웨어는 일반적으로 IRQ 핀에 있습니다. FIQ를 사용하면 NFIQ 입력에 연결된 가장 높은 우선 순위 인터럽트 소스가있는 경우에만 의미가 있으며 많은 시스템에는 단일 영구적으로 가장 높은 우선 순위 소스가 없습니다. 여러 소스를 FIQ에 연결 한 다음 FIQ가 IRQ에 대한 거의 모든 장점을 제거하므로 소프트웨어가 우선 순위를 정하는 값은 없습니다.

FIQ 또는 빠른 인터럽트 종종라고합니다 소프트 DMA 일부 팔 참조.
의 특징 FIQ 이다,

  1. 스택, 링크 레지스터 및 R8-R12를 포함한 은행 레지스터와 별도의 모드.
  2. 별도의 FIQ 활성화/비활성화 비트.
  3. 벡터 테이블의 꼬리 (항상 캐시에 있고 MMU에 의해 매핑 됨).

마지막 기능은 또한 IRQ 분기해야합니다.

'C'의 속도 데모

일부는 FIQ를 처리하기 위해 어셈블러에서 코딩의 어려움을 인용했습니다. gcc 코드 a에 대한 주석이 있습니다 FIQ 매니저. 다음은 예입니다.

void  __attribute__ ((interrupt ("FIQ"))) fiq_handler(void)
{
    /* registers set previously by FIQ setup. */
    register volatile char *src asm ("r8");  /* A source buffer to transfer. */
    register char *uart asm ("r9");          /* pointer to uart tx register. */
    register int size asm ("r10");           /* Size of buffer remaining. */
    if(size--) {
        *uart = *src++;
    }
}

이것은 다음 거의 좋은 어셈블러로 해석됩니다.

00000000 <fiq_handler>:
   0:   e35a0000        cmp     sl, #0
   4:   e52d3004        push    {r3}            ; use r11, r12, etc as scratch.
   8:   15d83000        ldrbne  r3, [r8]
   c:   15c93000        strbne  r3, [r9]
  10:   e49d3004        pop     {r3}            ; same thing.
  14:   e25ef004        subs    pc, lr, #4

어셈블러 루틴 0x1c 보이는 것처럼 보일 수 있습니다.

   tst     r10, #0    ; counter zero?
   ldrbne  r11, [r8]  ; get character.
   subne   r10, #1    ; decrement count
   strbne  r11, [r9]  ; write to uart
   subs    pc, lr, #4 ; return from FIQ.

진짜 UART 비트가 준비되었지만 고속을 만드는 코드 소프트 DMA FIQ의 경우 10-20 지침이 있습니다. 기본 코드는 FIQ를 폴링해야합니다 r10 버퍼가 완료된시기를 결정합니다. 기본 (중단되지 않은 코드)은 은행을 양도 및 설정할 수 있습니다. FIQ 사용하여 등록합니다 msr 전환 할 지시 FIQ 금융이없는 R0-R7 모드 및 전송 R8-R13 레지스터로 전송합니다.

일반적으로 RTOS 인터럽트 대기 시간은 500-1000 지침입니다. Linux의 경우 2000-10000 지침이있을 수 있습니다. 그러나 실제 DMA는 항상 고주파 간단한 인터럽트 (버퍼 전송과 같은)의 경우 항상 바람직합니다. FIQ 솔루션을 제공 할 수 있습니다.

로서 FIQ 속도에 관한 것입니다. 어셈블러에서 코딩에 안전하지 않거나 시간을 전념하려는 경우 고려해서는 안됩니다. 무한히 달리는 프로그래머가 작성한 어셈블러는 컴파일러보다 빠릅니다. GCC 지원을 받으면 초보자가 도움이 될 수 있습니다.

지연 시간

로서 FIQ 별도의 마스크 비트가있어 거의 유비쿼터스로 활성화됩니다. 초기 ARM CPU (ARM926EJ와 같은)에서는 일부 원자 연산은 마스킹 인터럽트를 통해 구현되어야했습니다. 여전히 가장 진보 된 피질 CPU가 있더라도 OS가 인터럽트를 마스킹하는 경우가 있습니다. 종종 서비스 시간은 인터럽트에 중요한 것이 아니라 신호와 서비스 사이의 시간입니다. 여기, FIQ 또한 이점이 있습니다.

약점

그만큼 FIQ 확장 할 수 없습니다. 다중 사용을 위해 FIQ 출처, 은행 등록자는 인터럽트 루틴간에 공유해야합니다. 또한 인터럽트/FIQ의 원인을 결정하려면 코드를 추가해야합니다. 그만큼 FIQ 일반적으로 a 하나의 트릭 조랑말.

인터럽트가 매우 복잡한 경우 (네트워크 드라이버, USB 등) FIQ는 아마도 의미가 없습니다. 이것은 기본적으로 인터럽트를 다중화하는 것과 동일한 진술입니다. 그만큼 은행 레지스터는 6 개의 무료 변수를 사용합니다 메모리에서로드하지 마십시오. 레지스터는 메모리보다 빠릅니다. 레지스터는 L2 캐시보다 빠릅니다. 레지스터는 L1 캐시보다 빠릅니다. 레지스터는 빠릅니다. 6 개의 변수로 실행되는 루틴을 쓸 수 없다면 FIQ 적합하지 않습니다. 참고 : 일부 등록부를 두 배로 늘릴 수 있습니다 변화 그리고 회전합니다 16 비트 값을 사용하는 경우 팔에 무료입니다.

분명히 FIQ 더 복잡합니다. OS 개발자는 여러 인터럽트 소스를 지원하려고합니다. a FIQ 다양하고 종종 고객이 그들 자신을 굴립니다. 일반적으로 a FIQ 모든 지원이 주요 혜택을 방해 할 수 있으므로 제한되어 있습니다. 속도.

요약

내 친구를 강타하지 마십시오 FIQ. 그것은 멍청한 하드웨어에 대한 시스템 프로그래머 중 하나입니다. 그것은 모든 사람을위한 것이 아니라 그 자리가 있습니다. 대기 시간을 줄이고 ISR 서비스 빈도를 늘리려는 다른 모든 시도가 실패하면 FIQ 유일한 선택 (또는 더 나은 하드웨어 팀)이 될 수 있습니다.

a로 사용할 수도 있습니다 공황 일부 안전 중요한 응용 분야를 중단하십시오.

혼돈은 이미 잘 대답했지만 지금까지 다루지 않은 추가 지점은 FIQ가 벡터 테이블의 끝에 있다는 것입니다. 따라서 IRQ 벡터는 일반적으로 그 일을 시작하는 것이 일반적/전통적이라는 것입니다. (즉, 다른 곳으로 점프). 완전한 은신처 및 컨텍스트 스위치 직후에 추가 분기를 피하는 것은 약간의 속도 이득입니다.

FIQ는 우선 순위가 높으며 다른 IRQ를 처리하는 동안 도입 될 수 있습니다. 가장 중요한 자원은 FIQ에 의해 처리되고 나머지는 IRQ에 의해 처리됩니다.

또 다른 이유는 FIQ의 경우 스택에서 푸시하는 데 적은 레지스터가 필요하기 때문입니다. FIQ 모드는 R8에서 R14_FIQ 레지스터가 있습니다.

나는 이것이 당신이 찾고있는 것이라고 생각합니다.

http://newsgroups.derkeiler.com/archive/comp/comp.sys.arm/2005-09/msg00084.html

본질적으로, FIQ는 다수의 낮은 우선 순위 IRQ 소스에서 가장 우선 순위가 높습니다.

FIQ에 대한 마법은 없습니다. FIQ는 제공되는 다른 IRQ를 방해 할 수 있습니다. 이것이 바로 '빠른'이라고 불리는 이유입니다. 시스템은 이러한 인터럽트에서 더 빠르게 반응하지만 나머지는 동일합니다.

FIQ는 우선 순위가 높고 의심 할 여지없이 확실하지 않습니다. .

FIQ가 마침내 하나의 분기 명령어가 필요하지 않을 수도 있기 때문에 인터럽트 핸들러를 설계하는 방법에 따라 다릅니다. 또한 고유 한 R8-R14 레지스터 세트가 있으므로 다음에 FIQ 인터럽트로 돌아올 때 우리는 다음을 추진/팝업 할 필요가 없습니다. 스택. 물론 그것은 약간의주기를 절약하지만 다시 한 번 더 많은 핸들러가 하나의 FIQ를 제공하는 것은 현명하지 않으며 예 FIQ는 더 많은 우선 순위를 가지고 있지만 IRQ/FIQ 모두 동일한 CPU 주파수에서 인터럽트를 더 빨리 처리한다고 말하는 이유는 아닙니다. 따라서 그들은 같은 속도로 작동해야합니다.

이것은 틀릴 수 있습니다. 내가 아는 것은 FIQ가 빠른 인터럽트 요청을 나타내고 IRQ가 인터럽트 요청을 의미한다는 것입니다. 이 이름으로 판단하면 FIQ가 IRQ보다 더 빨리 처리 될 것이라고 생각합니다. 아마도 FIQ가 IRQ보다 프로세스를 더 빨리 방해하는 프로세서 설계와 관련이있을 것입니다. 내가 틀렸다면 사과하지만, 보통 더 높은 수준의 프로그래밍을하고 있습니다. 지금 당장 추측하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top