嵌入式系统学习——STM32之UCOS-III消息传递

UCOSIII任务间通信

       一个任务或者中断服务程序有时候需要和另一个任务交流信息,这个就是消息,传递的过程就叫做任务间通信,任务间的消息传递可以通过2种途径:一是通过全局变量,二是通过发布消息。
       使用全局变量的时候每个任务或者中断服务程序都必须保证其对全局变量的独占访问。消息也可以通过消息队列作为中介发布给任务。

       什么是消息?
       消息包含一下几个部分:指向数据的指针,数据的长度和记录消息发布时刻的时间戳,指针指向的可以是一块数据区域或者甚至是一个函数。  消息的内容必须一直保持可见性,可见性是指代表消息的变量必须在接收消息的任务代码范围内有效。这是因为发布的数据采用的是指针传递,也就是引用传递,并不是值传递。也就是说,发布的消息本身并不产生拷贝,我们可以使用动态内存分配的方式来给消息分配一个内存块,或者,也可以传递一个指向全局变量、全局数据结构、全局数组或者函数的指针。


UCOSIII消息队列

       消息队列是UCOSIII中的一个内核对象,为结构体OS_Q。
struct  os_q {
OS_OBJ_TYPE         	 Type; 
CPU_CHAR            	*NamePtr; 
OS_PEND_LIST         	PendList;                          
#if OS_CFG_DBG_EN > 0u
    OS_Q                *DbgPrevPtr;
    OS_Q                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
OS_MSG_Q             	MsgQ	//消息列表
};
OS_MSG_Q也是一个结构体,如下:
struct  os_msg_q {                                           OS_MSG              *InPtr;   
OS_MSG              *OutPtr; 
OS_MSG_QTY           NbrEntriesSize; 
OS_MSG_QTY           NbrEntries; 
OS_MSG_QTY           NbrEntriesMax;
};
      消息发布以后会被存放在OS_MSG类型的数据结构中,OS_MSG如下:
struct  os_msg {
OS_MSG              *NextPtr;                           
void                *MsgPtr; 
OS_MSG_SIZE          MsgSize; 
CPU_TS               MsgTS;
};


消息队列API函数:


       同任务内嵌信号量一样,UCOSIII的每个任务中也有内建消息队列。而且多个任务等待同一个消息队列的应用很少见,UCOSIII中每个任务多有其内建消息队列的话用户可以不用通过外部的消息队列而直接向任务发布消息。
       如果需要使用任务内建消息队列功能的时候需要将宏OS_CFG_TASK_Q_EN置1来使能相关的代码。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值