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是为了阻止优先级反转而实现“优先级继承”的互斥门(它仅能一次被一个线程使用)。