rsoc/Day1/msgq_sample.c

140 lines
4.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 程序清单:消息队列例程
*
* 这个程序会创建2个动态线程一个线程会从消息队列中收取消息一个线程会定时给消
* 息队列发送 普通消息和紧急消息。
*/
#include <rtthread.h>
#define THREAD_PRIORITY 25
#define THREAD_TIMESLICE 5
/* 消息队列控制块 */
static struct rt_messagequeue mq;
/* 消息队列中用到的放置消息的内存池 */
static rt_uint8_t msg_pool[2048];
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) > 0)
{
rt_kprintf("thread1: recv msg from msg queue, the content: %c\n", buf);
if (cnt == 19)
{
break; // 接收20次消息后退出
}
}
/* 延时50ms */
cnt++;
rt_thread_mdelay(50);
}
rt_kprintf("thread1: detach mq \n");
rt_mq_detach(&mq); // 脱离消息队列
}
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", /* 名称是mqt */
&msg_pool[0], /* 内存池指向msg_pool */
1, /* 每个消息的大小是1字节 */
sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */
RT_IPC_FLAG_PRIO); /* 如果有多个线程等待,按照优先级的方式分配消息 */
if (result != RT_EOK)
{
rt_kprintf("init message queue failed.\n");
return -1;
}
/* 初始化线程1 */
rt_thread_init(&thread1,
"thread1", /* 线程名称 */
thread1_entry, /* 线程入口函数 */
RT_NULL, /* 入口函数参数 */
&thread1_stack[0], /* 线程栈起始地址 */
sizeof(thread1_stack), /* 线程栈大小 */
THREAD_PRIORITY, THREAD_TIMESLICE); /* 线程优先级和时间片大小 */
/* 启动线程1 */
rt_thread_startup(&thread1);
/* 初始化线程2 */
rt_thread_init(&thread2,
"thread2", /* 线程名称 */
thread2_entry, /* 线程入口函数 */
RT_NULL, /* 入口函数参数 */
&thread2_stack[0], /* 线程栈起始地址 */
sizeof(thread2_stack), /* 线程栈大小 */
THREAD_PRIORITY-1, THREAD_TIMESLICE); /* 线程优先级和时间片大小 */
/* 启动线程2 */
rt_thread_startup(&thread2);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(msgq_sample, msgq sample);