Nucleus任务间的通信机制有邮箱(mailboxes),消息队列(queues),消息管道(pipes)。他们之间的主要不同之处在于使用的消息结构不同。
邮箱(mailboxes)消息长度有限制,最多只能容纳一条4个长字(16bytes)的消息。
消息队列(queues)消息长度单位为一个长字,4bytes。
消息管道(pipes)消息长度单位为一个字节。
邮箱提供的是单个消息的简单通信机制。每个邮箱最多只能容纳一条4个长字(16bytes)的消息。邮箱可以动态创建和删除,邮箱的数目不受限制。
队列提供的是传送多个消息的通信机制,一条消息有一个以上的长字组成,支持定长和变长的消息类型。队列也可以动态地创建和删除,队列的数目不受限制。
管道提供的也是传送多个消息的通信机制,一条消息由一个以上的字节组成,支持定长和变长的消息类型。管道也可以动态创建和删除,管道的数目不受限制。
Nucleus提供:信号量(semaphores)、事件组(event groups)和信号(signals)来实现任务的同步。其中信号量和事件是公共的工具,和任务及其他操作系统对象的联系由用户来定;而信号只和特定的任务相关。
1)信号量(semaphores)
信号量提供一种机制来控制操作系统临界资源的分配。两个基本操作是obtain和release,obtain为减少信号量,release为增加信号量。信号量最常见的应用是资源的分配,一个任务获得某一个资源,信号量就减少,任务释放资源,信号量就增加。当一个任务试图去obtain一个为0的信号量时,任务就会挂起,直到此信号量被释放,任务才恢复。
当多个任务试图obtain一个信号量时,任务就会根据信号量创建时支持的是FIFO挂起方式还是priority挂起方式来决定任务挂起的顺序。
Nucleus避免死锁的方式是当应用程序使用信号量时强加一些规则给应用程序,如禁止任务在同一时间占用多个信号量等。
当一个低优先级的任务拥有高优先级的任务所需要的信号量时,就会发生优先级逆转,以避免任务被无期限地挂起。
Nucleus可以动态创建和删除信号量。
2)事件组(event groups)
事件组提供一种机制来指示一个特定的系统事件。每个事件组有32bit组成,每个bit叫事件标志,代表一个事件。事件标志位可以用逻辑与/或来设置和清除。
Nucleus可以动态创建和删除事件组。
3)信号(signals)
信号和事件组类似,但是在操作上有明显的区别。事件组是用来同步的,在指定的服务请求执行之前,任务不会识别存在的事件标志。信号以异步的方式来操作,当一个信号出现,任务就会被中断执行,转入执行有任务预先定义的信号处理程序,每个任务可以处理32个信号,每个信号有1bit来表示。
信号处理程序类似于高级中断服务程序,它不会被新的信号中断。所有新信号的处理都要在当前的信号处理完成之后。
任务创建时所有的信号都是disable的,个别的信号可以有任务动态enable和disable。当信号处理程序被唤醒时,信号就被清除。
事件是同步的,即任务之前知道自己需要这个事件,比如当一个任务试图得到事件标志位未置为的事件时,任务将挂起;置位后,任务恢复。
而信号时异步的,即任务不知道何时来这个信号,这个信号来时就相当于来了个中断。