메시지 큐(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 시리얼포트로 동작을 확인한 결과는 아래와 같다.