OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [doc/] [user/] [sem.t] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
@c
2
@c  COPYRIGHT (c) 1988-2002.
3
@c  On-Line Applications Research Corporation (OAR).
4
@c  All rights reserved.
5
@c
6
@c  sem.t,v 1.19 2002/01/17 21:47:47 joel Exp
7
@c
8
 
9
@chapter Semaphore Manager
10
 
11
@cindex semaphores
12
@cindex binary semaphores
13
@cindex counting semaphores
14
@cindex mutual exclusion
15
 
16
@section Introduction
17
 
18
The semaphore manager utilizes standard Dijkstra
19
counting semaphores to provide synchronization and mutual
20
exclusion capabilities.  The directives provided by the
21
semaphore manager are:
22
 
23
@itemize @bullet
24
@item @code{@value{DIRPREFIX}semaphore_create} -  Create a semaphore
25
@item @code{@value{DIRPREFIX}semaphore_ident} - Get ID of a semaphore
26
@item @code{@value{DIRPREFIX}semaphore_delete} - Delete a semaphore
27
@item @code{@value{DIRPREFIX}semaphore_obtain} - Acquire a semaphore
28
@item @code{@value{DIRPREFIX}semaphore_release} - Release a semaphore
29
@item @code{@value{DIRPREFIX}semaphore_flush} - Unblock all tasks waiting on a semaphore
30
@end itemize
31
 
32
@section Background
33
 
34
A semaphore can be viewed as a protected variable
35
whose value can be modified only with the
36
@code{@value{DIRPREFIX}semaphore_create},
37
@code{@value{DIRPREFIX}semaphore_obtain}, and
38
@code{@value{DIRPREFIX}semaphore_release} directives.  RTEMS
39
supports both binary and counting semaphores. A binary semaphore
40
is restricted to values of zero or one, while a counting
41
semaphore can assume any non-negative integer value.
42
 
43
A binary semaphore can be used to control access to a
44
single resource.  In particular, it can be used to enforce
45
mutual exclusion for a critical section in user code.  In this
46
instance, the semaphore would be created with an initial count
47
of one to indicate that no task is executing the critical
48
section of code.  Upon entry to the critical section, a task
49
must issue the @code{@value{DIRPREFIX}semaphore_obtain}
50
directive to prevent other tasks from entering the critical section.
51
Upon exit from the critical section, the task must issue the
52
@code{@value{DIRPREFIX}semaphore_release} directive to
53
allow another task to execute the critical section.
54
 
55
A counting semaphore can be used to control access to
56
a pool of two or more resources.  For example, access to three
57
printers could be administered by a semaphore created with an
58
initial count of three.  When a task requires access to one of
59
the printers, it issues the @code{@value{DIRPREFIX}semaphore_obtain}
60
directive to obtain access to a printer.  If a printer is not currently
61
available, the task can wait for a printer to become available or return
62
immediately.  When the task has completed printing, it should
63
issue the @code{@value{DIRPREFIX}semaphore_release}
64
directive to allow other tasks access to the printer.
65
 
66
Task synchronization may be achieved by creating a
67
semaphore with an initial count of zero.  One task waits for the
68
arrival of another task by issuing a @code{@value{DIRPREFIX}semaphore_obtain}
69
directive when it reaches a synchronization point.  The other task
70
performs a corresponding @code{@value{DIRPREFIX}semaphore_release}
71
operation when it reaches its synchronization point, thus unblocking
72
the pending task.
73
 
74
@subsection Nested Resource Access
75
 
76
Deadlock occurs when a task owning a binary semaphore
77
attempts to acquire that same semaphore and blocks as result.
78
Since the semaphore is allocated to a task, it cannot be
79
deleted.  Therefore, the task that currently holds the semaphore
80
and is also blocked waiting for that semaphore will never
81
execute again.
82
 
83
RTEMS addresses this problem by allowing the task
84
holding the binary semaphore to obtain the same binary semaphore
85
multiple times in a nested manner.  Each
86
@code{@value{DIRPREFIX}semaphore_obtain} must be accompanied with a
87
@code{@value{DIRPREFIX}semaphore_release}.  The semaphore will
88
only be made available for acquisition by other tasks when the
89
outermost @code{@value{DIRPREFIX}semaphore_obtain} is matched with
90
a @code{@value{DIRPREFIX}semaphore_release}.
91
 
