UCOSIII消息传递

来源:互联网 发布:怎样注册公司域名 编辑:程序博客网 时间:2024/05/17 03:46
有时候一个任务和另外一个或者几个任务进行“交流”,这个“交流”就是消息的传递,也称之为任务通信,在UCOSIII中消息可以通过消息队列作为中介发布给任务,也可以直接发布给任务,本章我们就讲解一个UCOSIII的消息传递,本章分为如下几个部分。消息队列消息一半包含:指向数据的指针,表明数据长度的变量和记录消息发布时刻的时间戳,指针指向的可以是一块数据区或者甚至是一个函数,消息的内容必须一直保持可见性,应为发布数据采用的是引用传递是指针传递而不是值传递,也就是说发布的数据本身不产生数据拷贝。在UCOSII中有消息邮箱和消息队列,但是在UCOSIII中只有消息队列。消息队列石油用户创建的内核对象,数量不限制![消息队列相关操作](http://img.blog.csdn.net/20160809160331217)中断服务程序只能使用OSQPost()函数,在UCOSIII中对于消息对垒的读取可以采用先进先出(FIFO)的方式,也可以采用后进先出(LIFO)的方式。当任务或者中断服务需要向任务发送一条紧急消息LIFO的机制就非常有用了。采用先进后出的方式,发布的消息会绕过其他所有的已经位于消息队列中的消息而最先传递给任务。在接受消息的任务旁边的小沙漏表示任务可以指定一个超时时间,如果任务在这段时间内没有接收到消息的话就会唤醒任务,并且放回一个错误码告诉UCOSIII超时,任务是应为接收消息超时而被唤醒的,不是应为接收到了消息。如果这个超时时间指定为0的话,那么任务就会一直等待下去,知道接收到消息。消息队列中有一个列表,记录了所有正在等待获得消息的任务,如下图所示为多个任务可以在一个消息队列中等待,当一则消息被发布到队列中时,最高优先级的等待任务获得该消息,发布方也可以向消息队列中多有等待的任务广播一则消息。![多个任务等待一个消息队列](http://img.blog.csdn.net/20160809161752749)消息队列相关函数![消息队列有关函数](http://img.blog.csdn.net/20160809162138220)常用的消息队列函数有三个,创建消息队列OSQCreate(),向消息队列发送消息函数OSQPost()和等待消息队列函数OSQPend()。创建消息队列OSQCreate()函数用来创建一个消息队列,消息队列是的任务或者中断服务程序可以向一个或者多个任务发送消息p_q : 指向一个消息队列,消息队列的存储空间必须由应用程序分配,我们采如下语句定义一个消息队列。     OS_Q  Msg_Que ;p_name p_name: 消息队列的名字 。max_qty: 指定消息队列的长度,必须大于 0。当然,如果OS_MSGs缓冲池中没有足够多的OS_MSGs可用,那么发送消息将会失败,并且返回相应的错误码指明当前没有可用的OS_MSGsp_err: 保存调用此函数后返回的错误码等待消息队列当一个任务想要从消息队列中接收一个消息的话就需要使用OSQPend()。当任务小勇这个函数的时候,如果消息队列中至少一个消息时,这些消息就会返回给函数调用者。p_q : 指向一个消息队列。timeout : 等待消息的超时,如果在指定的时间没有接收到消息话,任务就会被唤醒,接着运行。这个参数也可以设置为0,表示任务将一直等待下去,直到接收消息。opt : 用来选择是否使阻塞模式,有两个选项可以选择。    OS_OPT_PEND_BLOCKING 如果没有任何消息存在的话就阻塞务,一直等待,直到接收消息。    OS_OPT_PEND_NON_BLOCKING 如果消息队列没有任何的话务就直接返回。msg_size: 指向一个变量用来表示接收到的消息长度(字节数)。p_ts :指向一个时间戳 ,表明什么时候接收到消息。如果这个指针被赋值为 NULL的话,说明用户没有要求时间戳。p_err:用来保存调用此函数后返回的错误码。如果消息队列中没有任何,并且参数消息队列中没有任何,并且参数 opt 为 OS_OPT_PEND_NON_BLOCKING时,那么调用OSQPend ()函数的任务就会被挂起, 直到接收消息或者超时。如果有发送给队列,但是同时有多个任务在等待这消息那么 UCOSIII将恢复等待中的最高优先级任务。向消息队列发送消息可以通过函数OSQPost()向消息队列发送消息,如果消息队列是满的,则函数OSQPost()就会立刻返回,并且返回一个特定的错误代码如果有多个任务在等待消息队列的话,那么优先级最高将获得这个消息。如果等待消息的任务优先级比发送高,则系统会执行调度,等待消息的任务立即恢复运行,而发送消息的任务被挂起。可以通过opt设置消息队列是设置消息队列是FIFO还是LIFO 。如果有多个任务在等待消息队列的,则OSQPost()函数可以设置仅将消息发送给等待任务中优先级最高的(opt设置为OS_OPT_POST_FIF或者 OS_OPT_POST_LIFO ),也可以将消息发送给所有等待的任务(opt设置为 OS_OPT_POST_ALL )。如果 opt 设置为OS_OPT_POST_NO_SCHED),则在发送完消息后,会进行任务调度。p_q :指向一个消息队列。p_void :指向实际发送的内容 ,p_void是一个执行void类型的指针,其具体含义由用户程序的决定。msg_sizemsg_size: 设定消息的大小,单位为字节数。opt : 用来选择消息发送操作的类型 ,基本的类型有下面四种。    OS_OPT_POST_ALL 将消息发送给所有等待该消息队列的任务,需要和选项OS_OPT_POST_FIFO 或者OS_OPT_POST_LIFO 配合使用。    OS_OPT_POST_FIFO 待发送消息保存在队列的末尾    OS_OPT_POST_LIFO 待发送的消息保存在队列开头    OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度。    我们可以使用上面四种基本类型来组合出其他几,如下 :    OS_OPT_POST_FIFO + OS_OPT_POST_ALL    OS_OPT_POST_LIFO + OS_OPT_POST_ALL    OS_OPT_POST_FIFO + OS_OPT_POST_NO_SCHED    OS_OPT_POST_LIFO + OS_OPT_POST_NO_SCHED    OS_OPT_POST_FIFO + OS_OPT_POST_ALL + OS_OPT_POST_NO_SCHED    OS_OPT_POST_LIFO + OS_OPT_POST_ALL + OS_OPT_POST_NO_SCHED p_err: 用来保存调此函数后返回的错误码。
0 0
原创粉丝点击