Sysbios——同步和通信

Sysbios的同步和通信主要包括队列(Queue)、信号量(Semaphore)、邮箱(Mailbox)、事件(Event)、门(Gates)。

队列-Queue

要点:

1. 基于双向链表实现,可以在任意位置插入或删除元素,并且队列元素没有最大值。
2. 要在队列中增加结构体元素,这个元素的第一个字段必须是Queue_Elem类型的。

 Queue APIs

 

 

信号量-Semaphore

要点

1. 信号量主要用于保护关键代码段,以及任务间的同步。

2. 信号量类型主要包括二进制、计数、带优先级的二进制、带优先级的计数信号量。

3. 信号量可以关联事件。

邮箱-Mailbox

要点

1. 邮箱被用于在同一处理器上将buffer从一个任务传递到另一个任务。

2. 创建邮箱时,需要指定邮箱内部buffer的个数和每个buffer的大小。邮箱实例中发送和接收的所有buffer的大小必须和这个大小相同。

3. Mailbox_pend()被用于从邮箱读取一个buffer。如果邮箱是空的,那么Mailbox_pend()会阻塞。Timeout参数用于等待超时,一直等待使用BIOS_WAIT_FOREVER,不等待使用BIOS_NO_WAIT,时间单位为系统时钟节拍。

4. Mailbox_post()被用于发送一个buffer到邮箱。如果邮箱是满的,那么Mailbox_post()阻塞。Timeout参数用于等待超时,一直等待使用BIOS_WAIT_FOREVER,不等待使用BIOS_NO_WAIT。

5. 邮箱也可以关联事件。

工作原理

事件-Event

要点

1. 事件的使用与二进制信号量类似,如create、post、pend、delete等。

2. 事件可以等待多个事件全部发生(andMask),也可等待多个事件中任意一个事件发生(orMask)。

3. 一个事件实例最多可管理sizeof(UINT)个事件。

4. 一次只能有一个任务挂起在一个事件对象上。

Event相关APIs

 门-Gates

要点

1. 门用于防止对临界区代码的并发访问。不同的实现的门尝试锁定临界区的方式不同。

2. 所有的门的实现通过"key"的使用来实现嵌套。只有使用最外面的Gate_enter()返回的key才能恢复抢占。

3. 基于抢占的门的实现:

    a.GateHwi以禁用和使能中断作为锁定机制。这种门保证以独占形式访问CPU。当临界区被任务、Swi 或Hwi 线程共享时可以使用这种门。

    b. GateSwi以禁用和使能软件中断作为锁定机制。当临界区被Swi 或任务线程共享时可以使用这种门。

    c. GateTask以禁用和使能任务作为锁定机制。当临界区被任务线程共享时可以使用这种门。它不能用于Hwi或Swi线程。

4. 基于信号量的门的实现

    a. GateMutex使用二进制信号量作为锁定机制。每个GateMutex实例有它自己独有的的信号量。

    b. GateMutexPri是为了阻止优先级反转而实现“优先级继承”的互斥门(它仅能一次被一个线程使用)。

原文地址:https://www.cnblogs.com/risunlee/p/13490564.html