Micro COSII 5 Semaphores ITISN Technical Lab 1
Micro. C/OS-II 5. Semaphores ㈜아이티즌 기술연구소 ITISN Technical Lab 1
이벤트 컨트롤 블록(ECB) 자료구조 typedef struct { INT 8 U OSEvent. Type; 사용 용도를 나타냄 OS_EVENT_TYPE_SEM OS_EVENT_TYPE_MUTEX OS_EVENT_TYPE_MBOX OS_EVENT_TYPE_Q INT 8 U OSEvent. Grp; 대기중인 태스크의 우선순위 그룹 INT 16 U OSEvent. Cnt; 세마포어의 경우 : 카운트 뮤텍스의 경우 : PIP void * OSEvent. Ptr; INT 8 U OSEvent. Tbl[…]; } OS_EVENT; 구조체를 가리키는 포인터 (단, 메시지 박스나 큐인 경우) OS_EVENT_TYPE_MBOX OS_EVENT_TYPE_Q 이벤트를 대기중인 태스크의 목록 ITISN Technical Lab 11
태스크, ISR, 세마포어의 관계 태스크 OSSem. Create() OSSem. Accept() OSSem. Del() OSSem. Pend() OSSem. Post() OSSem. Query() 태스크 또는 N ISR N OSSem. Post() OSSem. Del() 사용X OSSem. Accept() ISR OSSem. Pend() 사용X ITISN Technical Lab 13
4. 세마포어 반환 - OSSem. Post() INT 8 U OSSem. Post( OS_EVENT * pevent ); // 리턴: 에러코드 OS_NO_ERR OS_SEM_OVF OS_SEM_EVENT_TYPE OS_SEM_PEVENT_NULL // 세마포어 포인터 세마포어로 정상적 신호 전송 완료 세마포어 값이 범위를 넘을 경우 pevent가 세마포어를 가리키지 않을 경우 pevent가 NULL포인터 일 경우 void Task. X(void * pdata) { INT 8 U err= OSSem. Post(Disp. Sem); switch(err){ case OS_NO_ERR: break; } } ITISN Technical Lab 18
6. 세마포어 상태 얻기 - OSSem. Query() INT 8 U OSSem. Query( 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 구조체 멤버 INT 16 U OSCnt; // 현재 세마포어 값 INT 8 U OSEvent. Tbl[OS_EVENT_TBL_SIZE]; // 대기 테이블 INT 8 U OSEvent. Grp; // 대기 그룹 ITISN Technical Lab 20
- Slides: 20