92
Simple binary semaphores do not allow nested access and so can be used for task synchronization.
93
 
94
 
95
@subsection Priority Inversion
96
 
97
Priority inversion is a form of indefinite
98
postponement which is common in multitasking, preemptive
99
executives with shared resources.  Priority inversion occurs
100
when a high priority tasks requests access to shared resource
101
which is currently allocated to low priority task.  The high
102
priority task must block until the low priority task releases
103
the resource.  This problem is exacerbated when the low priority
104
task is prevented from executing by one or more medium priority
105
tasks.  Because the low priority task is not executing, it
106
cannot complete its interaction with the resource and release
107
that resource.  The high priority task is effectively prevented
108
from executing by lower priority tasks.
109
 
110
@subsection Priority Inheritance
111
 
112
Priority inheritance is an algorithm that calls for
113
the lower priority task holding a resource to have its priority
114
increased to that of the highest priority task blocked waiting
115
for that resource.  Each time a task blocks attempting to obtain
116
the resource, the task holding the resource may have its
117
priority increased.
118
 
119
RTEMS supports priority inheritance for local, binary
120
semaphores that use the priority task wait queue blocking
121
discipline.   When a task of higher priority than the task
122
holding the semaphore blocks, the priority of the task holding
123
the semaphore is increased to that of the blocking task.  When
124
the task holding the task completely releases the binary
125
semaphore (i.e. not for a nested release), the holder's priority
126
is restored to the value it had before any higher priority was
127
inherited.
128
 
129
The RTEMS implementation of the priority inheritance
130
algorithm takes into account the scenario in which a task holds
131
more than one binary semaphore.  The holding task will execute
132
at the priority of the higher of the highest ceiling priority or
133
at the priority of the highest priority task blocked waiting for
134
any of the semaphores the task holds.  Only when the task
135
releases ALL of the binary semaphores it holds will its priority
136
be restored to the normal value.
137
 
138
@subsection Priority Ceiling
139
 
140
Priority ceiling is an algorithm that calls for the
141
lower priority task holding a resource to have its priority
142
increased to that of the highest priority task which will EVER
143
block waiting for that resource.  This algorithm addresses the
144
problem of priority inversion although it avoids the possibility
145
of changing the priority of the task holding the resource
146
multiple times.  The priority ceiling algorithm will only change
147
the priority of the task holding the resource a maximum of one
148
time.  The ceiling priority is set at creation time and must be
149
the priority of the highest priority task which will ever
150
attempt to acquire that semaphore.
151
 
152
RTEMS supports priority ceiling for local, binary
153
semaphores that use the priority task wait queue blocking
154
discipline.   When a task of lower priority than the ceiling
155
priority successfully obtains the semaphore, its priority is
156
raised to the ceiling priority.  When the task holding the task
157
completely releases the binary semaphore (i.e. not for a nested
158
release), the holder's priority is restored to the value it had
159
before any higher priority was put into effect.
160
 
161
The need to identify the highest priority task which
162
will attempt to obtain a particular semaphore can be a difficult
163
task in a large, complicated system.  Although the priority
164
ceiling algorithm is more efficient than the priority
165
inheritance algorithm with respect to the maximum number of task
166
priority changes which may occur while a task holds a particular
167
semaphore, the priority inheritance algorithm is more forgiving
168
in that it does not require this apriori information.
169
 
170
The RTEMS implementation of the priority ceiling
171
algorithm takes into account the scenario in which a task holds
172
more than one binary semaphore.  The holding task will execute
173
at the priority of the higher of the highest ceiling priority or
174
at the priority of the highest priority task blocked waiting for
175
any of the semaphores the task holds.  Only when the task
176
releases ALL of the binary semaphores it holds will its priority
177
be restored to the normal value.
178
 
179
@subsection Building a Semaphore Attribute Set
180
 
181
In general, an attribute set is built by a bitwise OR
182
of the desired attribute components.  The following table lists
183
the set of valid semaphore attributes:
184
 
185
@itemize @bullet
186
@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
187
 
