2010-06-27 4 views
1

다양한 센서에서 발생하는 인터럽트가 100 가지 더 많아지는 것을 고려하십시오. 모두가 동시에 발생할 수있는 기회가 있습니다. 소프트웨어를 어떻게 효율적으로 처리 할 수 ​​있습니까?많은 인터럽트 소스 처리

답변

7

대기 시간이나 처리량을 최적화하는 경우에 따라 다릅니다.

효율에 대해 물어 본 결과 처리량을 살펴 보았습니다. 이 경우, 하나의 검증 된 패턴은 인터럽트 처리기가 센서를 읽고 명령과 상태를 대기시킨 다음 즉시 반환하도록하는 것입니다.

비 인터럽트 소프트웨어 스레드가 대기열에서 명령을 선택하고 처리기에 이벤트를 알립니다. 이렇게하면 작업 전환 시간이 최소화됩니다. 도메인 특정 논리를 사용하여 명령 결합, 더 이상 관련이없는 명령 실행 등을 수행 할 수 있습니다.

이것은 기본적으로 윈도우 시스템 작동 방식입니다. 각 마우스 클릭, 마우스 이동, 키보드 누름 등은 명령이 대기열에 들어가게합니다. 윈도우 시스템은 명령을 해제하고 해당 처리기를 호출합니다. 대기열에서 빠져 나온 시간과 관련이없는 명령을 던지거나, 명령을 결합하거나, 신속하게 처리하기위한 광범위한 논리가 있습니다.

네트워크 스택은 동일한 모델을 사용합니다. 패킷은 네트워크 레벨에 의해 큐에 넣어지며, 주 루프는 패킷을 선택하고 제어 모델의 반전을 사용하여 각 패킷을 처리합니다.

+0

네트워크 스택이 패킷을 처리하기 위해 뒤 따르는 접근법에 대해 흥미로운 점이 있습니다. –

+0

@sman : Hewlett Packard에서 생활하기 위해 사용되었습니다. 우리가 발견 한 흥미로운 점 중 하나는 RTOS의 작업 전환 시간이 우리를 죽였다는 것입니다. 매우 간단한 아키텍처로 마무리되었습니다. 각 레이어는 헤더를 파싱 한 후 다음 레이어로 호출합니다. 인터럽트 핸들러는 단순히 하드웨어 버퍼를 비우고 패킷을 큐에 넣고 "주의가 필요함"세마포를 설정합니다. – Rob

2

일반적으로 인터럽트 핸들러는 인터럽트를 처리하기 위해해야 ​​할 일을 거의하지 않아야합니다. 가능한 한 짧게 유지하십시오.

예를 들어 장치가 직렬 포트에서 메시지를 받아서 응답해야하는 경우 : UART 직렬 RX 인터럽트 처리기는 들어오는 바이트를 읽고 버퍼에 저장해야합니다 (버퍼가 없는지 확인) 과다). 그게 전부 야. 그런 다음 주 루프 작업은 나중에 버퍼의 데이터를 처리하고 버퍼에 응답을 만들어 직렬 TX 인터럽트 처리기에서 전송할 수 있도록해야합니다.

이전에는 인터럽트 처리기가 전체 통신 프로토콜 처리를 수행하는 임베디드 소프트웨어를 보았습니다. 작동했지만 인터럽트 처리기가 실행되는 데 오랜 시간이 걸렸으므로 다른 인터럽트 처리기가 실행되지 않았습니다. 이로 인해 다른 인터럽트 처리기가 이벤트를 처리하지 못할 위험이 커집니다.

2

시스템에 실제로 간섭 소스가 100 개있는 경우 효율이 유일한 문제는 아닐 수 있습니다. 최악의 경우 요구 사항을 충족시키지 않으려면 "중단 분석"을 수행해야 할 수 있습니다.

먼저 각 ISR의 최악의 시간을 측정하십시오. 그런 다음, 각각의 X 인터럽트 :

  1. 마감일 결정 : 인터럽트 X에 발생하는 재해 사이에 경과 할 수있는 최대 시간입니다 무엇을 (등, 통신 창 누락, 데이터 손실 등 ...)
  2. 결정을 인터럽트 서비스 X를 보류 할 수있는 다른 ISR의 최악의 시나리오. 프로세서의 우선 순위 구조에 따라 X 직전에 발생하는 인터럽트와 X가 보류 중일 때 발생하는 인터럽트를 고려해야 할 수 있습니다.
  3. 2 단계에서 식별 한 ISR의 모든 시간을 추가하십시오. 합계가 기한보다 길면 다시 디자인해야합니다.재 설계의 ISR은 신속하게 FIFO을 조정하는 것을 포함 할 수있다

그래서 어떤 인터럽트가 동시에 발생하지 않는 것이 보증되는 순서를 조정 (이하 종종 더 많은 데이터를 수집 또는 그 반대)의 인터럽트 주파수를 변경 길이. 모든 전략에 꼭 맞는 크기는 없습니다. (더 빠른 ISR은 거의 항상 좋은 것입니다.)

관련 문제