제로 부터 UCOSII 운영 체제 학습 10 - 메시지 메 일
4075 단어 UCOSII제로 부터 의 학습 UCOSII
1. 메시지 메 일이 무엇 입 니까?
UCOSII 의 또 다른 통신 메커니즘 은 하나의 작업 을 중단 하거나 서비스 서브루틴 을 중단 하여 다른 작업 에 지침 형의 변 수 를 보 낼 수 있 으 며, 일반적으로 지침 은 메 시 지 를 포함 하 는 특정한 데이터 구 조 를 가리킨다.
6 가지 메 일 을 조작 하 는 인터페이스 함 수 를 제공 합 니 다: OSMbox Create (): 메 일 을 만 드 는 것 은 메 일 을 초기 화 하 는 함수 인 OSMbox Pend (): 메 일 을 요청 하 는 함수, 즉 메 일 을 보 내지 않 으 면 계속 기다 리 는 상태 입 니 다.OSMbox Post (): 메 일의 함 수 를 받 고 메 일의 내용 을 받 으 면 메 일의 대기 목록 에서 제거 하고 작업 을 준 비 된 목록 에 들 어 갈 수 있 습 니 다.OSMboxPostOpt():
OSMbox Accept (): 기다 리 지 않 는 메 일 인터페이스
OSMbox Query (): 메 일 박스 인터페이스 조회
2. 메 일 은 어떻게 사용 하나 요?
작업, 서비스 서브루틴 과 메 일 간 의 관 계 를 중단 합 니 다. 모래시계 는 OSMbox Pend () 가 정의 하 는 시간 초과 시간 을 표시 합 니 다.메 일 에 포 함 된 내용 은 메 시 지 를 가리 키 는 지침 입 니 다.포인터 가 가리 키 는 내용 은 지정 할 수 있 습 니 다.PS: 하나의 메 일 에는 이러한 지침 (메 일이 가득 찼 을 때) 이나 NULL 을 가리 키 는 지침 (메 일이 비어 있 을 때, 모든 내용 을 가리 키 지 않 음) 만 포 함 됩 니 다.
몇 시 에 주 의 했 어 요?작업 과 인 터 럽 트 서비스 서브루틴 은 함수 OSMbox Post () 나 OSMbox Postopt () 를 호출 할 수 있 지만 작업 만 OSMbox Del (), OSMbox Pend (), OSMbox Query () 함 수 를 호출 할 수 있 습 니 다.
응용 프로그램 은 여러 개의 메 일 을 사용 할 수 있 습 니 다. 가장 큰 수 는 OS 입 니 다.CFG. h 파일 의 설정 상수 OSMAX_EVENTS 설정.
3. 메 일 을 사용 하 는 API 함수
(1) 메 일 을 만 드 는 함수 OSMbox Pend (): 메 일 을 사용 하기 전에 메 일 을 만들어 야 합 니 다. 이 작업 은 OSMbox Create () 함 수 를 호출 하여 완성 할 수 있 고 포인터 의 초기 값 을 정의 할 수 있 습 니 다. 일반적인 상황 에서 이 초기 값 은 NULL 이지 만 메 일 을 초기 화 할 때 메 일 을 포함 할 수도 있 습 니 다.
OS_EVENT *OSMboxCreate(void * msg)
{
OS_EVENT * pevent; //
pevent = OSEventFreeList; //
if(OSEventFreeList != (OS_EVENT *)0)
{
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
if(pevent != (OS_EVENT *)0)
{
pevent->OSEventType = OS_EVENT_TYPE_MBOX;
pevent->OSEventCnt = 0; //
pevent->OSEventPtr = msg;
OS_EventWaitListInit(pevent);
}
return (pevent);
}
(2) 메 일 메시지 기다 리 기 OSMBoxPend ()
PS: 주의해 야 할 것 은 메 일 에 메시지 가 있 으 면 메 일 에서 이 메 시 지 를 꺼 내 호출 함수 에 되 돌려 주 고 NULL 포인 터 를 메 일 에 저장 하 는 동시에 OSMbox Pend () 함수 가 어 쩔 수 없 는 코드 를 호출 함수 에 되 돌려 줍 니 다. 이 반환 결 과 는 다른 작업 이나 서비스 중단 서브루틴 에서 메 일 로 메 시 지 를 보 냈 음 을 나타 냅 니 다.OSMbox Pend () 함 수 를 가장 빨리 실행 하 는 경우 이기 도 하 다.
메 일이 비어 있 으 면 OSMbox Pend 함 수 를 호출 하 는 작업 은 수면 상태 로 들 어가 다른 작업 을 기다 리 고 메 일 로 메 시 지 를 보 냅 니 다.이 작업 이 메 일 메 시 지 를 무기한 기다 리 는 것 을 피 할 수 있 도록 최 장 대기 시간 을 매개 변수 로 정의 할 수 있 습 니 다.
void * OSMboxPend(OS_Event *pevent, INT16U timeout,INT8U *err)
{
void *msg;
msg = pevent->OSEventPtr;
if(msg != (void *)0)
{
pevent->OSEventPtr = (void *)0;
OS_EXIT_CRITICAL();
* err = OS_NO_ERR;
return msg;
}
// :
OSTCBCur->OSTCBStat |= OS_STAT_MBOX;
OSTCBCur->OSTCBDly = timeout;
OSEventTaskWait(pevent);
OS_EXIT_CRITICAL();
msg = OSTCBCur->OSTCBMsg;
if(msg != (void *)0)
{
OSTCBCur->OSTCBMsg = (void *)0;
OSTCBCur->OSTCBStat = OS_STAT_RDY;
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
*err = OS_NO_ERR;
return msg;
}
}
(3) 메 일 에 메시지 보 내기 OSMbox Post ()
INT8U OSMboxPost(OS_EVENT * pevent, void *msg)
{
//
if(pevent->OSEventGrp != 0x00)
{
//
OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);
//
OS_Sched();
return (OS_NOE_ERR);
}
if(pevent->OSEventPtr != (void *)0)
{
// ,
return OS_MBOX_FULL;
}
// ,
pevent->OSEventPtr = msg;
OS_EXIT_CRITICAL();
return OS_NO_ERR;
}
4. 메 일 박스 를 어떻게 사용 하여 시간 을 연장 합 니까?
메 일의 대기 시간 초과 기능 은 OSTimeDly () 함수 의 지연 시간 을 모방 할 수 있 습 니 다. 지정 한 시간 대 TIMEOUT 에 메시지 가 오지 않 으 면 Task 1 함수 가 계속 실 행 됩 니 다. 실질 적 으로 이것 은 OSTimeDly (TimeOUT) 내 에 메시지 가 오지 않 습 니 다.
Task 2 가 지정 한 시간 이 끝나 기 전에 이 메 일 에 Dummy 메 시 지 를 보 내 면 Task 1 은 함수 OSTimeDly Resume () 을 호출 하 는 기능 과 같 습 니 다.
메모: 다른 작업 이나 서비스 서브루틴 에서 메 시 지 를 받 을 필요 가 없 기 때문에 되 돌아 오 는 메시지 에 대한 검 사 를 무시 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제로 부터 UCOSII 운영 체제 학습 10 - 메시지 메 일6 가지 메 일 을 조작 하 는 인터페이스 함 수 를 제공 합 니 다: OSMbox Create (): 메 일 을 만 드 는 것 은 메 일 을 초기 화 하 는 함수 인 OSMbox Pend (): 메 일 을 요청 하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.