188
@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
189
 
190
@item @code{@value{RPREFIX}BINARY_SEMAPHORE} - restrict values to
191
 
192
 
193
@item @code{@value{RPREFIX}COUNTING_SEMAPHORE} - no restriction on values
194
 
195
@item @code{@value{RPREFIX}SIMPLE_BINARY_SEMAPHORE} - restrict values to
196
 
197
 
198
@item @code{@value{RPREFIX}NO_INHERIT_PRIORITY} - do not use priority
199
inheritance (default)
200
 
201
@item @code{@value{RPREFIX}INHERIT_PRIORITY} - use priority inheritance
202
 
203
@item @code{@value{RPREFIX}PRIORITY_CEILING} - use priority ceiling
204
 
205
@item @code{@value{RPREFIX}NO_PRIORITY_CEILING} - do not use priority
206
ceiling (default)
207
 
208
@item @code{@value{RPREFIX}LOCAL} - local task (default)
209
 
210
@item @code{@value{RPREFIX}GLOBAL} - global task
211
@end itemize
212
 
213
Attribute values are specifically designed to be
214
mutually exclusive, therefore bitwise OR and addition operations
215
are equivalent as long as each attribute appears exactly once in
216
the component list.  An attribute listed as a default is not
217
required to appear in the attribute list, although it is a good
218
programming practice to specify default attributes.  If all
219
defaults are desired, the attribute
220
@code{@value{RPREFIX}DEFAULT_ATTRIBUTES} should be
221
specified on this call.
222
 
223
This example demonstrates the attribute_set parameter needed to create a
224
local semaphore with the task priority waiting queue discipline.  The
225
attribute_set parameter passed to the
226
@code{@value{DIRPREFIX}semaphore_create} directive could be either
227
@code{@value{RPREFIX}PRIORITY} or @code{@value{RPREFIX}LOCAL @value{OR}
228
@value{RPREFIX}PRIORITY}.  The attribute_set parameter can be set to
229
@code{@value{RPREFIX}PRIORITY} because @code{@value{RPREFIX}LOCAL} is the
230
default for all created tasks.  If a similar semaphore were to be known
231
globally, then the attribute_set parameter would be
232
@code{@value{RPREFIX}GLOBAL @value{OR} @value{RPREFIX}PRIORITY}.
233
 
234
@subsection Building a SEMAPHORE_OBTAIN Option Set
235
 
236
In general, an option is built by a bitwise OR of the
237
desired option components.  The set of valid options for the
238
@code{@value{DIRPREFIX}semaphore_obtain} directive are listed
239
in the following table:
240
 
241
@itemize @bullet
242
@item @code{@value{RPREFIX}WAIT} - task will wait for semaphore (default)
243
@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
244
@end itemize
245
 
246
Option values are specifically designed to be mutually exclusive,
247
therefore bitwise OR and addition operations are equivalent as long as
248
each attribute appears exactly once in the component list.  An option
249
listed as a default is not required to appear in the list, although it is
250
a good programming practice to specify default options.  If all defaults
251
are desired, the option @code{@value{RPREFIX}DEFAULT_OPTIONS} should be
252
specified on this call.
253
 
254
This example demonstrates the option parameter needed
255
to poll for a semaphore.  The option parameter passed to the
256
@code{@value{DIRPREFIX}semaphore_obtain}
257
directive should be @code{@value{RPREFIX}NO_WAIT}.
258
 
259
@section Operations
260
 
261
@subsection Creating a Semaphore
262
 
263
The @code{@value{DIRPREFIX}semaphore_create} directive creates a binary or
264
counting semaphore with a user-specified name as well as an
265
initial count.  If a binary semaphore is created with a count of
266
zero (0) to indicate that it has been allocated, then the task
267
creating the semaphore is considered the current holder of the
268
semaphore.  At create time the method for ordering waiting tasks
269
in the semaphore's task wait queue (by FIFO or task priority) is
270
specified.  Additionally, the priority inheritance or priority
271
ceiling algorithm may be selected for local, binary semaphores
272
that use the priority task wait queue blocking discipline.  If
273
the priority ceiling algorithm is selected, then the highest
274
priority of any task which will attempt to obtain this semaphore
275
must be specified.  RTEMS allocates a Semaphore Control Block
276
(SMCB) from the SMCB free list.  This data structure is used by
277
RTEMS to manage the newly created semaphore.  Also, a unique
278
semaphore ID is generated and returned to the calling task.
279
 
