Professional Documents
Culture Documents
Chapter 06
Chapter 06
1
Synchronization & Communication
Synchronization
• Semaphore (counting semaphore)
• Mutual Exclusion Semaphore (binary
semaphore + PCP)
• Event Flag
Communication
• Message Mailbox
• Message Queue
2
General operations
• OSXxxCreate
• OSXxxDel
• OSXxxPend
Wait for Xxx
• OSXxxAccept
A non-blocking version of OSXxxPend
• OSXxxPost
Release Xxx
• OSXxxQuery
3
Blocking System call
TaskA
TaskB
4
Nonblocking System call
TaskA
return -1
“Device Not Ready”
5
Asynchronous System call
TaskA TaskA
return 0
“Device Not Ready”
6
Semantics of ECB
(3) A
• An ISR or a task can Task
Signal
ECB
Wait
Task
(1) (2)
signal an ECB Timeout
(3)
• An optional timeout
Signal Wait
Task
Task
(4)
Timeout
7
Semantics of ECB
(4)
Timeout
ECB C
the ECB. Task Wait/Signal Timeout
(4)
8
The use of ECB
• A building block to implement services such as
– Semaphore
– Mutual Exclusion Semaphore
– Message Mailbox
– Message Queue
9
ECB data structure
10
ECB data structure
Type of event control block
.OSEventType
.OSEventGrp ~ OSRdyGrp
.OSEventCnt Semaphore Count…
.OSEventPtr Pointer to message or queue structure
7 6 5 4 3 2 1 0
15 14 13 12 11 10 9 8
.
. ~ OSRdyTbl
.
55 54 53 52 51 50 49 48
63 62 61 60 59 58 57 56
OS_EVENT_TYPE_SEM OS_EVENT_TYPE_MUTEX
0x00 0x00
cnt prio OS_MUTEX_AVAILABLE
NULL NULL
0x00 … 0x00 0x00 … 0x00
OS_EVENT_TYPE_QM OS_EVENT_TYPE_MBOX
0x00 0x00
cnt 0x00
Point to Q Point to msg
0x00 … 0x00 0x00 … 0x00 12
ECB Functions
• OS_EventWaitListInit()
Initialize an ECB
• OS_EventTaskRdy()
Make a task ready
• OS_EventTaskWait()
Put the task to sleep
• OS_EventTO()
Make a task ready
13
1 1
ready queue
1
1 1
2. OS_XXX_Post 1. OS_XXX_Pend
Task (OS_Event_TaskRdy) ECB (OS_Event_TaskWait)
Task
(waiting
A queue) B
5
14
1 1
ready queue
1
1 1
OS_XXX_Post 1. OS_XXX_Pend
Task (OS_Event_TaskRdy) ECB (OS_Event_TaskWait)
Task
(waiting
A queue) B
5
2. OS_EventTO
15
OS_EventWaitListInit()
"loop unrolling"
16
OS_EventTaskRdy()
• This function is called by the POST functions
for a semaphore, a mutex, a message mailbox
or a message queue when the ECB is signaled.
17
OS_EventTaskRdy() - 1
Waiting Queue Ready Queue
OSRdyGrp 1 1
EventGrp 1 1
1
EventTbl OSRdyTbl
1 1 1
1 1
18
OS_EventTaskRdy() - 2
Waiting Queue Ready Queue
OSRdyGrp 1 1
EventGrp 1
EventTbl OSRdyTbl
1 1 1
1 1
19
OS_EventTaskRdy() - 3
Waiting Queue Ready Queue
OSRdyGrp 1 1 1
EventGrp 1
1
EventTbl OSRdyTbl
1 1 1
1 1
20
OS_EventTaskRdy() - 4
OSTCBDly=?
OSTCBEventPtr
OSTCBStat
OSTCBEventPtr
OSTCBStat
OSTCBEventPtr
OSTCBStat ≒ Rdy
25
OS_EventTaskWait() - 1
Waiting Queue Ready Queue
OSRdyGrp 1 1 1
EventGrp 1
1
EventTbl OSRdyTbl
1 1 1
1 1
26
OS_EventTaskWait() - 2
Waiting Queue Ready Queue
OSRdyGrp 1 1
EventGrp 1
EventTbl OSRdyTbl
1 1 1
1 1
27
OS_EventTaskWait() - 3
Waiting Queue Ready Queue
OSRdyGrp 1 1
EventGrp 1 1
1
EventTbl OSRdyTbl
1 1 1
1 1
28
OS_EventTaskWait()
29
OS_EventTO()
• OS_EventTO = OS-Event-Time-Out
30
Usage: OS_EventTaskRdy()
Taski Taskj
xxx_post()
xxx_pend( 0 )
xxx_post()
xxx_pend( 0 )
31
Usage: OS_EventTO()
Taskj
Taski Taskj
Waiting queue
Ready queue
xxx_post()
xxx_pend( 3 )
xxx_post()
xxx_pend( 0 )
3
0
1
2
32
OS_EventTO()
33