为了体现使用邮箱来达到线程间的通信,本实验设计了thread1. thread2两个线程.优先级同为10.设计了一个邮箱mbt. 线程thread1每100ms尝试接收一次邮件.如果接收到邮件就将邮件内容打印出来.在接收到结束邮件时.打印邮件信息,线程结束. 线程thread2每200ms 发送一次邮件,发送10次之后,发送结束邮件(线程2共发送11封邮件),线程运行结束.新创建接收事件的任务thread3_recv_mailbox,优先级低于线程1; 实现threadl_entry接收到奇数序号消息"I'm a mail! " ; thread3_recv_mailbox接收到偶数序号消息"this is another mail!"。 提示:接收完所有消息后调用rt_mb_detach,回收mailbox控制块和消息缓冲区的存储空间。基于RT-Thread实现,要求条理清晰
时间: 2024-03-24 09:40:07 浏览: 48
下面是基于 RT-Thread 实现的代码,实现了上述功能:
```c
#include <rtthread.h>
#define MAIL_COUNT 11
static rt_mailbox_t mbt; /* 邮箱 */
/* 线程1:接收邮件 */
static void thread1_entry(void* parameter)
{
rt_uint32_t msg; /* 邮件数据 */
rt_uint16_t mb_id, mb_index; /* 邮箱 ID 和邮件序号 */
while (1)
{
/* 尝试接收邮件 */
if (rt_mb_recv(mbt, &msg, 100) == RT_EOK)
{
/* 解析邮件编号 */
if (rt_mb_check(msg, &mb_id, &mb_index) == 0)
{
/* 打印邮件内容 */
rt_kprintf("Received mail %d: %s\n", mb_index, (char*)msg);
/* 判断是否接收到结束邮件 */
if (mb_index == MAIL_COUNT - 1)
{
rt_kprintf("Received end mail, thread1 exit.\n");
rt_mb_detach(mbt);
return;
}
}
}
}
}
/* 线程2:发送邮件 */
static void thread2_entry(void* parameter)
{
rt_uint32_t msg; /* 邮件数据 */
rt_uint16_t i;
for (i = 0; i < MAIL_COUNT; i++)
{
/* 发送邮件 */
msg = rt_mb_create_mail(mbt, "I'm a mail!");
rt_mb_send(mbt, msg);
/* 等待一段时间 */
rt_thread_mdelay(200);
}
/* 发送结束邮件 */
msg = rt_mb_create_mail(mbt, "End mail.");
rt_mb_send(mbt, msg);
rt_kprintf("Thread2 exit.\n");
}
/* 线程3:接收奇偶数序号的邮件 */
static void thread3_recv_mailbox(void* parameter)
{
rt_uint32_t msg; /* 邮件数据 */
rt_uint16_t mb_id, mb_index; /* 邮箱 ID 和邮件序号 */
while (1)
{
/* 尝试接收邮件 */
if (rt_mb_recv(mbt, &msg, RT_WAITING_FOREVER) == RT_EOK)
{
/* 解析邮件编号 */
if (rt_mb_check(msg, &mb_id, &mb_index) == 0)
{
/* 判断奇偶数 */
if (mb_index % 2 == 1)
{
/* 奇数序号的邮件 */
rt_kprintf("Thread3 received odd mail %d: %s\n", mb_index, (char*)msg);
}
else
{
/* 偶数序号的邮件 */
rt_kprintf("Thread3 received even mail %d: %s\n", mb_index, (char*)msg);
}
}
}
}
}
int main(void)
{
/* 创建邮箱 */
mbt = rt_mb_create("mbt", MAIL_COUNT, RT_IPC_FLAG_FIFO);
if (mbt == RT_NULL)
{
rt_kprintf("Failed to create mailbox.\n");
return -1;
}
/* 创建线程1 */
rt_thread_t thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 10, 10);
if (thread1 == RT_NULL)
{
rt_kprintf("Failed to create thread1.\n");
return -1;
}
/* 创建线程2 */
rt_thread_t thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 10, 10);
if (thread2 == RT_NULL)
{
rt_kprintf("Failed to create thread2.\n");
return -1;
}
/* 创建线程3 */
rt_thread_t thread3 = rt_thread_create("thread3", thread3_recv_mailbox, RT_NULL, 512, 9, 10);
if (thread3 == RT_NULL)
{
rt_kprintf("Failed to create thread3.\n");
return -1;
}
/* 启动线程 */
rt_thread_startup(thread1);
rt_thread_startup(thread2);
rt_thread_startup(thread3);
/* 运行 */
return 0;
}
```
在上面的代码中,我们创建了一个邮箱 mbt,并创建了三个线程:thread1、thread2 和 thread3。其中,thread1 用于接收邮件,thread2 用于发送邮件,thread3 用于接收奇偶数序号的邮件。
在 thread1 中,我们使用 rt_mb_recv() 函数尝试接收邮件,并使用 rt_mb_check() 函数解析邮件编号。如果解析成功,则打印邮件内容,并判断是否接收到结束邮件。如果接收到结束邮件,则调用 rt_mb_detach() 函数回收邮箱的控制块和消息缓冲区的存储空间。
在 thread2 中,我们使用 rt_mb_create_mail() 函数创建邮件,并使用 rt_mb_send() 函数发送邮件。发送完所有邮件后,我们再发送一个结束邮件。
在 thread3 中,我们也使用 rt_mb_recv() 函数接收邮件,并使用 rt_mb_check() 函数解析邮件编号。不同的是,我们根据奇偶数判断接收到的邮件是什么,并打印出相应的信息。
最后,我们在 main() 函数中启动了三个线程,运行代码。
阅读全文