280
@subsection Obtaining Semaphore IDs
281
 
282
When a semaphore is created, RTEMS generates a unique
283
semaphore ID and assigns it to the created semaphore until it is
284
deleted.  The semaphore ID may be obtained by either of two
285
methods.  First, as the result of an invocation of the
286
@code{@value{DIRPREFIX}semaphore_create} directive, the
287
semaphore ID is stored in a user provided location.  Second,
288
the semaphore ID may be obtained later using the
289
@code{@value{DIRPREFIX}semaphore_ident} directive.  The semaphore ID is
290
used by other semaphore manager directives to access this
291
semaphore.
292
 
293
@subsection Acquiring a Semaphore
294
 
295
The @code{@value{DIRPREFIX}semaphore_obtain} directive is used to acquire the
296
specified semaphore.  A simplified version of the
297
@code{@value{DIRPREFIX}semaphore_obtain} directive can be described as follows:
298
 
299
@example
300
if semaphore's count is greater than zero
301
   then decrement semaphore's count
302
   else wait for release of semaphore
303
 
304
return SUCCESSFUL
305
@end example
306
 
307
When the semaphore cannot be immediately acquired,
308
one of the following situations applies:
309
 
310
@itemize @bullet
311
@item By default, the calling task will wait forever to
312
acquire the semaphore.
313
 
314
@item Specifying @code{@value{RPREFIX}NO_WAIT} forces an immediate return
315
with an error status code.
316
 
317
@item Specifying a timeout limits the interval the task will
318
wait before returning with an error status code.
319
@end itemize
320
 
321
If the task waits to acquire the semaphore, then it
322
is placed in the semaphore's task wait queue in either FIFO or
323
task priority order.  If the task blocked waiting for a binary
324
semaphore using priority inheritance and the task's priority is
325
greater than that of the task currently holding the semaphore,
326
then the holding task will inherit the priority of the blocking
327
task.  All tasks waiting on a semaphore are returned an error
328
code when the semaphore is deleted.
329
 
330
When a task successfully obtains a semaphore using
331
priority ceiling and the priority ceiling for this semaphore is
332
greater than that of the holder, then the holder's priority will
333
be elevated.
334
 
335
@subsection Releasing a Semaphore
336
 
337
The @code{@value{DIRPREFIX}semaphore_release} directive is used to release
338
the specified semaphore.  A simplified version of the
339
@code{@value{DIRPREFIX}semaphore_release} directive can be described as
340
follows:
341
 
342
@example
343
if no tasks are waiting on this semaphore
344
   then increment semaphore's count
345
   else assign semaphore to a waiting task
346
 
347
return SUCCESSFUL
348
@end example
349
 
350
If this is the outermost release of a binary
351
semaphore that uses priority inheritance or priority ceiling and
352
the task does not currently hold any other binary semaphores,
353
then the task performing the @code{@value{DIRPREFIX}semaphore_release}
354
will have its priority restored to its normal value.
355
 
356
@subsection Deleting a Semaphore
357
 
358
The @code{@value{DIRPREFIX}semaphore_delete} directive removes a semaphore
359
from the system and frees its control block.  A semaphore can be
360
deleted by any local task that knows the semaphore's ID.  As a
361
result of this directive, all tasks blocked waiting to acquire
362
the semaphore will be readied and returned a status code which
363
indicates that the semaphore was deleted.  Any subsequent
364
references to the semaphore's name and ID are invalid.
365
 
366
@section Directives
367
 
368
This section details the semaphore manager's
369
directives.  A subsection is dedicated to each of this manager's
370
directives and describes the calling sequence, related
371
constants, usage, and status codes.
372
 
373
@c
374
@c
375
@c
376
@page
377
@subsection SEMAPHORE_CREATE - Create a semaphore
378
 
379
@cindex create a semaphore
380
 
381
@subheading CALLING SEQUENCE:
382
 
