RTOS的用户可以使用内核对象来解决实时系统设计中的问题,如并发、同步与互斥、数据通信等。内核对象包括信号量、消息队列、管道、事件与信号等。为了同步一个应用的多个并发线程和协调它们对共享资源的互斥访问,内核提供了一个信号量对象和相关的信号量管理服务。
信号量是一个内核对象,就像一把锁,任务获取了该信号量就可以执行期望的操作或访问相关资源,从而达到同步或互斥的目的信号量可以分为如下三类。
(1) 二值信号量。二值信号量只能有两个值:0或1,当其值为0时,认为信号量不可使用;当其值为1时,认为信号量是可使用的。当二值信号量被创建时,既可以初始化为可使用的,也可以初始化为不可使用的。二值信号量通常作为全局资源,被需要信号量的所有任务共享。
(2) 计数信号量。计数信号量使用一个计数器赋予一个数值,表示信号量令牌的个数,允许多次获取和释放。初始化时,如果计数值为0,表示信号量不可用:计数值大于0,表示信号量可用。每获取一次信号量,其计数值就减1:每释放一次信号量,其计数值就加1。在有些系统中,计数信号量允许实现的计数是有界的,有些则****。同值信号量一样,计数信号量也可用做全局资源。
(3) 互斥信号量。互斥信号量是一个特殊的二值信号量,它支持所有权、递归访问、任务删除安全和优先级反转,以避免互斥固有的问题。互斥信号量初始为开锁状态,被任务获取后转到闭锁状态,当任务释放该信号量时又返回开锁状态。
通常,内核支持以下几种操作:创建和删除信号量操作、获取和释放信号量操作、清除信号量的等待队列操作以及获取信号量信息操作。
多数情况下,任务活动同步并不足以满足实时响应的要求,任务之间还必须能够交换信息。为了实现任务之间的数据交换,内核提供了消息队列对象和消息队列的管理。请见下回笔记分享~~