제로 부터 UCOSII 운영 체제 학습 10 - 메시지 메 일

제로 부터 UCOSII 운영 체제 학습 10 - 메시지 메 일
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 () 을 호출 하 는 기능 과 같 습 니 다.
메모: 다른 작업 이나 서비스 서브루틴 에서 메 시 지 를 받 을 필요 가 없 기 때문에 되 돌아 오 는 메시지 에 대한 검 사 를 무시 합 니 다.

좋은 웹페이지 즐겨찾기