383
@ifset is-C
384
@findex rtems_semaphore_create
385
@example
386
rtems_status_code rtems_semaphore_create(
387
  rtems_name           name,
388
  rtems_unsigned32     count,
389
  rtems_attribute      attribute_set,
390
  rtems_task_priority  priority_ceiling,
391
  rtems_id            *id
392
);
393
@end example
394
@end ifset
395
 
396
@ifset is-Ada
397
@example
398
procedure Semaphore_Create (
399
   Name          : in     RTEMS.Name;
400
   Count         : in     RTEMS.Unsigned32;
401
   Attribute_Set : in     RTEMS.Attribute;
402
   ID            :    out RTEMS.ID;
403
   Result        :    out RTEMS.Status_Codes
404
);
405
@end example
406
@end ifset
407
 
408
@subheading DIRECTIVE STATUS CODES:
409
@code{@value{RPREFIX}SUCCESSFUL} - semaphore created successfully@*
410
@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
411
@code{@value{RPREFIX}TOO_MANY} - too many semaphores created@*
412
@code{@value{RPREFIX}NOT_DEFINED} - invalid attribute set@*
413
@code{@value{RPREFIX}INVALID_NUMBER} - invalid starting count for binary semaphore@*
414
@code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured@*
415
@code{@value{RPREFIX}TOO_MANY} - too many global objects
416
 
417
@subheading DESCRIPTION:
418
 
419
This directive creates a semaphore which resides on
420
the local node. The created semaphore has the user-defined name
421
specified in name and the initial count specified in count.  For
422
control and maintenance of the semaphore, RTEMS allocates and
423
initializes a SMCB.  The RTEMS-assigned semaphore id is returned
424
in id.  This semaphore id is used with other semaphore related
425
directives to access the semaphore.
426
 
427
Specifying PRIORITY in attribute_set causes tasks
428
waiting for a semaphore to be serviced according to task
429
priority.  When FIFO is selected, tasks are serviced in First
430
In-First Out order.
431
 
432
@subheading NOTES:
433
 
434
This directive will not cause the calling task to be
435
preempted.
436
 
437
The priority inheritance and priority ceiling
438
algorithms are only supported for local, binary semaphores that
439
use the priority task wait queue blocking discipline.
440
 
441
The following semaphore attribute constants are
442
defined by RTEMS:
443
 
444
@itemize @bullet
445
@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
446
 
447
@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
448
 
449
@item @code{@value{RPREFIX}BINARY_SEMAPHORE} - restrict values to
450
 
451
 
452
@item @code{@value{RPREFIX}COUNTING_SEMAPHORE} - no restriction on values
453
 
454
@item @code{@value{RPREFIX}SIMPLE_BINARY_SEMAPHORE} - restrict values to
455
 
456
 
457
@item @code{@value{RPREFIX}NO_INHERIT_PRIORITY} - do not use priority
458
inheritance (default)
459
 
460
@item @code{@value{RPREFIX}INHERIT_PRIORITY} - use priority inheritance
461
 
462
@item @code{@value{RPREFIX}PRIORITY_CEILING} - use priority ceiling
463
 
464
@item @code{@value{RPREFIX}NO_PRIORITY_CEILING} - do not use priority
465
ceiling (default)
466
 
467
@item @code{@value{RPREFIX}LOCAL} - local task (default)
468
 
469
@item @code{@value{RPREFIX}GLOBAL} - global task
470
@end itemize
471
 
472
Semaphores should not be made global unless remote
473
tasks must interact with the created semaphore.  This is to
474
avoid the system overhead incurred by the creation of a global
475
semaphore.  When a global semaphore is created, the semaphore's
476
name and id must be transmitted to every node in the system for
477
insertion in the local copy of the global object table.
478
 
479
The total number of global objects, including
480
semaphores, is limited by the maximum_global_objects field in
481
the Configuration Table.
482
 
483
@c
484
@c
485
@c
486
@page
487
@subsection SEMAPHORE_IDENT - Get ID of a semaphore
488
 
489
@cindex get ID of a semaphore
490
@cindex obtain ID of a semaphore
491
 
492
@subheading CALLING SEQUENCE:
493
 
