OSSemCreate() : 세마포어 생성
OSSemPost()
OSSemPend()
OSSemAccept()
OSSemQuery()
semaphore가 0이하일 경우 대기상태에 빠진다.
OS_EVENT* sem;
sem = OSSemCreate(1);
OSSemPend(sem, 0, &err);
/*
critical section
*/
OSSemPost(sem);
OS_EVENT* sem;
sem = OSSemCreate(0); //생성부터 waiting
OS_EVNET *OSSemCreate(INT16U cnt){
OS_EVENT *pevent;
OS_ENTER_CRITICAL();
/*FreeList로 부터 ECB 하나를 얻는다.*/
pevent = OSEventFreeList;
if (OSEventFreeList != (OS_EVENT *) 0) {
OSEventFreeList = (OS_EVENT *) OSEventFreeList->OSEventPtr;
//FreeList의 다음 포인터가 다음 ECB를 가르키도록 한다.
}
OS_EXIT_CRITICAL();
if (pevent != (OS_EVENT *) 0) {
pevent->OSEventType = OS_EVENT_TYPE_SEM;
pevent->OSEventCnt = cnt;
OSEventWaitListInit(pevent);
}
return (pevent);
}
wait(S){
while(S <= 0) {S--;}
}
signal(S){
S++;
}