2010-12-02 5 views
3

Vxworks에서는 상호 퇴화 세마포어를 ISR 내부에 지정할 수 없으며 조건은 바이너리 및 카운팅 세마포를 위해 사용할 수 있습니다.왜 ISX에서 뮤텍스를 해제 할 수 없는지

같은 이유를 이해할 수 없습니다.

감사합니다. Zaks.

답변

8

뮤텍스 을 먼저 취득/취득해야 함을 기억하십시오. 다음이 릴리스/부여됩니다. 또한 mutex를 얻는 작업 을 소유하고 있습니다. 이것은 다른 태스크가 소유하지 않은 뮤텍스를 해제하는 것을 방지합니다.

그렇다면 ISR이 뮤텍스 (또는 그 문제에 대한 세마포어를 차단할 수 없으므로)를 획득 할 수 없으므로 뮤텍스를 제공 할 수 없다는 것이 명백합니다.

ISR이 일을 신호로 보내려면 바이너리 또는 카운팅 세마포를주는 것이 가능합니다. 그러나 뮤텍스는 항상 한 쌍을주고 받는다.

요점을 명확히하기. VxWorks에서 ISR 컨텍스트는 이 아니며이 작업 컨텍스트와 같습니다!
다음 시나리오는 유효하지 않습니다

 
    Task A   ISR 
    semTake(mutex) 
    .... 
        semGive(mutex) 

태스크 A 뮤텍스를 소유하고있다. ISR이 실행되면 완전히 다른 상황에서 실행됩니다. 대부분의 현재 프로세서에는 별도의 ISR 스택이 있습니다. 작업 A가 뮤텍스를 소유하고 있기 때문에 ISR이 어떻게 그것을 포기할 수 있습니까? 사실 A가 뮤텍스를 가지고있는 동안 ISR이 발사한다는 보장은 무엇입니까?

 
Task A      Task B     ISR 
    semTake(mutex) 
    ... 
    <context switch happens> 
           <B runs> 
                semGive(mutex) 

태스크 A 인해 뮤텍스 관련이없는 전화로 바꿔, 및 작업 B가 실행됩니다 :
심지어 다음과 같은 시나리오를 처리 할 방법, 당신은 ISR에 뮤텍스를 줄 "수"가정. 이제 B가 실행되는 동안 ISR이 실행됩니다. ISR이 주어지면 여전히 유효할까요?

이 모든 것에 관계없이 단순한 사실은 뮤텍스가 항상 한 쌍의 Get/Set에서 사용된다는 것입니다. 나는 고립 된 semGive가있는 유스 케이스를 보지 못했다.

ISR 컨텍스트에서 semGive가 필요하다는 특정 상황이 있습니까?

+0

ISR에서 어떤 세마포어도 가져 오지 말아야한다는 의견에 동의하지만 뮤텍스 캔트의 경우 동일한 태스크가 이전에 가져온 것과 동일한 작업을 릴리스합니다. 따라서 "뮤텍스는 ISR 내에서 공개 될 수 없습니다"라는 말은 잘못된 것입니다. – Zaks

+0

아니요 특정 상황을 기각하지 않습니다. 위의 상태를 나타내는 Vxworks 프로그래머 가이드를 거치면서 ISR이 다른 컨텍스트에서 실행된다는 것을 알지 못했습니다. – Zaks

관련 문제