494
@ifset is-C
495
@findex rtems_semaphore_ident
496
@example
497
rtems_status_code rtems_semaphore_ident(
498
  rtems_name        name,
499
  rtems_unsigned32  node,
500
  rtems_id         *id
501
);
502
@end example
503
@end ifset
504
 
505
@ifset is-Ada
506
@example
507
procedure Semaphore_Ident (
508
   Name   : in     RTEMS.Name;
509
   Node   : in     RTEMS.Unsigned32;
510
   ID     :    out RTEMS.ID;
511
   Result :    out RTEMS.Status_Codes
512
);
513
@end example
514
@end ifset
515
 
516
@subheading DIRECTIVE STATUS CODES:
517
@code{@value{RPREFIX}SUCCESSFUL} - semaphore identified successfully@*
518
@code{@value{RPREFIX}INVALID_NAME} - semaphore name not found@*
519
@code{@value{RPREFIX}INVALID_NODE} - invalid node id
520
 
521
@subheading DESCRIPTION:
522
 
523
This directive obtains the semaphore id associated
524
with the semaphore name.  If the semaphore name is not unique,
525
then the semaphore id will match one of the semaphores with that
526
name.  However, this semaphore id is not guaranteed to
527
correspond to the desired semaphore.  The semaphore id is used
528
by other semaphore related directives to access the semaphore.
529
 
530
@subheading NOTES:
531
 
532
This directive will not cause the running task to be
533
preempted.
534
 
535
If node is @code{@value{RPREFIX}SEARCH_ALL_NODES}, all nodes are searched
536
with the local node being searched first.  All other nodes are
537
searched with the lowest numbered node searched first.
538
 
539
If node is a valid node number which does not
540
represent the local node, then only the semaphores exported by
541
the designated node are searched.
542
 
543
This directive does not generate activity on remote
544
nodes.  It accesses only the local copy of the global object
545
table.
546
 
547
@c
548
@c
549
@c
550
@page
551
@subsection SEMAPHORE_DELETE - Delete a semaphore
552
 
553
@cindex delete a semaphore
554
 
555
@subheading CALLING SEQUENCE:
556
 
557
@ifset is-C
558
@findex rtems_semaphore_delete
559
@example
560
rtems_status_code rtems_semaphore_delete(
561
  rtems_id id
562
);
563
@end example
564
@end ifset
565
 
566
@ifset is-Ada
567
@example
568
procedure Semaphore_Delete (
569
   ID     : in     RTEMS.ID;
570
   Result :    out RTEMS.Status_Codes
571
);
572
@end example
573
@end ifset
574
 
575
@subheading DIRECTIVE STATUS CODES:
576
@code{@value{RPREFIX}SUCCESSFUL} -  semaphore deleted successfully@*
577
@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id@*
578
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot delete remote semaphore@*
579
@code{@value{RPREFIX}RESOURCE_IN_USE} - binary semaphore is in use
580
 
581
@subheading DESCRIPTION:
582
 
583
This directive deletes the semaphore specified by @code{id}.
584
All tasks blocked waiting to acquire the semaphore will be
585
readied and returned a status code which indicates that the
586
semaphore was deleted.  The SMCB for this semaphore is reclaimed
587
by RTEMS.
588
 
589
@subheading NOTES:
590
 
591
The calling task will be preempted if it is enabled
592
by the task's execution mode and a higher priority local task is
593
waiting on the deleted semaphore.  The calling task will NOT be
594
preempted if all of the tasks that are waiting on the semaphore
595
are remote tasks.
596
 
597
The calling task does not have to be the task that
598
created the semaphore.  Any local task that knows the semaphore
599
id can delete the semaphore.
600
 
601
When a global semaphore is deleted, the semaphore id
602
must be transmitted to every node in the system for deletion
603
from the local copy of the global object table.
604
 
605
The semaphore must reside on the local node, even if
606
the semaphore was created with the @code{@value{RPREFIX}GLOBAL} option.
607
 
608
Proxies, used to represent remote tasks, are
609
reclaimed when the semaphore is deleted.
610
 
611
@c
612
@c
613
@c
614
@page
615
@subsection SEMAPHORE_OBTAIN - Acquire a semaphore
616
 
