9457|3

849

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

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;
}

    

1.jpg (122.04 KB, 下载次数: 0)

1.jpg

最新回复

本帖最后由 xyzjacky 于 2017-3-25 14:29 编辑 我想请教一下: 在rt thread os中,在工程的一个C文件创建了一个消息队列,然后发送这个消息队列, 那么是只能在这个C文件中进行消息队列的接收,还是可以在工程的任何C文件中进行消息队列的接收? static struct rt_messagequeue P2208_mq; if (rt_mq_recv(&P2208_mq, &txbuf[0], sizeof(txbuf), RT_WAITING_FOREVER)== RT_EOK) 我现在遇到的一个问题是,按照例程在一个C文件中创建了一个消息队列,在本C文件中接收消息队列没有问题。说明代码没有问题。但是如果把接收消息队列的函数,移到工程的另一个C文件中,编译时就要报错,提示内容为: P2208_mq 没有定义。当我把static struct rt_messagequeue P2208_mq; 改成:extern struct rt_messagequeue P2208_mq; 就不会再报错。 这我就奇怪了,如果P2208_mq要定义成一个全局的变量,那么消息队列还有何用? 我问了别人ucos的消息队列,别人说ucos的消息队列可以在工程中任何地方接收。   详情 回复 发表于 2017-3-25 14:28
点赞 关注
个人签名只有想不到,没有做不到。

回复
举报

117

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
很好!

消息队列,着重要注意的是:如果是初始化静态消息队列对象,每个消息前面,系统都会加一个4字节的头部以做链表管理。所以对于一个内存块,自己需要计算好消息的长度是多少,否则是有可能最大消息数目比自己预想的少一个的。
 
个人签名RT-Thread:启动下一代RTOS演化
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

板凳
 

回复 沙发 ffxz 的帖子

哈哈。。。恩。。。学习中。。。。
 
个人签名只有想不到,没有做不到。
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

4
 
本帖最后由 xyzjacky 于 2017-3-25 14:29 编辑

我想请教一下:
在rt thread os中,在工程的一个C文件创建了一个消息队列,然后发送这个消息队列,
那么是只能在这个C文件中进行消息队列的接收,还是可以在工程的任何C文件中进行消息队列的接收?

static struct rt_messagequeue P2208_mq;
if (rt_mq_recv(&P2208_mq, &txbuf[0], sizeof(txbuf), RT_WAITING_FOREVER)== RT_EOK)
我现在遇到的一个问题是,按照例程在一个C文件中创建了一个消息队列,在本C文件中接收消息队列没有问题。说明代码没有问题。但是如果把接收消息队列的函数,移到工程的另一个C文件中,编译时就要报错,提示内容为: P2208_mq 没有定义。当我把static struct rt_messagequeue P2208_mq; 改成:extern struct rt_messagequeue P2208_mq; 就不会再报错。

这我就奇怪了,如果P2208_mq要定义成一个全局的变量,那么消息队列还有何用?
我问了别人ucos的消息队列,别人说ucos的消息队列可以在工程中任何地方接收。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表