messageq_simple.c 4.0 KB
Newer Older
1
/*
B
bernard.xiong 已提交
2
 * 程序清单:消息队列例程
3
 *
B
bernard.xiong 已提交
4 5
 * 这个程序会创建3个动态线程,一个线程会从消息队列中收取消息;一个线程会定时给消
 * 息队列发送消息;一个线程会定时给消息队列发送紧急消息。
6 7 8 9 10 11 12 13 14
 */
#include <rtthread.h>
#include "tc_comm.h"

/* 指向线程控制块的指针 */
static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;
static rt_thread_t tid3 = RT_NULL;

B
bernard.xiong 已提交
15
/* 消息队列控制块 */
16
static struct rt_messagequeue mq;
B
bernard.xiong 已提交
17
/* 消息队列中用到的放置消息的内存池 */
18 19
static char msg_pool[2048];

B
bernard.xiong 已提交
20
/* 线程1入口函数 */
21 22 23 24 25 26 27 28
static void thread1_entry(void* parameter)
{
	char buf[128];

	while (1)
	{
		rt_memset(&buf[0], 0, sizeof(buf));

B
bernard.xiong 已提交
29
		/* 从消息队列中接收消息 */
30 31 32 33 34
		if (rt_mq_recv(&mq, &buf[0], sizeof(buf), RT_WAITING_FOREVER) == RT_EOK)
		{
			rt_kprintf("thread1: recv msg from message queue, the content:%s\n", buf);
		}

B
bernard.xiong 已提交
35 36
		/* 延迟10个OS Tick */
		rt_thread_delay(10);
37 38 39
	}
}

B
bernard.xiong 已提交
40
/* 线程2入口函数 */
41 42 43 44 45 46 47 48 49 50 51 52
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);
B
bernard.xiong 已提交
53
			/* 发送消息到消息队列中 */
54
			result = rt_mq_send(&mq, &buf[0], sizeof(buf));
B
bernard.xiong 已提交
55
			if ( result == -RT_EFULL)
56
			{
B
bernard.xiong 已提交
57 58 59
				/* 消息队列满, 延迟1s时间 */
				rt_kprintf("message queue full, delay 1s\n");
				rt_thread_delay(100);
60 61 62
			}
		}

B
bernard.xiong 已提交
63 64
		/* 延时10个OS Tick */
		rt_thread_delay(10);
65 66 67
	}
}

B
bernard.xiong 已提交
68
/* 线程3入口函数 */
69 70 71 72 73 74 75
static void thread3_entry(void* parameter)
{
	char buf[] = "this is an urgent message!";

	while (1)
	{
		rt_kprintf("thread3: send an urgent message\n");
B
bernard.xiong 已提交
76 77

		/* 发送紧急消息到消息队列中 */
78 79
		rt_mq_urgent(&mq, &buf[0], sizeof(buf));

B
bernard.xiong 已提交
80 81
		/* 延时25个OS Tick */
		rt_thread_delay(25);
82 83 84 85 86
	}
}

int messageq_simple_init()
{
B
bernard.xiong 已提交
87 88 89 90 91 92
	/* 初始化消息队列 */
	rt_mq_init(&mq, "mqt", 
		&msg_pool[0], /* 内存池指向msg_pool */ 
		128 - sizeof(void*), /* 每个消息的大小是 128 - void* */
		sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */
		RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

	/* 创建线程1 */
	tid1 = rt_thread_create("t1",
		thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */
		THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
	if (tid1 != RT_NULL)
		rt_thread_startup(tid1);
	else
		tc_stat(TC_STAT_END | TC_STAT_FAILED);

	/* 创建线程2 */
	tid2 = rt_thread_create("t2",
		thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */
		THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
	if (tid2 != RT_NULL)
		rt_thread_startup(tid2);
	else
		tc_stat(TC_STAT_END | TC_STAT_FAILED);

	/* 创建线程3 */
	tid3 = rt_thread_create("t3",
		thread3_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */
		THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
	if (tid3 != RT_NULL)
		rt_thread_startup(tid3);
	else
		tc_stat(TC_STAT_END | TC_STAT_FAILED);

	return 0;
}

#ifdef RT_USING_TC
static void _tc_cleanup()
{
	/* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
	rt_enter_critical();

	/* 删除线程 */
	if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE)
		rt_thread_delete(tid1);
	if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE)
		rt_thread_delete(tid2);
	if (tid3 != RT_NULL && tid3->stat != RT_THREAD_CLOSE)
		rt_thread_delete(tid3);

B
bernard.xiong 已提交
138
	/* 执行消息队列对象脱离 */
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
	rt_mq_detach(&mq);

	/* 调度器解锁 */
	rt_exit_critical();

	/* 设置TestCase状态 */
	tc_done(TC_STAT_PASSED);
}

int _tc_messageq_simple()
{
	/* 设置TestCase清理回调函数 */
	tc_cleanup(_tc_cleanup);
	messageq_simple_init();

	/* 返回TestCase运行的最长时间 */
	return 100;
}
/* 输出函数命令到finsh shell中 */
FINSH_FUNCTION_EXPORT(_tc_messageq_simple, a simple message queue example);
#else
/* 用户应用入口 */
int rt_application_init()
{
	messageq_simple_init();

	return 0;
}
#endif