617
@cindex obtain a semaphore
618
@cindex lock a semaphore
619
 
620
@subheading CALLING SEQUENCE:
621
 
622
@ifset is-C
623
@findex rtems_semaphore_obtain
624
@example
625
rtems_status_code rtems_semaphore_obtain(
626
  rtems_id         id,
627
  rtems_unsigned32 option_set,
628
  rtems_interval   timeout
629
);
630
@end example
631
@end ifset
632
 
633
@ifset is-Ada
634
@example
635
procedure Semaphore_Obtain (
636
   ID         : in     RTEMS.ID;
637
   Option_Set : in     RTEMS.Option;
638
   Timeout    : in     RTEMS.Interval;
639
   Result     :    out RTEMS.Status_Codes
640
);
641
@end example
642
@end ifset
643
 
644
@subheading DIRECTIVE STATUS CODES:
645
@code{@value{RPREFIX}SUCCESSFUL} - semaphore obtained successfully@*
646
@code{@value{RPREFIX}UNSATISFIED} - semaphore not available@*
647
@code{@value{RPREFIX}TIMEOUT} - timed out waiting for semaphore@*
648
@code{@value{RPREFIX}OBJECT_WAS_DELETED} - semaphore deleted while waiting@*
649
@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id
650
 
651
@subheading DESCRIPTION:
652
 
653
This directive acquires the semaphore specified by
654
id.  The @code{@value{RPREFIX}WAIT} and @code{@value{RPREFIX}NO_WAIT} components of the options parameter
655
indicate whether the calling task wants to wait for the
656
semaphore to become available or return immediately if the
657
semaphore is not currently available.  With either @code{@value{RPREFIX}WAIT} or
658
@code{@value{RPREFIX}NO_WAIT}, if the current semaphore count is positive, then it is
659
decremented by one and the semaphore is successfully acquired by
660
returning immediately with a successful return code.
661
 
662
If the calling task chooses to return immediately and the current
663
semaphore count is zero or negative, then a status code is returned
664
indicating that the semaphore is not available. If the calling task
665
chooses to wait for a semaphore and the current semaphore count is zero or
666
negative, then it is decremented by one and the calling task is placed on
667
the semaphore's wait queue and blocked.  If the semaphore was created with
668
the @code{@value{RPREFIX}PRIORITY} attribute, then the calling task is
669
inserted into the queue according to its priority.  However, if the
670
semaphore was created with the @code{@value{RPREFIX}FIFO} attribute, then
671
the calling task is placed at the rear of the wait queue.  If the binary
672
semaphore was created with the @code{@value{RPREFIX}INHERIT_PRIORITY}
673
attribute, then the priority of the task currently holding the binary
674
semaphore is guaranteed to be greater than or equal to that of the
675
blocking task.  If the binary semaphore was created with the
676
@code{@value{RPREFIX}PRIORITY_CEILING} attribute, a task successfully
677
obtains the semaphore, and the priority of that task is greater than the
678
ceiling priority for this semaphore, then the priority of the task
679
obtaining the semaphore is elevated to that of the ceiling.
680
 
681
The timeout parameter specifies the maximum interval the calling task is
682
willing to be blocked waiting for the semaphore.  If it is set to
683
@code{@value{RPREFIX}NO_TIMEOUT}, then the calling task will wait forever.
684
If the semaphore is available or the @code{@value{RPREFIX}NO_WAIT} option
685
component is set, then timeout is ignored.
686
 
687
@subheading NOTES:
688
The following semaphore acquisition option constants
689
are defined by RTEMS:
690
 
691
@itemize @bullet
692
@item @code{@value{RPREFIX}WAIT} - task will wait for semaphore (default)
693
@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
694
@end itemize
695
 
696
Attempting to obtain a global semaphore which does not reside on the local
697
node will generate a request to the remote node to access the semaphore.
698
If the semaphore is not available and @code{@value{RPREFIX}NO_WAIT} was
699
not specified, then the task must be blocked until the semaphore is
700
released.  A proxy is allocated on the remote node to represent the task
701
until the semaphore is released.
702
 
703
A clock tick is required to support the timeout functionality of
704
this directive.
705
 
