多任务实时系统中的同步与通信
Posted 越泽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多任务实时系统中的同步与通信相关的知识,希望对你有一定的参考价值。
在多任务实时系统中,常常需要在任务之间或者中断与任务之间进行通信,这就产生了同步与通信机制。
同步可分为两种:
①资源同步:避免两个及以上任务对同一个资源的同时操作
②活动同步:确定任务的活动是否到达一个确定状态
通信的目的主要是以下几点:
①让一个任务控制另一个任务
②在任务间传递信息(通常为状态)
③传递数据
④同步
通信的主要方式有:
①全局变量:容易引起混乱
②共享内存:需要和某种同步机制配合使用
③信号量、邮箱、消息队列、互斥体等消息机制
一. 信号量
信号量的通俗结束:一家餐馆有二十个座位,刚开张时有二十个空位,来一位客人占据一个座位,陆陆续续来了二十位客人把座位占满了,空余座位数变成了零,后面来的客人就只能等待,当有一人用完餐离开后,空位数加一,等待中的一位客人就可以进入用餐,相应的空位数又变成了零。
信号量有UP和DOWN两种方式,UP是来一个任务向上记一次数,达到最大数后,其余任务进入等待状态;DOWN方式是从最大数向下计数,到零后停止,任务进入等待状态
信号量上有释放和等待两种操作
二. 邮箱
邮箱是通过指针来发送或接收储存在系统内存中的消息,邮箱有一个消息发送队列和一个消息接收队列。邮箱传递消息是传递的指针,并不对消息内容进行复制,因此发送消息不会使任务进入等待状态。
三. 消息队列
消息队列有一个发送等待队列,一个接收等待队列和一个消息暂存区组成。发送消息时会先发送到消息暂存区,如果暂存区已满,则进入发送等待队列,接收消息就是将消息从暂存区复制走。实际操作时,为了提高效率,如果接收等待队列里有任务,就将消息直接复制给等待队列里的任务,而不经过消息暂存区。
消息队列与邮箱的区别是消息队列是对消息内容的复制,而邮箱是消息地址的传递。邮箱的发送消息过程不会被阻塞,而消息队列不具有此性质,因此在中断服务程序中推荐使用邮箱
四. 互斥体
互斥体如它的名字的含义一样,在任何时刻,只允许一个任务进入代码临界区。互斥体通过优先级继承协议和优先级天花板协议解决了优先级反转问题
优先级继承协议:当一个任务进入临界区的时候,使用等待队列中的最高优先级作为当前优先级,退出临界区后返回之前优先级
优先级天花板协议:当一个任务进入临界区的时候,把优先级提升到所有可能进入此临界区任务的最高优先级
以上是关于多任务实时系统中的同步与通信的主要内容,如果未能解决你的问题,请参考以下文章
STM32CubeMX学习笔记(28)——FreeRTOS实时操作系统使用(任务管理)
STM32CubeMX学习笔记(34)——FreeRTOS实时操作系统使用(任务通知)
VxworksQNXXenomaiIntimeSylixosUcos等实时操作系统的性能特点
STM32CubeMX学习笔记(35)——FreeRTOS实时操作系统使用(内存管理)