Presentation is loading. Please wait.

Presentation is loading. Please wait.

5. Semaphores ㈜아이티즌 기술연구소

Similar presentations


Presentation on theme: "5. Semaphores ㈜아이티즌 기술연구소"— Presentation transcript:

1 5. Semaphores ㈜아이티즌 기술연구소
MicroC/OS-II 5. Semaphores ㈜아이티즌 기술연구소 ITISN Technical Lab

2 5. 상호배제(Mutual Exclusion) 기능 1/6
상호배제의 필요성 공유자원의 사용 시 태스크간 충돌 방지 목적 예) 공중화장실은 한번에 한 명만 들어가도록 문고리가 필요함 공유자원(Shared Resource) 여러 태스크가 함께 사용할 수 있는 자원 태스크간의 가장 쉬운 정보 교환 수단 경쟁 환경에 놓여(Race Condition) 상호배제 필요 공유자원의 독점 액세스 방법 인터럽트 비활성화/활성화 Test-And-Set(TAS) 스케줄링 locking/unlocking// 다른테스크(?)의 진입을 막는다 세마포어, 메시지 메일박스, 메시지 큐 ITISN Technical Lab

3 5. 상호배제(Mutual Exclusion) 기능 2/6
1. 인터럽트 비활성화/활성화 uC/OS-II 매크로를 이용한 인터럽트 비활성화/활성화 OS_ENTER_CRITICAL / OS_EXIT_CRITICAL 두 태스크간 혹은 태스크와 ISR이 자료를 공유할 때 사용 가장 쉬우면서 빠른 방법(단, 비활성화 시간 너무 길지 않도록 해야 함) void Function (void) { OS_ENTER_CRITICAL(); // 임계영역 진입 . . /* 여기서 공유 데이터를 액세스할 수 있다*/ OS_EXIT_CRITICAL(); // 임계영역 탈출 } 임계 영역(Critical Section) - 한번 진입하면 완료될 때 까지 방해 받지 않는 코드의 영역 - Multi thread 작업 시 상호 배제 목적으로 사용 ITISN Technical Lab

4 5. 상호배제(Mutual Exclusion) 기능 3/6
2. TAS 동작 방식(Test-And-Set Operation) 전역변수를 이용한 자원 접근 제어 전역변수 사용 중 인터럽트 걸리지 않도록 하는 방식 커널에 의지하지 않은 공유자원 사용 가능 인터럽트 비활성화; if (전역변수==0) // 자원 사용 가능 { 전역변수=1; // 전역변수에 사용 중 표시 인터럽트 활성화; 자원 액세스; // 공유자원의 사용 전역변수=0; // 전역변수에 사용 완료 표시 } Else // 자원 사용 불가 인터럽트 활성화; // 나중에 다시 시도 ITISN Technical Lab

5 5. 상호배제(Mutual Exclusion) 기능 4/6
3. 스케줄러 locking/unlocking 스케줄링을 막아서 다른 태스크의 실행을 막는다. OSSchedLock()/ OSSchedUnlock() 항상 쌍으로 사용해야 함 사용시 주의 요함! 태스크가 OSSchedLock() 호출한 뒤 태스크 대기상태로 만드는 함수 OSTimeDly(), OSTimeDlyHMSM(), OSTaskSuspend(), OSSemPend()를 호출하면 안됨 => 시스템 다운 void Function (void) { OSSchedLock(); // 스케줄러 비활성화 . . /* 여기서 공유 데이터를 액세스할 수 있다 다른 태스크 실행 불가 */ OSSchedUnlock(); // 스케줄러 활성화 } ITISN Technical Lab

6 5. 상호배제(Mutual Exclusion) 기능 5/6
4. 세마포어(0을 포함한 양의 정수) 커널이 제공하는 자료구조 “저에게 열쇠를 주세요. 누가 쓰고 있으면 기다리겠습니다.” 세마포어 ITISN Technical Lab

7 5. 상호배제(Mutual Exclusion) 기능 6/6
세마포어의 3단계 동작 과정 INITIALIZE: 세마포어 초기값 설정 WAIT: 세마포어 유효성 검사: 0 보다 크면 사용 가능함 세마포어를 1 감소 시키고 태스크 계속 실행 세마포어가 0일 경우: 대기목록에 기록하고 기다림 SIGNAL: 세마포어의 사용 완료를 알림 가장 우선순위가 높은 태스크  세마포어 우선획득 OS_EVENT * SharedDataSem; // INITIALIZE Void Function (void) { INT8U err; OSSemPend(SharedDataSem, 0, &err); // WAIT /* 공유 자원 사용 (인터럽트 허용됨) */ OSSemPost(SharedDataSem); // SIGNAL } ITISN Technical Lab

8 세마포어 기능 두 종류의 세마포어 2개의 구성요소 공유자원에의 접근제어(상호배제)// 공유매모리 접근제어 이벤트 발생의 통보
두 개의 태스크 간 통신에서 수신(읽기)과 발신(쓰기)을 동기 화 시킴 두 종류의 세마포어 바이너리 세마포어 : 0, 1 // 상호배제 때 사용 카운팅 세마포어 : 0 ~ 같은 종류인 n개의 자원// 메모리 나눔 2개의 구성요소 16비트 unsigned 정수 : 세마포어 카운트를 저장 (2의 16승=655535개) 태스크 리스트 : 세마포어 카운트가 0보다 크게 되기를 기다리 는 태스크들(우선순위가 높은 태스크가 실행) ITISN Technical Lab

9 세마포어의 구성요소 세마포어 카운트값(0~65535)을 갖는 16비트의 부호 없는 정수
세마포어 카운트 값이 0보다 커질 때를 기다리고 있는 태스크의 대기 리스트 세마포어 값 예) 1-> 바이너리 <세마포어와 관련된 ECB> 세마포어 자료형 ITISN Technical Lab

10 이벤트 컨트롤 블록(ECB:Event Controll Block) 개요
이벤트 컨트롤 블록의 사용(책153, 154참조) ISR과 태스크, 태스크와 태스크간의 상호작용 관리 목적 커널 오브젝트 (OS_EVENT 구조체) 세마포어, 뮤텍스, 메일박스, 메지 큐의 구현 기본 요소 ISR 태스크 ECB (1)신호전송 (2)신호 기다림 (3)선택적 신호대기 타임아웃 설정 태스크 ECB ISR (1)신호 (2)대기 태스크 ECB(세마포어) (4)대기/신호 (3)타임아웃 ITISN Technical Lab

11 이벤트 컨트롤 블록(ECB) 자료구조 typedef struct { INT8U OSEventType;
INT8U OSEventGrp; INT16U OSEventCnt; void * OSEventPtr; INT8U OSEventTbl[…]; } OS_EVENT; 사용 용도를 나타냄 OS_EVENT_TYPE_SEM OS_EVENT_TYPE_MUTEX OS_EVENT_TYPE_MBOX OS_EVENT_TYPE_Q 대기중인 태스크의 우선순위 그룹 세마포어의 경우 : 카운트 뮤텍스의 경우 : PIP 구조체를 가리키는 포인터 (단,메시지 박스나 큐인 경우) OS_EVENT_TYPE_MBOX OS_EVENT_TYPE_Q 이벤트를 대기중인 태스크의 목록 ITISN Technical Lab

12 ECB 자유 리스트 자유리스트를 이용한 빠른 메모리 관리 이벤트 생성 시 노드 1개 빼서 제공
이벤트 종료 시 노드를 리스트에 추가 이벤트 종류: 세마포어, 뮤텍스, 메일박스, 메시지큐 .OSEventType .OSEventCnt .OSEventPtr .OSEventGrp 6 5 4 7 3 2 1 62 61 60 63 59 58 57 56 OSEventFreeList ITISN Technical Lab

13 태스크, ISR, 세마포어의 관계 OSSemPend() 사용X OSSemDel() 사용X 태스크 태스크 또는 N N ISR
OSSemCreate() OSSemDel() OSSemPost() OSSemAccept() OSSemPend() OSSemQuery() 태스크 태스크 또는 N N ISR ISR OSSemPost() OSSemAccept() OSSemDel() 사용X OSSemPend() 사용X ITISN Technical Lab

14 세마포어 관련 연산 세마포어 생성 - OSSemCreate() 세마포어 삭제 - OSSemDel()
세마포어 대기 - OSSemPend() // 블러킹 함수 세마포어 반환 - OSSemPost() 세마포어 대기 없이 얻기 - OSSemAccept()// nonblocking 함수 (세마포어 받는 함수) 세마포어 상태 얻기 - OSSemQuery() ITISN Technical Lab

15 1. 세마포어 생성 - OSSemCreate()
OS_EVENT * OSSemCreate( INT16U value // 세마포어 초기 값(0~65,535) ); // 리턴값: 세마포어로 할당된 ECB의 포인터, 에러 시 NULL 반환 1. OS_SEM_EN 활성화 해야 사용 가능 2. 세마포어를 생성하고 초기화 한다. OS_EVENT * DispSem; Void main(void) { OSInit(); // uC/OS-II 초기화 DispSem = OSSemCreate(1); // 세마포어 생성 OSStart(); // 멀티태스킹 시작 } ITISN Technical Lab

16 2. 세마포어 삭제 - OSSemDel() OS_EVENT * OSSemDel( OS_EVENT * pevent, // 삭제할 세마포어 포인터 INT8U opt, // OS_DEL_NO_PEND(대기 작업 처리 후 삭제) // OS_DEL_ALWAYS(무조건 삭제) INT8U *err // 에러코드를 가리키는 포인터 ); 리턴값: NULL(성공 시), 실패 시 다음과 같이 err에 에러 정보 OS_NO_ERR // 정상 삭제 OS_ERR_DEL_ISR // ISR에서 세마포어 삭제를 시도한 경우 OS_ERRINVALID_OPT // 옵션을 잘못 지정한 경우 OS_ERR_TASK_WAITING // 대기중인 태스크가 있을 경우 OS_ERR_EVENT_TYPE // pevent가 세마포어를 가리키지 않는 경우 OS_ERR_PEVENT_NULL // NULL 포인터를 넘겨준 경우 (예) DispSem= OSSemDel(DispSem, OS_DEL_ALWAYS, &err); ITISN Technical Lab

17 3. 세마포어 대기 - OSSemPend() void OSSemPend( OS_EVENT * pevent, // 세마포어 포인터 INT16U timeout, // 최대 대기 시간(최대 65,535 클럭틱) INT8U *err // 에러코드 포인터 ); 1. 공유자원에 접근할 때 대기 줄에서 기다린다. 2. err의 종류 OS_NO_ERR 세마포어 획득 성공 OS_TIMEOUT 기다리다 지쳤음 OS_ERR_EVENT_TYPE pevent가 세마포어를 가리키지 않음 OS_ERR_PEND_ISR ISR에서 호출 시 에러 발생 OS_ERR_PEVENT_NULL pevent가 NULL 포인터일 경우 (예) OSSemPend(DispSem, 0, &err); 우선순위가 높은 태스크가 끝날때까지 기다림 // 세마포어가 신호를 받는 경우만 다음 라인이 실행된다. ITISN Technical Lab

18 4. 세마포어 반환 - OSSemPost() INT8U OSSemPost( OS_EVENT * pevent // 세마포어 포인터 ); // 리턴: 에러코드 OS_NO_ERR 세마포어로 정상적 신호 전송 완료 OS_SEM_OVF 세마포어 값이 범위를 넘을 경우 OS_SEM_EVENT_TYPE pevent가 세마포어를 가리키지 않을 경우 OS_SEM_PEVENT_NULL pevent가 NULL포인터 일 경우 void TaskX(void * pdata) { INT8U err= OSSemPost(DispSem); switch(err){ case OS_NO_ERR: break; } ITISN Technical Lab

19 5. 세마포어 대기없이 얻기 - OSSemAccept()
INT16U OSSemAccept( OS_EVENT * pevent // 세마포어 포인터 ); // 리턴값: 세마포어가 0보다 클 경우 1 감소, 이전 값 리턴 // 사용할 수 없는 경우 0 리턴 1. 자원 사용 가능여부, 이벤트 발생 여부 확인 용도 2. 용도는 OSSemPend()와 유사하나 블럭되지 않음 - ISR내에서 세마포어 사용시 적합 OS_EVENT * DispSem; void Task(void * pdata) { INT16U value= OSSemAccept(DispSem); // 자원사용가능 여부확인 if(value>0) {} // 사용 가능하므로 계속 진행 } ITISN Technical Lab

20 6. 세마포어 상태 얻기 - OSSemQuery()
INT8U OSSemQuery( OS_EVENT *pevent, // 세마포어 포인터 OS_SEM_DATA *pdata // 정보를 받을 OS_SEM_DATA 포인터 ); // 리턴: 에러코드 OS_NO_ERR 호출이 성공한 경우 OS_ERR_EVENT_TYPE 세마포어 포인터가 아닌 경우 OS_ERR_PEVENT_NULL pevent가 NULL인 경우 OS_SEM_DATA 구조체 멤버 INT16U OSCnt; // 현재 세마포어 값 INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; // 대기 테이블 INT8U OSEventGrp; // 대기 그룹 ITISN Technical Lab


Download ppt "5. Semaphores ㈜아이티즌 기술연구소"

Similar presentations


Ads by Google