RT_THREAD消息队列收发消息(包括紧急消息的问题)
[复制链接]
一直想加紧把RT学完,然后再应用。
但坛子里一直不火。大家貌似不是很关注,但我本人还是尽点责任了。。。
下面是一个关于消息队列的应用程序。
在这个程序里面建立了三个线程,一个接收线线程,一个线程发送消息到消息队列中,一个线程发送一个紧急消息。
当进入线程1时,由于消息队列未满,其处于挂起状态 ,线程2得到CPU的控制权限,线程2不停地往队列中发送消息。
当消息队列满了,则挂起线程2,此时CPU交给了线程3,发送一条紧急消息到队列中。
然后线程1被唤醒接收消息显示。
大体的执行过程就这样。。。。
大家可以下载Rt_thread mailbox lab 里面的程序再经过修改就可以了:
下面我给也消息队列的主程序。
/* 指向线程控制块的指针 */ static rt_thread_t tid1=RT_NULL; static rt_thread_t tid2=RT_NULL; static rt_thread_t tid3=RT_NULL;
/* 消息队列控制块 */ static struct rt_messagequeue mq;
/* 消息对列中用于放消息的内存池 */ static char msg_pool[2048];
#define THREAD_STACK_SIZE 1024 #define THREAD_PRIORITY 10 #define THREAD_TIMESLICE 10
/* 线程1的入口函数 */ static void thread1_entry(void * parameter){ char buf[128];
while(1){ rt_memset(&buf[0],0,sizeof(buf)); /* 从消息队列中接收消息 */ if(rt_mq_recv(&mq,&buf[0],sizeof(buf),RT_WAITING_FOREVER)==RT_EOK){ rt_kprintf("thread1: receive message from the queue,the content:%s\n",buf); /* 延时10个OS Tick */ rt_thread_delay(10); } } }
/* 线程2的入口函数 */ static void thread2_entry(void* parameter){ int i,result; char buf[]="this is message No.x"; while(1){ for(i=0;i<10;i++){ buf[sizeof(buf)-2]='0'+i; rt_kprintf("thread2: send message:-%s\n",buf); /* 发送消息到消息队列中 */ result=rt_mq_send(&mq,&buf[0],sizeof(buf)); if(result==-RT_EFULL){ /* 消息队列满,延时1s */ rt_kprintf("the message queue is full,dealy 1s\n"); rt_thread_delay(100); } } rt_thread_delay(10); } }
/* 线程3的入口地址 */ static void thread3_entry(void* parameter){ char buf[]="this is an urgent message."; while(1){ rt_kprintf("thread3: send an urgent message.\n"); /* 发送紧急消息到消息队列中 */ rt_mq_urgent(&mq,&buf[0],sizeof(buf)); rt_thread_delay(25); } }
int mq_simple_init(void){ /* 初始化一个messagequeue */ //名称是mqt //队列用到的内在池是msg_pool //一个消息的大小是128-void* //内存池的大小是msg_pool的大小 //采用FIFO方式进行线程等待 rt_mq_init(&mq,"mqt",&msg_pool[0],128-sizeof(void*),sizeof(msg_pool),RT_IPC_FLAG_FIFO);
/* 创建线程1 */ tid1=rt_thread_create("t1",thread1_entry,RT_NULL, THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE); rt_thread_startup(tid1);
/* 创建线程2 */ tid2 = rt_thread_create("t2", thread2_entry, RT_NULL, /* 线程入口是thread2 entry, 入口参数是RT NULL */ THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(tid2);
/* 创建线程2 */ tid3= rt_thread_create("t3", thread3_entry, RT_NULL, /* 线程入口是thread2 entry, 入口参数是RT NULL */ THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(tid3);
return 0;
}
int rt_application_init() { mq_simple_init();
return 0; }
|