[FreeRTOS] Semaphore (세마포어)

 

Semaphore (세마포어) 로 할 수 있는 일

1. 상호 배제 (Mutual Exclusion)

2. 프로세스간 통신 (IPC)

3. 동기화 (Synchronization)


아래 예제는 유명한 생산자-소비자 동기화를 다루고 있음.

우선순위가 높은 소비자 프로세스가 먼저 실행 되어 세마포어 획득 시도를 하지만  생산 된 아이템이 없으므로 blocked 상태로 들어가게 됨.

그 다음에 생산자 프로세스가 깨어나 아이템 생산 후, 연산을 하면 소비자 프로세스를 깨어나게 되고,

소비자 프로세스는 아이템을 가져와서 소비한 뒤 다시 세마포어 획득 시도를 하게 되고 blocked 상태로 들어가게 됨.

우선순위가 낮은 생산자 프로세스에서 로직을 컨트롤 할 수 있게 된다.


Semaphore API


  • 세마포어 생성
void vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
또는
SemaphoreHandle_t xSemaphoreCreateBinary( )
SemaphoreHandle_t sem_handle;


void Task(void *pvParameters)
{
    vSemaphoreCreateBinary(sem_handle); 
        
    // or
    
    sem_handle = xSemaphoreCreateBinary( );
    
    
    // 세마포어 할당에 실패하는 경우도 있으니, 꼭 체크 해 주자.
    if(sem_handle == NULL)
    {
    	/* There was insufficient FreeRTOS heap available for the semaphore to be created succesffully. */
    }
}


  • P 연산 (세마포어 획득)
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);

// # xSemaphore : 세마포어 핸들
// # xTicksToWait : 'TICK' 단위 blocked 상태에서 기다리는 시간. Timeout 되면 세마포어 상관 없이 깨어남

// # Return
//  pdPASS(1)  : 세마포어 획득에 성공한 경우에 반환 되는 값
//  pdFALSE(0) : 세마포어를 성공적으로 얻지 못하면 반환 되는 값.
//               세마포어를 사용할 수 있게 될 때 까지 지정 된 시간 만큼 blocked 상태로 기다림.


  • V 연산 (세마포어 반납)
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore);

// # xSemaphore : 세마포어 핸들

// # Return
//  pdPASS(1) : 세마포어 반납이 성공하였을 때의 리턴 값
//  pdFAIL(0) : 세마포어 반납에 실패하였을 떄의 리턴 값
//              세마포어를 획득 하고 있어야, 반납이 가능 함.





이 블로그의 인기 게시물

Crusader Kings 3 - Converting DNA code using Portrait Editor