1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
brief: |
Creates a semaphore with the specified properties and returns its identifier.
copyrights:
- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
- Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
definition:
default:
body: null
params:
- ${../../type/if/name:/name} ${.:/params[0]/name}
- ${/c/if/uint32_t:/name} ${.:/params[1]/name}
- ${../../attr/if/attribute:/name} ${.:/params[2]/name}
- ${../../task/if/priority:/name} ${.:/params[3]/name}
- ${../../type/if/id:/name} *${.:/params[4]/name}
return: ${../../status/if/code:/name}
variants: []
description: |
This directive creates a semaphore which resides on the local node. The new
semaphore has the user-defined name specified in ``name`` and the initial
count specified in ``count``. For control and maintenance of the semaphore,
RTEMS allocates and initializes a ${/glossary/smcb:/term}. The
RTEMS-assigned semaphore identifier is returned in ``id``. This semaphore
identifier is used with other semaphore related directives to access the
semaphore.
The attribute set specified in ``attribute_set`` defines
* the scope of the semaphore (local or global),
* the discipline of the task wait queue used by the semaphore (FIFO or
priority),
* the class of the semaphore (counting, binary, or simple binary), and
* the locking protocol of a binary semaphore (priority inheritance, priority
ceiling or MrsP).
The attribute set is built through a *bitwise or* of the attribute constants
described below. Not all combinations of attributes are allowed. Some
attributes are mutually exclusive. If mutually exclusive attributes are
combined, the behaviour is undefined.
The *scope of a semaphore* is either the local node only (local scope) or all
nodes in a multiprocessing network (global scope). The scope is selected by
the mutually exclusive ${../../attr/if/local:/name} and
${../../attr/if/global:/name} attributes.
* The local scope is the default and can be emphasized through use
of the ${../../attr/if/local:/name} attribute.
* The global scope is selected by the ${../../attr/if/global:/name} attribute. In
a single node system and the local and global scope are identical.
The *task wait queue discipline* is selected by the mutually exclusive
${../../attr/if/fifo:/name} and ${../../attr/if/priority:/name} attributes.
* The ${/glossary/fifo:/term} discipline is the default and can be emphasized
through use of the ${../../attr/if/fifo:/name} attribute.
* The priority discipline is selected by the ${../../attr/if/priority:/name}
attribute. Some locking protocols require the priority discipline.
The *semaphore class* is selected by the mutually exclusive
${../../attr/if/counting-semaphore:/name},
${../../attr/if/binary-semaphore:/name}, and
${../../attr/if/simple-binary-semaphore:/name} attributes.
* Counting semaphores are the default and can be emphasized through use of
the ${../../attr/if/counting-semaphore:/name} attribute.
* Binary semaphores are mutual exclusion (mutex) synchronization primitives
which may have an owner. The count of a binary semaphore is restricted to
0 and 1. The binary semaphore class is selected by the
${../../attr/if/binary-semaphore:/name} attribute.
* Simple binary semaphores have no owner. The count of a simple binary
semaphore is restricted to 0 and 1. They may be used for task and
interrupt synchronization. The simple binary semaphore class is selected
by the ${../../attr/if/simple-binary-semaphore:/name} attribute.
Binary semaphores may use a *locking protocol*. If a locking protocol is
selected, then the scope shall be local and the priority task wait queue
discipline shall be selected. The locking protocol is selected by the
mutually exclusive ${../../attr/if/inherit-priority:/name},
${../../attr/if/priority-ceiling:/name}, and
${../../attr/if/multiprocessor-resource-sharing:/name} attributes.
* The default is to use no locking protocol.
* The ${../../attr/if/inherit-priority:/name} attribute selects the priority
inheritance locking protocol.
* The ${../../attr/if/priority-ceiling:/name} attribute selects the priority
ceiling locking protocol. For this locking protocol a priority ceiling
shall be specified in ``priority_ceiling``.
* The ${../../attr/if/multiprocessor-resource-sharing:/name} attribute selects the
MrsP locking protocol in SMP configurations, otherwise it selects the
priority ceiling protocol. For this locking protocol a priority ceiling
shall be specified in ``priority_ceiling``. This priority is used to set
the priority ceiling in all scheduler instances. This can be changed later
with the ${set-priority:/name} directive using the returned semaphore
identifier.
enabled-by: true
interface-type: function
links:
- role: interface-placement
uid: header
- role: interface-ingroup
uid: group
name: rtems_semaphore_create
notes: |
This directive may cause the calling task to be preempted due to an obtain
and release of the object allocator mutex.
Semaphores should not be made global unless remote tasks must interact with
the new semaphore. This is to avoid the system overhead incurred by the
creation of a global semaphore. When a global semaphore is created, the
semaphore's name and identifier must be transmitted to every node in the
system for insertion in the local copy of the global object table.
The total number of global objects, including semaphores, is limited by the
${/acfg/if/mp-max-global-objects:/name} application configuration option.
It is not allowed to create an initially locked MrsP semaphore and the
${../../status/if/invalid-number:/name} status code will be returned in SMP
configurations in this case. This prevents lock order reversal problems
with the allocator mutex.
params:
- description: is the object name of the new semaphore.
dir: null
name: name
- description: |
is the initial count of the new semaphore. If the semaphore is a mutex,
then a count of 0 will make the calling task the owner of the new mutex and
a count of 1 will create a mutex without an owner.
dir: null
name: count
- description: |
is the attribute set which defines the properties of the new semaphore.
dir: null
name: attribute_set
- description: |
is the priority ceiling if the new semaphore is a binary semaphore with the
priority ceiling or MrsP semaphore locking protocol as defined by the
attribute set.
dir: null
name: priority_ceiling
- description: |
is the pointer to an object identifier variable. The object identifier of
the new semaphore will be stored in this variable, in case of a successful
operation.
dir: out
name: id
return:
return: null
return-values:
- description: |
The requested operation was successful.
value: ${../../status/if/successful:/name}
- description: |
The ${.:/params[3]/name} parameter was ${/c/if/null:/name}.
value: ${../../status/if/invalid-address:/name}
- description: |
The semaphore name was invalid.
value: ${../../status/if/invalid-name:/name}
- description: |
The priority ceiling was invalid.
value: ${../../status/if/invalid-priority:/name}
- description: |
The attribute set was invalid.
value: ${../../status/if/not-defined:/name}
- description: |
There was no inactive semaphore object available to create a new
semaphore. The semaphore object maximum is defined by the
${/acfg/if/max-semaphores:/name} application configuration option.
value: ${../../status/if/too-many:/name}
- description: |
In multiprocessing configurations, there was no inactive global object
available to create a new global semaphore.
value: ${../../status/if/too-many:/name}
type: interface
|