freeRTOS小结——事件管理

概述

事件(Event)用于任务之前的同步和通信。freeRTOS中包含的事件分为如下几类,

·           消息(Message),用于任务之前通信

·           信号量(Semaphore)和互斥信号量,用于任务之前的同步(控制多个任务对同一资源的访问)

本小节主要讨论消息,信号量和互斥信号量主要用于资源管理,将在后边讲到。

基于消息的任务间通信过程如下图所示,发送者任务将消息发送给邮箱(MailBox)或消息队列(Message Queue),邮箱或消息队列则将该消息转发给接收者任务,并更新接收者任务的状态(挂起 -> 就绪),并在接收者任务的优先级高于当前任务时触发任务切换。

freeRTOS小结——事件管理_第1张图片

其中,

·           消息对象(Message Object)用于承载消息内容和基本信息。

·           邮箱用于早期的RTOS,freeRTOS已经不再支持,但在其他的RTOS如ucos中存在,实际上,邮箱可以看做队列长度为1的消息队列。

·           消息队列实际上为基于链表实现的FIFO buffer,其每一个节点对应为一个消息对象。

·           一般而言,发送者总是将消息发送到消息队列的队尾,当然也支持将优先级特别高的消息插入到队首

 

freeRTOS中,消息队列占用的存储空间全部从heap中分配得到。发送消息时,消息内容将会被全部复制到消息对象中;接收消息时,消息内容将会被全部复制到接收者任务提供的存储空间中。因此,freeRTOS较为推荐如下的消息结构,以减少复制消息的时间,

freeRTOS小结——事件管理_第2张图片

其中消息内容以地址形式提供(MessageContent Address,即C语言中的指针类型)。

 

事件传输过程

TASK在发送事件时,会检查当前是否存在因为等待该事件而处于锁定态的TASK,若有则将其状态更新到就绪态,并在自己优先级不是就绪态 TASK集合中最高的情况下触发TASK切换过程。

TASK接收事件时,首先检查需要接收的事件是否已经存在,若存在则取出该事件处理;若没有则进入锁定态等待该事件,并触发TASK切换,让就绪态TASK集合中最高优先级TASK运行。等待的时间可由用户设定,当等待时间超时后,前边提到的时间片机制会将该TASK更新到就绪态。

如下图所示,低优先级TASK发送消息到高优先级TASK,会触发TASK切换,让高优先级TASK运行;反之,则不会。

freeRTOS小结——事件管理_第3张图片



你可能感兴趣的:(RTOS)