2012-09-22 27 views
1

SMP 지원 VxWorks에서 실행되는 우선 순위가 다른 두 개의 작업 'A'와 'B'가 있다고 가정합니다. 'A'와 'B'는 모두 I/O 장치 (예 : 디스크 또는 NIC)에 명령을 내리고 결과를 기다리는 것을 차단합니다. 즉, 'A'와 'B'가 동시에 차단됩니다. 잠시 후 I/O 장치가 인터럽트를 발생시키고 ISR이 호출됩니다. 그런 다음 ISR은 지연된 작업 (일명 "bottom-half")을 작업자 작업으로 보냅니다. 질문 : 작업 - 작업의 우선 순위는 무엇입니까?VxWorks는 인터럽트 반쪽의 우선 순위를 어떻게 결정합니까?

VxWorks 장치 드라이버 개발자 가이드는 다소 모호합니다. 작업자 - 작업의 우선 순위는 선험적으로 설정되어있는 것처럼 보입니다. 결과를 기다리는 것이 차단 된 작업 ('A'및 'B')의 우선 순위에 따라 작업자 작업의 우선 순위를 높이는 자동 상속 메커니즘이 없습니다. 이는 PREEMPT_RT Linux에서 스레드 인터럽트 우선 순위가 작동하는 방식과 유사합니다. 그러나 QNX Neutrino와 LynxOS는 차단 된 작업의 우선 순위를 최대로하여 작업자 작업을 예약합니다. 예. 우선 순위 (작업자) = max_priority (A, B).

누구에게 문의 할 수 있습니까?

답변

1

정확하게 "ISR 파견 지연 작업"이 사용하는 메커니즘에 따라 다릅니다.

세마포/messageQueue/이벤트가 사용되면 수신 태스크 (A 또는 B)는 태스크가 작성 될 때 지정된 우선 순위로 실행됩니다. 이 시나리오에서는 기본적으로 인터럽트가 완료되고 작업 (A 및/또는 B)을 실행할 준비가되었습니다.

어떤 작업이든 우선 순위가 가장 높은 작업이 실행되어 작업을 수행하게됩니다. 태스크는 인터럽트 컨텍스트의 정보에 액세스 할 수 없습니다. 전역 구조 (yuk)를 사용하거나 메시지 대기열을 통해 데이터를 전달하는 경우 작업은 해당 요소에 액세스 할 수 있습니다.

네트워크 스택 태스크 (tNetTask)는이 접근법을 사용하고 패킷이 수신되면 세마포어가 tNetTask에 신호를 보냅니다. tNetTask가 패킷 (패킷 재 조립 등)을 처리하면 대응하는 소켓에서 대기중인 작업으로 전달됩니다.

ISR에서 작업을 tExcTask로 연기 할 수 있습니다 (excJobAdd 호출을 통해). 이 방법을 사용하면 excJobAdd가 함수에 대한 포인터를 가져 와서 tExcTask (시스템에서 가장 높은 우선 순위에 있음)의 컨텍스트에서 함수를 실행합니다. 자체 포함 작업이 아닙니다.

파일 시스템, SCSI 드라이버, USB 등과 같은 것들은 인터럽트가있는 단순한 드라이버 이상의 것임을 유의하십시오. 여기에는 불행하게도 복잡성을 증가시키는 다양한 구성 요소가 포함됩니다.

+0

"tNetTask가 패킷을 처리 (패킷 재조합 등)하면 대응하는 소켓에서 대기중인 작업으로 전달됩니다." tNetTask는 어떤 우선 순위로 스케줄됩니까? tNetTask는 자체 할당 된 우선 순위로 실행합니까? 아니면 소켓에서 대기중인 작업 중 하나에서 우선 순위를 상속합니까? 이것이 내가 정말로 알아 내려고하는 것입니다. – Glenn