706
@c
707
@c
708
@c
709
@page
710
@subsection SEMAPHORE_RELEASE - Release a semaphore
711
 
712
@cindex release a semaphore
713
@cindex unlock a semaphore
714
 
715
@subheading CALLING SEQUENCE:
716
 
717
@ifset is-C
718
@findex rtems_semaphore_release
719
@example
720
rtems_status_code rtems_semaphore_release(
721
  rtems_id id
722
);
723
@end example
724
@end ifset
725
 
726
@ifset is-Ada
727
@example
728
procedure Semaphore_Release (
729
   ID     : in     RTEMS.ID;
730
   Result :    out RTEMS.Status_Codes
731
);
732
@end example
733
@end ifset
734
 
735
@subheading DIRECTIVE STATUS CODES:
736
@code{@value{RPREFIX}SUCCESSFUL} - semaphore released successfully@*
737
@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id@*
738
@code{@value{RPREFIX}NOT_OWNER_OF_RESOURCE} - calling task does not own semaphore
739
 
740
@subheading DESCRIPTION:
741
 
742
This directive releases the semaphore specified by
743
id.  The semaphore count is incremented by one.  If the count is
744
zero or negative, then the first task on this semaphore's wait
745
queue is removed and unblocked.  The unblocked task may preempt
746
the running task if the running task's preemption mode is
747
enabled and the unblocked task has a higher priority than the
748
running task.
749
 
750
@subheading NOTES:
751
 
752
The calling task may be preempted if it causes a
753
higher priority task to be made ready for execution.
754
 
755
Releasing a global semaphore which does not reside on
756
the local node will generate a request telling the remote node
757
to release the semaphore.
758
 
759
If the task to be unblocked resides on a different
760
node from the semaphore, then the semaphore allocation is
761
forwarded to the appropriate node, the waiting task is
762
unblocked, and the proxy used to represent the task is reclaimed.
763
 
764
The outermost release of a local, binary, priority
765
inheritance or priority ceiling semaphore may result in the
766
calling task having its priority lowered.  This will occur if
767
the calling task holds no other binary semaphores and it has
768
inherited a higher priority.
769
 
770
@c
771
@c
772
@c
773
@page
774
@subsection SEMAPHORE_FLUSH - Unblock all tasks waiting on a semaphore
775
 
776
@cindex flush a semaphore
777
@cindex unblock all tasks waiting on a semaphore
778
 
779
@subheading CALLING SEQUENCE:
780
 
781
@ifset is-C
782
@findex rtems_semaphore_flush
783
@example
784
rtems_status_code rtems_semaphore_flush(
785
  rtems_id id
786
);
787
@end example
788
@end ifset
789
 
790
@ifset is-Ada
791
@example
792
procedure Semaphore_Flush (
793
   ID     : in     RTEMS.ID;
794
   Result :    out RTEMS.Status_Codes
795
);
796
@end example
797
@end ifset
798
 
799
@subheading DIRECTIVE STATUS CODES:
800
@code{@value{RPREFIX}SUCCESSFUL} - semaphore released successfully@*
801
@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id@*
802
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported for remote semaphores
803
 
804
@subheading DESCRIPTION:
805
 
806
This directive unblocks all tasks waiting on the semaphore specified by
807
id.  Since there are tasks blocked on the semaphore, the semaphore's
808
count is not changed by this directive and thus is zero before and
809
after this directive is executed.  Tasks which are unblocked as the
810
result of this directive will return from the
811
@code{@value{DIRPREFIX}semaphore_release} directive with a
812
status code of @code{@value{RPREFIX}UNSATISFIED} to indicate
813
that the semaphore was not obtained.
814
 
815
This directive may unblock any number of tasks.  Any of the unblocked
816
tasks may preempt the running task if the running task's preemption mode is
817
enabled and an unblocked task has a higher priority than the
818
running task.
819
 
820
@subheading NOTES:
821
 
822
The calling task may be preempted if it causes a
823
higher priority task to be made ready for execution.
824
 
825
If the task to be unblocked resides on a different
826
node from the semaphore, then the waiting task is
827
unblocked, and the proxy used to represent the task is reclaimed.
828
 
829
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.