Vxworks에서는 상호 퇴화 세마포어를 ISR 내부에 지정할 수 없으며 조건은 바이너리 및 카운팅 세마포를 위해 사용할 수 있습니다.왜 ISX에서 뮤텍스를 해제 할 수 없는지
같은 이유를 이해할 수 없습니다.
감사합니다. Zaks.
Vxworks에서는 상호 퇴화 세마포어를 ISR 내부에 지정할 수 없으며 조건은 바이너리 및 카운팅 세마포를 위해 사용할 수 있습니다.왜 ISX에서 뮤텍스를 해제 할 수 없는지
같은 이유를 이해할 수 없습니다.
감사합니다. Zaks.
뮤텍스 은을 먼저 취득/취득해야 함을 기억하십시오. 다음이 릴리스/부여됩니다. 또한 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가 필요하다는 특정 상황이 있습니까?
ISR에서 어떤 세마포어도 가져 오지 말아야한다는 의견에 동의하지만 뮤텍스 캔트의 경우 동일한 태스크가 이전에 가져온 것과 동일한 작업을 릴리스합니다. 따라서 "뮤텍스는 ISR 내에서 공개 될 수 없습니다"라는 말은 잘못된 것입니다. – Zaks
아니요 특정 상황을 기각하지 않습니다. 위의 상태를 나타내는 Vxworks 프로그래머 가이드를 거치면서 ISR이 다른 컨텍스트에서 실행된다는 것을 알지 못했습니다. – Zaks