해결된 질문
작성
·
351
1
5번 SEM 예제에서
Main Task 우선순위 20, Task1 우선순위10인 상태에서
Main Task에서 Task1을 생성한 후 Main Task가 끝나기 전에 Task1이 실행되는 원리가 궁금합니다.
강의 내용을 보면
Main Task 에서 호출하는 xSemaphoreTake() 함수내부에 현재 진행중인 MainTask를 휴면상태로 만드는 부분이 존재하고 다음 우선순위의 Task를 찾아 실행하는 부분이 존재한다고 설명을 해주시는데
하지만 이해가 안가는 부분은
xSemaphoreTake()함수의 인자에 xQUEUE 구조체 형식인 sem_id 전달한것 뿐인데
동작중인 Task 또는 handle에 대한 정보를 어떻게 알고 현재 실행중인 Task(MainTask)가 휴면상태로 가는지 모르겠습니다.
xQUEUE 구조체를 확인해봤지만 단서가 될만한건 못찾겠습니다.
답변 1
0
안녕하세요. 김영선님!
xSemaphoreTake 함수는
커널 소스 <queue.c> 의 xQueueSemaphoreTake 함수를 실행합니다.
1380 BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait )
...
1532 vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );
1533 prvUnlockQueue( pxQueue );
1534 if( xTaskResumeAll() == pdFALSE )
1535 {
1536 portYIELD_WITHIN_API();
1537 }
1538 else
1539 {
1540 mtCOVERAGE_TEST_MARKER();
1541 }
1532라인 vTaskPlaceOnEventList 함수에 의해 'TaskMain' 은 휴면하게 되죠.
1536라인에 의해 문맥전환이 발생하니 IdleTask 가 실행하겠죠.
이후 'xSemaphoreGive 함수에 의해 해당 'TaskMain' 은 휴면상태에서 깨어날 것입니다.
이 모든 내용은 디버깅(TRACE)을 통해 직접 확인해 보실 수 있습니다. ^^