페이지 선택

메시지 큐(message queue), 간단히 큐는 O/S에서 스레드 간에 통신/데이터를 교환할 수 있는 일반적인 수단을 제공하고 있다.

개발자들은 스레드 간의 통신 뿐만 아니라 어플리케이션에서 특별한 목적으로 여러 개의 큐(queue)를 생성하여 응용할 수도 있다.

 

 

미시지 큐는 일반적으로 구조체 형식으로 만들어져 있으며, 선입선출(FIFO)로  동작하는 경우가 많다.

MXOS API는 큐를 초기화, Push(데이터입력), pop(데이터꺼내기), dinint(파기) 등의 제어를 지원한다.

 

 

 

1. Message Queue 데모 구현내용

코드위치 demos/os/os.c

 

 
 
♦ rx_queue
메시지큐 출력(rx) 스레드 → 메시지를 무한으로 끄집어 내는 동작을 하며, 만약 timeout이 나면 스레드를 끝낸다.
 
static void rx_queue_thread(void *arg)
{
    int fd;
    struct timeval t;
    fd_set rd;
    int val, ret;
    fd = mos_event_fd_new(_que);
    app_log(“event fd: %d”, fd);
    while(1) {
        t.tv_sec = 10;
        t.tv_usec = 0;
        FD_ZERO(&rd);
        FD_SET(fd, &rd);
        select(fd+1, &rd, NULL, NULL, &t);
        if (FD_ISSET(fd, &rd)) {
            ret = mos_queue_pop(_que, (void*)&val, 1);
            app_log(“RX queue %d ret %d”, val, ret);
        } else {
            app_log(“RX queue timeout”);
            break;
        }
    }
    mos_event_fd_delete(fd);
    app_log(“rx_queue_thread exit”);
    mos_thread_delete(NULL);

}

 

♦ tx_queue
메시지큐 입력(tx) 스레드 → 메시지 20개를 집어 넣은 다음, 5초 동안 휴지하고, 메시지 5개를 집어 넣는다.
static void tx_queue_thread(void *arg)
{
    int i;
    int ret;
 
    for(i=0;i<20;i++) {
        ret = mos_queue_push(_que, &i,0);
        if (ret != kNoErr) {
            app_log(“push %d fail”, i);
        }
    }
    mos_sleep(5);
    for(i=0;i<5;i++) {
        ret = mos_queue_push(_que, &i,0);
        if (ret != kNoErr) {
            app_log(“push %d fail”, i);
        }
        mos_sleep(1);
    }
    app_log(“tx_queue_thread exit”);
    mos_thread_delete(NULL);

}

 

 
 
♦ queue_demo
메시지 메시지 큐 입력, 출력 스레드 생성 , 큐(queue)의 크기(depth)=10
static void queue_demo(int queue_size)
{
    mos_thread_id_t rt, tt;
    app_log(“queue demo start, queue size %d”, queue_size);
    _que = mos_queue_new(queue_size, 10);
    rt = mos_thread_new(5, “rx”, rx_queue_thread, 0x500, NULL);
    tt = mos_thread_new(5, “tx”, tx_queue_thread, 0x500, NULL);
    mos_thread_join(rt);
    mos_thread_join(tt);
    app_log(“queue demo end”);
    mos_queue_delete(_que);
 

mos_sleep(1);

}

 
 
 
 
 
♦ main
메시지 사이즈=1, 2, 3, 4 Byte로 시험

int main(void)

{
    //thread_demo();
    // timer_demo();
    //sem_demo();
 
 
     queue_demo(1);
    //queue_demo(2);
    //queue_demo(3);
    //queue_demo(4);
    return 0;
}

 

 

 

2. Message Queue 데모 동작확인

♦ queue 데모 컴파일하고 Flash에 다운로드→ mxos make os@emw3080 download  jtag=jlink

 

♦ EMW3080을 Reset하고 DBG 시리얼포트로 동작을 확인한 결과는 아래와 같다.

 

 

 

 

 

 

 

 

Viewed Page List