| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-08-24 yangjie the first version
- */
- /*
- * 程序清单:消息队列例程
- *
- * 这个程序会创建2个动态线程,一个线程会从消息队列中收取消息;一个线程会定时给消
- * 息队列发送 普通消息和紧急消息。
- */
- #include <rtthread.h>
- #define THREAD_PRIORITY 25
- #define THREAD_TIMESLICE 5
- /* 消息队列控制块 */
- static struct rt_messagequeue mq;
- /* 消息队列中用到的放置消息的内存池 */
- static rt_uint8_t msg_pool[2048];
- ALIGN(RT_ALIGN_SIZE)
- static char thread1_stack[1024];
- static struct rt_thread thread1;
- /* 线程1入口函数 */
- static void thread1_entry(void *parameter)
- {
- char buf = 0;
- rt_uint8_t cnt = 0;
- while (1)
- {
- /* 从消息队列中接收消息 */
- if (rt_mq_recv(&mq, &buf, sizeof(buf), RT_WAITING_FOREVER) == RT_EOK)
- {
- rt_kprintf("thread1: recv msg from msg queue, the content:%c\n", buf);
- if (cnt == 19)
- {
- break;
- }
- }
- /* 延时50ms */
- cnt++;
- rt_thread_mdelay(50);
- }
- rt_kprintf("thread1: detach mq \n");
- rt_mq_detach(&mq);
- }
- ALIGN(RT_ALIGN_SIZE)
- static char thread2_stack[1024];
- static struct rt_thread thread2;
- /* 线程2入口 */
- static void thread2_entry(void *parameter)
- {
- int result;
- char buf = 'A';
- rt_uint8_t cnt = 0;
- while (1)
- {
- if (cnt == 8)
- {
- /* 发送紧急消息到消息队列中 */
- result = rt_mq_urgent(&mq, &buf, 1);
- if (result != RT_EOK)
- {
- rt_kprintf("rt_mq_urgent ERR\n");
- }
- else
- {
- rt_kprintf("thread2: send urgent message - %c\n", buf);
- }
- }
- else if (cnt >= 20)/* 发送20次消息之后退出 */
- {
- rt_kprintf("message queue stop send, thread2 quit\n");
- break;
- }
- else
- {
- /* 发送消息到消息队列中 */
- result = rt_mq_send(&mq, &buf, 1);
- if (result != RT_EOK)
- {
- rt_kprintf("rt_mq_send ERR\n");
- }
- rt_kprintf("thread2: send message - %c\n", buf);
- }
- buf++;
- cnt++;
- /* 延时5ms */
- rt_thread_mdelay(5);
- }
- }
- /* 消息队列示例的初始化 */
- int msgq_sample(void)
- {
- rt_err_t result;
- /* 初始化消息队列 */
- result = rt_mq_init(&mq,
- "mqt",
- &msg_pool[0], /* 内存池指向msg_pool */
- 1, /* 每个消息的大小是 1 字节 */
- sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */
- RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */
- if (result != RT_EOK)
- {
- rt_kprintf("init message queue failed.\n");
- return -1;
- }
- rt_thread_init(&thread1,
- "thread1",
- thread1_entry,
- RT_NULL,
- &thread1_stack[0],
- sizeof(thread1_stack),
- THREAD_PRIORITY, THREAD_TIMESLICE);
- rt_thread_startup(&thread1);
- rt_thread_init(&thread2,
- "thread2",
- thread2_entry,
- RT_NULL,
- &thread2_stack[0],
- sizeof(thread2_stack),
- THREAD_PRIORITY, THREAD_TIMESLICE);
- rt_thread_startup(&thread2);
- return 0;
- }
- /* 导出到 msh 命令列表中 */
- MSH_CMD_EXPORT(msgq_sample, msgq sample);
|