ucosIII 消息传递

来源:互联网 发布:阿里云tv输入法apk 编辑:程序博客网 时间:2024/05/17 07:34

任务间通信

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

消息构成

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

消息队列

这里写图片描述

消息队列的相关操作,ISR只能发布消息,不能等待。
消息发布方发布消息时可以指定是先入先出模式(FIFO)还是设置为后入先出模式(LIFO),例如ISR发布的消息可以使用LIFO这样可以绕开其他消息最先传递到任务。

广播消息

这里写图片描述
同理,消息传递也可以使用广播方式,广播至各个任务。

双向通信

这里写图片描述

外部消息队列API

API 注释 OSQCreate 创建一个消息队列 OSQDel 删除一个消息队列 OSQFlush 清空消息队列 OSQPend 等待消息 OSQPendAbort 取消等待消息 OSQPost 向消息队列发布消息

定义消息队列

OS_Q Msg_Que;

创建消息队列

void OSQCreate(OS_Q *p_q,   //指向定义的消息队列                            CPU_CHAR *p_name,  //消息队列名字                            OS_MSG_QTY max_qty,  //消息队列长度                            OS_ERR *p_err)  //返回错误码

发送消息队列

void OSQPost(OS_Q *p_q, //定义的消息队列                        void *p_void, //消息内容地址                        OS_MSG_SIZE msg_size, //消息大小字节                        OS_OPT opt, //消息操作类型                        OS_ERR *p_err //返回错误信息)

多个任务等待一个消息时候,最高优先级将获得消息,如果等待消息任务比发送消息任务高将发生任务调度,发送任务会被挂起。

OPT类型 注释 OS_OPT_POST_ALL 发送给所有等待任务,广播消息 OS_OPT_POST_FIFO 先进先出模式 OS_OPT_POST_LIFO 后进先出模式 OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度

等待消息队列

void *OSQPend(OS_Q *P_Q,    //指向定义的消息队列              OS_TICK timeout,  //等待超时时间,0一直等              OS_OPT opt,  //是否使用阻塞模式              OS_MSG_SIZE *p_msg_size,  //消息长度              CPU_TS *p_ts,  //时间戳              OS_ERR *p_err  //错误返回)

如果消息队列中没有任何消息,OSQPend()任务将被挂起或者阻塞等待,直到接收到消息或者超时。OSQPend()return指针就是消息内容的地址。

任务内建消息

同信号量相似,每个任务都有内建的消息队列,用户可以直接发送消息给任务而不通过外部消息队列。
这里写图片描述

宏OS_CFG_TASK_Q_EN使能
内建任务的消息队列大小在创建任务时候创建

任务内建消息队列API

API 注释 OSTaskQFlush 清空消息队列 OSTaskQPend 等待消息 OSTaskQPendAbort 取消等待消息 OSTaskQPost 向消息队列发布消息

发送任务内建消息

void OSTaskQPost(OS_TCB *p_TCB,//指向接收消息任务的TCB                 void *p_void,//消息内容                 OS_MSG_SIZE msg_size,//消息长度                 OS_OPT opt,                 OS_ERR *p_err,//返回错误码                 )

等待任务内建消息

void *OSTaskQPend(OS_TICK timeout,//等待超时时间                  OS_OPT opt,                  OS_MSG_SIZE *p_msg_size,//消息大小                  CPU_TS *p_ts,                  )
0 0
原创粉丝点击