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 task.t,v 1.29 2002/01/17 21:47:47 joel Exp
|
7 |
|
|
@c
|
8 |
|
|
|
9 |
|
|
@chapter Task Manager
|
10 |
|
|
|
11 |
|
|
@cindex tasks
|
12 |
|
|
|
13 |
|
|
@section Introduction
|
14 |
|
|
|
15 |
|
|
The task manager provides a comprehensive set of directives to
|
16 |
|
|
create, delete, and administer tasks. The directives provided
|
17 |
|
|
by the task manager are:
|
18 |
|
|
|
19 |
|
|
@itemize @bullet
|
20 |
|
|
@item @code{@value{DIRPREFIX}task_create} - Create a task
|
21 |
|
|
@item @code{@value{DIRPREFIX}task_ident} - Get ID of a task
|
22 |
|
|
@item @code{@value{DIRPREFIX}task_start} - Start a task
|
23 |
|
|
@item @code{@value{DIRPREFIX}task_restart} - Restart a task
|
24 |
|
|
@item @code{@value{DIRPREFIX}task_delete} - Delete a task
|
25 |
|
|
@item @code{@value{DIRPREFIX}task_suspend} - Suspend a task
|
26 |
|
|
@item @code{@value{DIRPREFIX}task_resume} - Resume a task
|
27 |
|
|
@item @code{@value{DIRPREFIX}task_is_suspended} - Determine if a task is suspended
|
28 |
|
|
@item @code{@value{DIRPREFIX}task_set_priority} - Set task priority
|
29 |
|
|
@item @code{@value{DIRPREFIX}task_mode} - Change current task's mode
|
30 |
|
|
@item @code{@value{DIRPREFIX}task_get_note} - Get task notepad entry
|
31 |
|
|
@item @code{@value{DIRPREFIX}task_set_note} - Set task notepad entry
|
32 |
|
|
@item @code{@value{DIRPREFIX}task_wake_after} - Wake up after interval
|
33 |
|
|
@item @code{@value{DIRPREFIX}task_wake_when} - Wake up when specified
|
34 |
|
|
@item @code{@value{DIRPREFIX}task_variable_add} - Associate per task variable
|
35 |
|
|
@item @code{@value{DIRPREFIX}task_variable_get} - Obtain value of a a per task variable
|
36 |
|
|
@item @code{@value{DIRPREFIX}task_variable_delete} - Remove per task variable
|
37 |
|
|
@end itemize
|
38 |
|
|
|
39 |
|
|
@section Background
|
40 |
|
|
|
41 |
|
|
@subsection Task Definition
|
42 |
|
|
|
43 |
|
|
@cindex task, definition
|
44 |
|
|
|
45 |
|
|
Many definitions of a task have been proposed in computer literature.
|
46 |
|
|
Unfortunately, none of these definitions encompasses all facets of the
|
47 |
|
|
concept in a manner which is operating system independent. Several of the
|
48 |
|
|
more common definitions are provided to enable each user to select a
|
49 |
|
|
definition which best matches their own experience and understanding of the
|
50 |
|
|
task concept:
|
51 |
|
|
|
52 |
|
|
@itemize @bullet
|
53 |
|
|
@item a "dispatchable" unit.
|
54 |
|
|
|
55 |
|
|
@item an entity to which the processor is allocated.
|
56 |
|
|
|
57 |
|
|
@item an atomic unit of a real-time, multiprocessor system.
|
58 |
|
|
|
59 |
|
|
@item single threads of execution which concurrently compete for resources.
|
60 |
|
|
|
61 |
|
|
@item a sequence of closely related computations which can execute
|
62 |
|
|
concurrently with other computational sequences.
|
63 |
|
|
|
64 |
|
|
@end itemize
|
65 |
|
|
|
66 |
|
|
From RTEMS' perspective, a task is the smallest thread of
|
67 |
|
|
execution which can compete on its own for system resources. A
|
68 |
|
|
task is manifested by the existence of a task control block
|
69 |
|
|
(TCB).
|
70 |
|
|
|
71 |
|
|
@subsection Task Control Block
|
72 |
|
|
|
73 |
|
|
The Task Control Block (TCB) is an RTEMS defined data structure
|
74 |
|
|
which contains all the information that is pertinent to the
|
75 |
|
|
execution of a task. During system initialization, RTEMS
|
76 |
|
|
reserves a TCB for each task configured. A TCB is allocated
|
77 |
|
|
upon creation of the task and is returned to the TCB free list
|
78 |
|
|
upon deletion of the task.
|
79 |
|
|
|
80 |
|
|
The TCB's elements are modified as a result of system calls made
|
81 |
|
|
by the application in response to external and internal stimuli.
|
82 |
|
|
TCBs are the only RTEMS internal data structure that can be
|
83 |
|
|
accessed by an application via user extension routines. The TCB
|
84 |
|
|
contains a task's name, ID, current priority, current and
|
85 |
|
|
starting states, execution mode, set of notepad locations, TCB
|
86 |
|
|
user extension pointer, scheduling control structures, as well
|
87 |
|
|
as data required by a blocked task.
|
88 |
|
|
|
89 |
|
|
A task's context is stored in the TCB when a task switch occurs.
|
90 |
|
|
When the task regains control of the processor, its context is
|
91 |
|
|
restored from the TCB. When a task is restarted, the initial
|
92 |
|
|
state of the task is restored from the starting context area in
|
93 |
|
|
the task's TCB.
|
94 |
|
|
|
95 |
|
|
@subsection Task States
|
96 |
|
|
|
97 |
|
|
@cindex task states
|
98 |
|
|
|
99 |
|
|
A task may exist in one of the following five states:
|
100 |
|
|
|
101 |
|
|
@itemize @bullet
|
102 |
|
|
@item @b{executing} - Currently scheduled to the CPU
|
103 |
|
|
@item @b{ready} - May be scheduled to the CPU
|
104 |
|
|
@item @b{blocked} - Unable to be scheduled to the CPU
|
105 |
|
|
@item @b{dormant} - Created task that is not started
|
106 |
|
|
@item @b{non-existent} - Uncreated or deleted task
|
107 |
|
|
@end itemize
|
108 |
|
|
|
109 |
|
|
An active task may occupy the executing, ready, blocked or
|
110 |
|
|
dormant state, otherwise the task is considered non-existent.
|
111 |
|
|
One or more tasks may be active in the system simultaneously.
|
112 |
|
|
Multiple tasks communicate, synchronize, and compete for system
|
113 |
|
|
resources with each other via system calls. The multiple tasks
|
114 |
|
|
appear to execute in parallel, but actually each is dispatched
|
115 |
|
|
to the CPU for periods of time determined by the RTEMS
|
116 |
|
|
scheduling algorithm. The scheduling of a task is based on its
|
117 |
|
|
current state and priority.
|
118 |
|
|
|
119 |
|
|
@subsection Task Priority
|
120 |
|
|
|
121 |
|
|
@cindex task priority
|
122 |
|
|
@cindex priority, task
|
123 |
|
|
@findex rtems_task_priority
|
124 |
|
|
|
125 |
|
|
A task's priority determines its importance in relation to the
|
126 |
|
|
other tasks executing on the same processor. RTEMS supports 255
|
127 |
|
|
levels of priority ranging from 1 to 255. The data type
|
128 |
|
|
@code{@value{DIRPREFIX}task_priority} is used to store task
|
129 |
|
|
priorities.
|
130 |
|
|
|
131 |
|
|
Tasks of numerically
|
132 |
|
|
smaller priority values are more important tasks than tasks of
|
133 |
|
|
numerically larger priority values. For example, a task at
|
134 |
|
|
priority level 5 is of higher privilege than a task at priority
|
135 |
|
|
level 10. There is no limit to the number of tasks assigned to
|
136 |
|
|
the same priority.
|
137 |
|
|
|
138 |
|
|
Each task has a priority associated with it at all times. The
|
139 |
|
|
initial value of this priority is assigned at task creation
|
140 |
|
|
time. The priority of a task may be changed at any subsequent
|
141 |
|
|
time.
|
142 |
|
|
|
143 |
|
|
Priorities are used by the scheduler to determine which ready
|
144 |
|
|
task will be allowed to execute. In general, the higher the
|
145 |
|
|
logical priority of a task, the more likely it is to receive
|
146 |
|
|
processor execution time.
|
147 |
|
|
|
148 |
|
|
@subsection Task Mode
|
149 |
|
|
|
150 |
|
|
@cindex task mode
|
151 |
|
|
@findex rtems_task_mode
|
152 |
|
|
|
153 |
|
|
A task's execution mode is a combination of the following
|
154 |
|
|
four components:
|
155 |
|
|
|
156 |
|
|
@itemize @bullet
|
157 |
|
|
@item preemption
|
158 |
|
|
@item ASR processing
|
159 |
|
|
@item timeslicing
|
160 |
|
|
@item interrupt level
|
161 |
|
|
@end itemize
|
162 |
|
|
|
163 |
|
|
It is used to modify RTEMS' scheduling process and to alter the
|
164 |
|
|
execution environment of the task. The data type
|
165 |
|
|
@code{@value{DIRPREFIX}task_mode} is used to manage the task
|
166 |
|
|
execution mode.
|
167 |
|
|
|
168 |
|
|
@cindex preemption
|
169 |
|
|
|
170 |
|
|
The preemption component allows a task to determine when control of the
|
171 |
|
|
processor is relinquished. If preemption is disabled
|
172 |
|
|
(@code{@value{RPREFIX}NO_PREEMPT}), the task will retain control of the
|
173 |
|
|
processor as long as it is in the executing state -- even if a higher
|
174 |
|
|
priority task is made ready. If preemption is enabled
|
175 |
|
|
(@code{@value{RPREFIX}PREEMPT}) and a higher priority task is made ready,
|
176 |
|
|
then the processor will be taken away from the current task immediately and
|
177 |
|
|
given to the higher priority task.
|
178 |
|
|
|
179 |
|
|
@cindex timeslicing
|
180 |
|
|
|
181 |
|
|
The timeslicing component is used by the RTEMS scheduler to determine how
|
182 |
|
|
the processor is allocated to tasks of equal priority. If timeslicing is
|
183 |
|
|
enabled (@code{@value{RPREFIX}TIMESLICE}), then RTEMS will limit the amount
|
184 |
|
|
of time the task can execute before the processor is allocated to another
|
185 |
|
|
ready task of equal priority. The length of the timeslice is application
|
186 |
|
|
dependent and specified in the Configuration Table. If timeslicing is
|
187 |
|
|
disabled (@code{@value{RPREFIX}NO_TIMESLICE}), then the task will be
|
188 |
|
|
allowed to execute until a task of higher priority is made ready. If
|
189 |
|
|
@code{@value{RPREFIX}NO_PREEMPT} is selected, then the timeslicing
|
190 |
|
|
component is ignored by the scheduler.
|
191 |
|
|
|
192 |
|
|
The asynchronous signal processing component is used to determine when
|
193 |
|
|
received signals are to be processed by the task.
|
194 |
|
|
If signal processing is enabled (@code{@value{RPREFIX}ASR}), then signals
|
195 |
|
|
sent to the task will be processed the next time the task executes. If
|
196 |
|
|
signal processing is disabled (@code{@value{RPREFIX}NO_ASR}), then all
|
197 |
|
|
signals received by the task will remain posted until signal processing is
|
198 |
|
|
enabled. This component affects only tasks which have established a
|
199 |
|
|
routine to process asynchronous signals.
|
200 |
|
|
|
201 |
|
|
@cindex interrupt level, task
|
202 |
|
|
|
203 |
|
|
The interrupt level component is used to determine which
|
204 |
|
|
interrupts will be enabled when the task is executing.
|
205 |
|
|
@code{@value{RPREFIX}INTERRUPT_LEVEL(n)}
|
206 |
|
|
specifies that the task will execute at interrupt level n.
|
207 |
|
|
|
208 |
|
|
@itemize @bullet
|
209 |
|
|
@item @code{@value{RPREFIX}PREEMPT} - enable preemption (default)
|
210 |
|
|
@item @code{@value{RPREFIX}NO_PREEMPT} - disable preemption
|
211 |
|
|
@item @code{@value{RPREFIX}NO_TIMESLICE} - disable timeslicing (default)
|
212 |
|
|
@item @code{@value{RPREFIX}TIMESLICE} - enable timeslicing
|
213 |
|
|
@item @code{@value{RPREFIX}ASR} - enable ASR processing (default)
|
214 |
|
|
@item @code{@value{RPREFIX}NO_ASR} - disable ASR processing
|
215 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} - enable all interrupts (default)
|
216 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} - execute at interrupt level n
|
217 |
|
|
@end itemize
|
218 |
|
|
|
219 |
|
|
The set of default modes may be selected by specifying the
|
220 |
|
|
@code{@value{RPREFIX}DEFAULT_MODES} constant.
|
221 |
|
|
|
222 |
|
|
@subsection Accessing Task Arguments
|
223 |
|
|
|
224 |
|
|
@cindex task arguments
|
225 |
|
|
@cindex task prototype
|
226 |
|
|
|
227 |
|
|
All RTEMS tasks are invoked with a single argument which is
|
228 |
|
|
specified when they are started or restarted. The argument is
|
229 |
|
|
commonly used to communicate startup information to the task.
|
230 |
|
|
The simplest manner in which to define a task which accesses it
|
231 |
|
|
argument is:
|
232 |
|
|
|
233 |
|
|
@ifset is-C
|
234 |
|
|
@findex rtems_task
|
235 |
|
|
|
236 |
|
|
@example
|
237 |
|
|
rtems_task user_task(
|
238 |
|
|
rtems_task_argument argument
|
239 |
|
|
);
|
240 |
|
|
@end example
|
241 |
|
|
@end ifset
|
242 |
|
|
|
243 |
|
|
@ifset is-Ada
|
244 |
|
|
@example
|
245 |
|
|
procedure User_Task (
|
246 |
|
|
Argument : in RTEMS.Task_Argument_Ptr
|
247 |
|
|
);
|
248 |
|
|
@end example
|
249 |
|
|
@end ifset
|
250 |
|
|
|
251 |
|
|
Application tasks requiring more information may view this
|
252 |
|
|
single argument as an index into an array of parameter blocks.
|
253 |
|
|
|
254 |
|
|
@subsection Floating Point Considerations
|
255 |
|
|
|
256 |
|
|
@cindex floating point
|
257 |
|
|
|
258 |
|
|
Creating a task with the @code{@value{RPREFIX}FLOATING_POINT} attribute
|
259 |
|
|
flag results
|
260 |
|
|
in additional memory being allocated for the TCB to store the state of the
|
261 |
|
|
numeric coprocessor during task switches. This additional memory is
|
262 |
|
|
@b{NOT} allocated for @code{@value{RPREFIX}NO_FLOATING_POINT} tasks. Saving
|
263 |
|
|
and restoring the context of a @code{@value{RPREFIX}FLOATING_POINT} task
|
264 |
|
|
takes longer than that of a @code{@value{RPREFIX}NO_FLOATING_POINT} task
|
265 |
|
|
because of the relatively large amount of time required for the numeric
|
266 |
|
|
coprocessor to save or restore its computational state.
|
267 |
|
|
|
268 |
|
|
Since RTEMS was designed specifically for embedded military applications
|
269 |
|
|
which are floating point intensive, the executive is optimized to avoid
|
270 |
|
|
unnecessarily saving and restoring the state of the numeric coprocessor.
|
271 |
|
|
The state of the numeric coprocessor is only saved when a
|
272 |
|
|
@code{@value{RPREFIX}FLOATING_POINT} task is dispatched and that task was
|
273 |
|
|
not the last task to utilize the coprocessor. In a system with only one
|
274 |
|
|
@code{@value{RPREFIX}FLOATING_POINT} task, the state of the numeric
|
275 |
|
|
coprocessor will never be saved or restored.
|
276 |
|
|
|
277 |
|
|
Although the overhead imposed by @code{@value{RPREFIX}FLOATING_POINT} tasks
|
278 |
|
|
is minimal, some applications may wish to completely avoid the overhead
|
279 |
|
|
associated with @code{@value{RPREFIX}FLOATING_POINT} tasks and still
|
280 |
|
|
utilize a numeric coprocessor. By preventing a task from being preempted
|
281 |
|
|
while performing a sequence of floating point operations, a
|
282 |
|
|
@code{@value{RPREFIX}NO_FLOATING_POINT} task can utilize the numeric
|
283 |
|
|
coprocessor without incurring the overhead of a
|
284 |
|
|
@code{@value{RPREFIX}FLOATING_POINT} context switch. This approach also
|
285 |
|
|
avoids the allocation of a floating point context area. However, if this
|
286 |
|
|
approach is taken by the application designer, NO tasks should be created
|
287 |
|
|
as @code{@value{RPREFIX}FLOATING_POINT} tasks. Otherwise, the floating
|
288 |
|
|
point context will not be correctly maintained because RTEMS assumes that
|
289 |
|
|
the state of the numeric coprocessor will not be altered by
|
290 |
|
|
@code{@value{RPREFIX}NO_FLOATING_POINT} tasks.
|
291 |
|
|
|
292 |
|
|
If the supported processor type does not have hardware floating
|
293 |
|
|
capabilities or a standard numeric coprocessor, RTEMS will not provide
|
294 |
|
|
built-in support for hardware floating point on that processor. In this
|
295 |
|
|
case, all tasks are considered @code{@value{RPREFIX}NO_FLOATING_POINT}
|
296 |
|
|
whether created as @code{@value{RPREFIX}FLOATING_POINT} or
|
297 |
|
|
@code{@value{RPREFIX}NO_FLOATING_POINT} tasks. A floating point emulation
|
298 |
|
|
software library must be utilized for floating point operations.
|
299 |
|
|
|
300 |
|
|
On some processors, it is possible to disable the floating point unit
|
301 |
|
|
dynamically. If this capability is supported by the target processor, then
|
302 |
|
|
RTEMS will utilize this capability to enable the floating point unit only
|
303 |
|
|
for tasks which are created with the @code{@value{RPREFIX}FLOATING_POINT}
|
304 |
|
|
attribute. The consequence of a @code{@value{RPREFIX}NO_FLOATING_POINT}
|
305 |
|
|
task attempting to access the floating point unit is CPU dependent but will
|
306 |
|
|
generally result in an exception condition.
|
307 |
|
|
|
308 |
|
|
@subsection Per Task Variables
|
309 |
|
|
|
310 |
|
|
@cindex per task variables
|
311 |
|
|
|
312 |
|
|
Per task variables are used to support global variables whose value
|
313 |
|
|
may be unique to a task. After indicating that a variable should be
|
314 |
|
|
treated as private (i.e. per-task) the task can access and modify the
|
315 |
|
|
variable, but the modifications will not appear to other tasks, and
|
316 |
|
|
other tasks' modifications to that variable will not affect the value
|
317 |
|
|
seen by the task. This is accomplished by saving and restoring the
|
318 |
|
|
variable's value each time a task switch occurs to or from the calling task.
|
319 |
|
|
|
320 |
|
|
The value seen by other tasks, including those which have not added the
|
321 |
|
|
variable to their set and are thus accessing the variable as a common
|
322 |
|
|
location shared among tasks, can not be affected by a task once it has
|
323 |
|
|
added a variable to its local set. Changes made to the variable by
|
324 |
|
|
other tasks will not affect the value seen by a task which has added the
|
325 |
|
|
variable to its private set.
|
326 |
|
|
|
327 |
|
|
This feature can be used when a routine is to be spawned repeatedly as
|
328 |
|
|
several independent tasks. Although each task will have its own stack,
|
329 |
|
|
and thus separate stack variables, they will all share the same static and
|
330 |
|
|
global variables. To make a variable not shareable (i.e. a "global" variable
|
331 |
|
|
that is specific to a single task), the tasks can call
|
332 |
|
|
@code{rtems_task_variable_add} to make a separate copy of the variable
|
333 |
|
|
for each task, but all at the same physical address.
|
334 |
|
|
|
335 |
|
|
Task variables increase the context switch time to and from the
|
336 |
|
|
tasks that own them so it is desirable to minimize the number of
|
337 |
|
|
task variables. One efficient method is to have a single task
|
338 |
|
|
variable that is a pointer to a dynamically allocated structure
|
339 |
|
|
containing the task's private "global" data.
|
340 |
|
|
|
341 |
|
|
A critical point with per-task variables is that each task must separately
|
342 |
|
|
request that the same global variable is per-task private.
|
343 |
|
|
|
344 |
|
|
@subsection Building a Task Attribute Set
|
345 |
|
|
|
346 |
|
|
@cindex task attributes, building
|
347 |
|
|
|
348 |
|
|
In general, an attribute set is built by a bitwise OR of the
|
349 |
|
|
desired components. The set of valid task attribute components
|
350 |
|
|
is listed below:
|
351 |
|
|
|
352 |
|
|
@itemize @bullet
|
353 |
|
|
@item @code{@value{RPREFIX}NO_FLOATING_POINT} - does not use coprocessor (default)
|
354 |
|
|
@item @code{@value{RPREFIX}FLOATING_POINT} - uses numeric coprocessor
|
355 |
|
|
@item @code{@value{RPREFIX}LOCAL} - local task (default)
|
356 |
|
|
@item @code{@value{RPREFIX}GLOBAL} - global task
|
357 |
|
|
@end itemize
|
358 |
|
|
|
359 |
|
|
Attribute values are specifically designed to be mutually
|
360 |
|
|
exclusive, therefore bitwise OR and addition operations are
|
361 |
|
|
equivalent as long as each attribute appears exactly once in the
|
362 |
|
|
component list. A component listed as a default is not required
|
363 |
|
|
to appear in the component list, although it is a good
|
364 |
|
|
programming practice to specify default components. If all
|
365 |
|
|
defaults are desired, then @code{@value{RPREFIX}DEFAULT_ATTRIBUTES} should be used.
|
366 |
|
|
|
367 |
|
|
This example demonstrates the attribute_set parameter needed to
|
368 |
|
|
create a local task which utilizes the numeric coprocessor. The
|
369 |
|
|
attribute_set parameter could be @code{@value{RPREFIX}FLOATING_POINT} or
|
370 |
|
|
@code{@value{RPREFIX}LOCAL @value{OR} @value{RPREFIX}FLOATING_POINT}.
|
371 |
|
|
The attribute_set parameter can be set to
|
372 |
|
|
@code{@value{RPREFIX}FLOATING_POINT} because @code{@value{RPREFIX}LOCAL} is the default for all created
|
373 |
|
|
tasks. If the task were global and used the numeric
|
374 |
|
|
coprocessor, then the attribute_set parameter would be
|
375 |
|
|
@code{@value{RPREFIX}GLOBAL @value{OR} @value{RPREFIX}FLOATING_POINT}.
|
376 |
|
|
|
377 |
|
|
@subsection Building a Mode and Mask
|
378 |
|
|
|
379 |
|
|
@cindex task mode, building
|
380 |
|
|
|
381 |
|
|
In general, a mode and its corresponding mask is built by a
|
382 |
|
|
bitwise OR of the desired components. The set of valid mode
|
383 |
|
|
constants and each mode's corresponding mask constant is
|
384 |
|
|
listed below:
|
385 |
|
|
|
386 |
|
|
@ifset use-ascii
|
387 |
|
|
@itemize @bullet
|
388 |
|
|
@item @code{@value{RPREFIX}PREEMPT} is masked by
|
389 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
|
390 |
|
|
|
391 |
|
|
@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
|
392 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
|
393 |
|
|
|
394 |
|
|
@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
|
395 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
|
396 |
|
|
|
397 |
|
|
@item @code{@value{RPREFIX}TIMESLICE} is masked by
|
398 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
|
399 |
|
|
|
400 |
|
|
@item @code{@value{RPREFIX}ASR} is masked by
|
401 |
|
|
@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
|
402 |
|
|
|
403 |
|
|
@item @code{@value{RPREFIX}NO_ASR} is masked by
|
404 |
|
|
@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
|
405 |
|
|
|
406 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
|
407 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
|
408 |
|
|
|
409 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
|
410 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
|
411 |
|
|
@end itemize
|
412 |
|
|
@end ifset
|
413 |
|
|
|
414 |
|
|
@ifset use-tex
|
415 |
|
|
@sp 1
|
416 |
|
|
@c this is temporary
|
417 |
|
|
@itemize @bullet
|
418 |
|
|
@item @code{@value{RPREFIX}PREEMPT} is masked by
|
419 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
|
420 |
|
|
|
421 |
|
|
@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
|
422 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
|
423 |
|
|
|
424 |
|
|
@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
|
425 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
|
426 |
|
|
|
427 |
|
|
@item @code{@value{RPREFIX}TIMESLICE} is masked by
|
428 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
|
429 |
|
|
|
430 |
|
|
@item @code{@value{RPREFIX}ASR} is masked by
|
431 |
|
|
@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
|
432 |
|
|
|
433 |
|
|
@item @code{@value{RPREFIX}NO_ASR} is masked by
|
434 |
|
|
@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
|
435 |
|
|
|
436 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
|
437 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
|
438 |
|
|
|
439 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
|
440 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
|
441 |
|
|
|
442 |
|
|
@end itemize
|
443 |
|
|
|
444 |
|
|
@tex
|
445 |
|
|
@end tex
|
446 |
|
|
@end ifset
|
447 |
|
|
|
448 |
|
|
@ifset use-html
|
449 |
|
|
@html
|
450 |
|
|
|
451 |
|
|
452 |
|
|
Mode Constant |
453 |
|
|
Mask Constant |
|
454 |
|
|
Description |
|
|
455 |
|
|
@value{RPREFIX}PREEMPT |
456 |
|
|
@value{RPREFIX}PREEMPT_MASK |
|
457 |
|
|
enables preemption |
|
|
458 |
|
|
@value{RPREFIX}NO_PREEMPT |
459 |
|
|
@value{RPREFIX}PREEMPT_MASK |
|
460 |
|
|
disables preemption |
|
|
461 |
|
|
@value{RPREFIX}NO_TIMESLICE |
462 |
|
|
@value{RPREFIX}TIMESLICE_MASK |
|
463 |
|
|
disables timeslicing |
|
|
464 |
|
|
@value{RPREFIX}TIMESLICE |
465 |
|
|
@value{RPREFIX}TIMESLICE_MASK |
|
466 |
|
|
enables timeslicing |
|
|
467 |
|
|
@value{RPREFIX}ASR |
468 |
|
|
@value{RPREFIX}ASR_MASK |
|
469 |
|
|
enables ASR processing |
|
|
470 |
|
|
@value{RPREFIX}NO_ASR |
471 |
|
|
@value{RPREFIX}ASR_MASK |
|
472 |
|
|
disables ASR processing |
|
|
473 |
|
|
@value{RPREFIX}INTERRUPT_LEVEL(0) |
474 |
|
|
@value{RPREFIX}INTERRUPT_MASK |
|
475 |
|
|
enables all interrupts |
|
|
476 |
|
|
@value{RPREFIX}INTERRUPT_LEVEL(n) |
477 |
|
|
@value{RPREFIX}INTERRUPT_MASK |
|
478 |
|
|
sets interrupts level n |
|
|
479 |
|
|
|
|
480 |
|
|
|
481 |
|
|
@end html
|
482 |
|
|
@end ifset
|
483 |
|
|
|
484 |
|
|
Mode values are specifically designed to be mutually exclusive, therefore
|
485 |
|
|
bitwise OR and addition operations are equivalent as long as each mode
|
486 |
|
|
appears exactly once in the component list. A mode component listed as a
|
487 |
|
|
default is not required to appear in the mode component list, although it
|
488 |
|
|
is a good programming practice to specify default components. If all
|
489 |
|
|
defaults are desired, the mode @code{@value{RPREFIX}DEFAULT_MODES} and the
|
490 |
|
|
mask @code{@value{RPREFIX}ALL_MODE_MASKS} should be used.
|
491 |
|
|
|
492 |
|
|
The following example demonstrates the mode and mask parameters used with
|
493 |
|
|
the @code{@value{DIRPREFIX}task_mode}
|
494 |
|
|
directive to place a task at interrupt level 3 and make it
|
495 |
|
|
non-preemptible. The mode should be set to
|
496 |
|
|
@code{@value{RPREFIX}INTERRUPT_LEVEL(3) @value{OR}
|
497 |
|
|
@value{RPREFIX}NO_PREEMPT} to indicate the desired preemption mode and
|
498 |
|
|
interrupt level, while the mask parameter should be set to
|
499 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK @value{OR}
|
500 |
|
|
@value{RPREFIX}NO_PREEMPT_MASK} to indicate that the calling task's
|
501 |
|
|
interrupt level and preemption mode are being altered.
|
502 |
|
|
|
503 |
|
|
@section Operations
|
504 |
|
|
|
505 |
|
|
@subsection Creating Tasks
|
506 |
|
|
|
507 |
|
|
The @code{@value{DIRPREFIX}task_create}
|
508 |
|
|
directive creates a task by allocating a task
|
509 |
|
|
control block, assigning the task a user-specified name,
|
510 |
|
|
allocating it a stack and floating point context area, setting a
|
511 |
|
|
user-specified initial priority, setting a user-specified
|
512 |
|
|
initial mode, and assigning it a task ID. Newly created tasks
|
513 |
|
|
are initially placed in the dormant state. All RTEMS tasks
|
514 |
|
|
execute in the most privileged mode of the processor.
|
515 |
|
|
|
516 |
|
|
@subsection Obtaining Task IDs
|
517 |
|
|
|
518 |
|
|
When a task is created, RTEMS generates a unique task ID and
|
519 |
|
|
assigns it to the created task until it is deleted. The task ID
|
520 |
|
|
may be obtained by either of two methods. First, as the result
|
521 |
|
|
of an invocation of the @code{@value{DIRPREFIX}task_create}
|
522 |
|
|
directive, the task ID is
|
523 |
|
|
stored in a user provided location. Second, the task ID may be
|
524 |
|
|
obtained later using the @code{@value{DIRPREFIX}task_ident}
|
525 |
|
|
directive. The task ID is
|
526 |
|
|
used by other directives to manipulate this task.
|
527 |
|
|
|
528 |
|
|
@subsection Starting and Restarting Tasks
|
529 |
|
|
|
530 |
|
|
The @code{@value{DIRPREFIX}task_start}
|
531 |
|
|
directive is used to place a dormant task in the
|
532 |
|
|
ready state. This enables the task to compete, based on its
|
533 |
|
|
current priority, for the processor and other system resources.
|
534 |
|
|
Any actions, such as suspension or change of priority, performed
|
535 |
|
|
on a task prior to starting it are nullified when the task is
|
536 |
|
|
started.
|
537 |
|
|
|
538 |
|
|
With the @code{@value{DIRPREFIX}task_start}
|
539 |
|
|
directive the user specifies the task's
|
540 |
|
|
starting address and argument. The argument is used to
|
541 |
|
|
communicate some startup information to the task. As part of
|
542 |
|
|
this directive, RTEMS initializes the task's stack based upon
|
543 |
|
|
the task's initial execution mode and start address. The
|
544 |
|
|
starting argument is passed to the task in accordance with the
|
545 |
|
|
target processor's calling convention.
|
546 |
|
|
|
547 |
|
|
The @code{@value{DIRPREFIX}task_restart}
|
548 |
|
|
directive restarts a task at its initial
|
549 |
|
|
starting address with its original priority and execution mode,
|
550 |
|
|
but with a possibly different argument. The new argument may be
|
551 |
|
|
used to distinguish between the original invocation of the task
|
552 |
|
|
and subsequent invocations. The task's stack and control block
|
553 |
|
|
are modified to reflect their original creation values.
|
554 |
|
|
Although references to resources that have been requested are
|
555 |
|
|
cleared, resources allocated by the task are NOT automatically
|
556 |
|
|
returned to RTEMS. A task cannot be restarted unless it has
|
557 |
|
|
previously been started (i.e. dormant tasks cannot be
|
558 |
|
|
restarted). All restarted tasks are placed in the ready state.
|
559 |
|
|
|
560 |
|
|
@subsection Suspending and Resuming Tasks
|
561 |
|
|
|
562 |
|
|
The @code{@value{DIRPREFIX}task_suspend}
|
563 |
|
|
directive is used to place either the caller or
|
564 |
|
|
another task into a suspended state. The task remains suspended
|
565 |
|
|
until a @code{@value{DIRPREFIX}task_resume}
|
566 |
|
|
directive is issued. This implies that a
|
567 |
|
|
task may be suspended as well as blocked waiting either to
|
568 |
|
|
acquire a resource or for the expiration of a timer.
|
569 |
|
|
|
570 |
|
|
The @code{@value{DIRPREFIX}task_resume}
|
571 |
|
|
directive is used to remove another task from
|
572 |
|
|
the suspended state. If the task is not also blocked, resuming
|
573 |
|
|
it will place it in the ready state, allowing it to once again
|
574 |
|
|
compete for the processor and resources. If the task was
|
575 |
|
|
blocked as well as suspended, this directive clears the
|
576 |
|
|
suspension and leaves the task in the blocked state.
|
577 |
|
|
|
578 |
|
|
Suspending a task which is already suspended or resuming a
|
579 |
|
|
task which is not suspended is considered an error.
|
580 |
|
|
The @code{@value{DIRPREFIX}task_is_suspended} can be used to
|
581 |
|
|
determine if a task is currently suspended.
|
582 |
|
|
|
583 |
|
|
@subsection Delaying the Currently Executing Task
|
584 |
|
|
|
585 |
|
|
The @code{@value{DIRPREFIX}task_wake_after} directive creates a sleep timer
|
586 |
|
|
which allows a task to go to sleep for a specified interval. The task is
|
587 |
|
|
blocked until the delay interval has elapsed, at which time the task is
|
588 |
|
|
unblocked. A task calling the @code{@value{DIRPREFIX}task_wake_after}
|
589 |
|
|
directive with a delay
|
590 |
|
|
interval of @code{@value{RPREFIX}YIELD_PROCESSOR} ticks will yield the
|
591 |
|
|
processor to any other ready task of equal or greater priority and remain
|
592 |
|
|
ready to execute.
|
593 |
|
|
|
594 |
|
|
The @code{@value{DIRPREFIX}task_wake_when}
|
595 |
|
|
directive creates a sleep timer which allows
|
596 |
|
|
a task to go to sleep until a specified date and time. The
|
597 |
|
|
calling task is blocked until the specified date and time has
|
598 |
|
|
occurred, at which time the task is unblocked.
|
599 |
|
|
|
600 |
|
|
@subsection Changing Task Priority
|
601 |
|
|
|
602 |
|
|
The @code{@value{DIRPREFIX}task_set_priority}
|
603 |
|
|
directive is used to obtain or change the
|
604 |
|
|
current priority of either the calling task or another task. If
|
605 |
|
|
the new priority requested is
|
606 |
|
|
@code{@value{RPREFIX}CURRENT_PRIORITY} or the task's
|
607 |
|
|
actual priority, then the current priority will be returned and
|
608 |
|
|
the task's priority will remain unchanged. If the task's
|
609 |
|
|
priority is altered, then the task will be scheduled according
|
610 |
|
|
to its new priority.
|
611 |
|
|
|
612 |
|
|
The @code{@value{DIRPREFIX}task_restart}
|
613 |
|
|
directive resets the priority of a task to its
|
614 |
|
|
original value.
|
615 |
|
|
|
616 |
|
|
@subsection Changing Task Mode
|
617 |
|
|
|
618 |
|
|
The @code{@value{DIRPREFIX}task_mode}
|
619 |
|
|
directive is used to obtain or change the current
|
620 |
|
|
execution mode of the calling task. A task's execution mode is
|
621 |
|
|
used to enable preemption, timeslicing, ASR processing, and to
|
622 |
|
|
set the task's interrupt level.
|
623 |
|
|
|
624 |
|
|
The @code{@value{DIRPREFIX}task_restart}
|
625 |
|
|
directive resets the mode of a task to its
|
626 |
|
|
original value.
|
627 |
|
|
|
628 |
|
|
@subsection Notepad Locations
|
629 |
|
|
|
630 |
|
|
RTEMS provides sixteen notepad locations for each task. Each
|
631 |
|
|
notepad location may contain a note consisting of four bytes of
|
632 |
|
|
information. RTEMS provides two directives,
|
633 |
|
|
@code{@value{DIRPREFIX}task_set_note} and
|
634 |
|
|
@code{@value{DIRPREFIX}task_get_note}, that enable a user
|
635 |
|
|
to access and change the
|
636 |
|
|
notepad locations. The @code{@value{DIRPREFIX}task_set_note}
|
637 |
|
|
directive enables the user
|
638 |
|
|
to set a task's notepad entry to a specified note. The
|
639 |
|
|
@code{@value{DIRPREFIX}task_get_note}
|
640 |
|
|
directive allows the user to obtain the note
|
641 |
|
|
contained in any one of the sixteen notepads of a specified task.
|
642 |
|
|
|
643 |
|
|
@subsection Task Deletion
|
644 |
|
|
|
645 |
|
|
RTEMS provides the @code{@value{DIRPREFIX}task_delete}
|
646 |
|
|
directive to allow a task to
|
647 |
|
|
delete itself or any other task. This directive removes all
|
648 |
|
|
RTEMS references to the task, frees the task's control block,
|
649 |
|
|
removes it from resource wait queues, and deallocates its stack
|
650 |
|
|
as well as the optional floating point context. The task's name
|
651 |
|
|
and ID become inactive at this time, and any subsequent
|
652 |
|
|
references to either of them is invalid. In fact, RTEMS may
|
653 |
|
|
reuse the task ID for another task which is created later in the
|
654 |
|
|
application.
|
655 |
|
|
|
656 |
|
|
Unexpired delay timers (i.e. those used by
|
657 |
|
|
@code{@value{DIRPREFIX}task_wake_after} and
|
658 |
|
|
@code{@value{DIRPREFIX}task_wake_when}) and
|
659 |
|
|
timeout timers associated with the task are
|
660 |
|
|
automatically deleted, however, other resources dynamically
|
661 |
|
|
allocated by the task are NOT automatically returned to RTEMS.
|
662 |
|
|
Therefore, before a task is deleted, all of its dynamically
|
663 |
|
|
allocated resources should be deallocated by the user. This may
|
664 |
|
|
be accomplished by instructing the task to delete itself rather
|
665 |
|
|
than directly deleting the task. Other tasks may instruct a
|
666 |
|
|
task to delete itself by sending a "delete self" message, event,
|
667 |
|
|
or signal, or by restarting the task with special arguments
|
668 |
|
|
which instruct the task to delete itself.
|
669 |
|
|
|
670 |
|
|
@section Directives
|
671 |
|
|
|
672 |
|
|
This section details the task manager's directives. A
|
673 |
|
|
subsection is dedicated to each of this manager's directives and
|
674 |
|
|
describes the calling sequence, related constants, usage, and
|
675 |
|
|
status codes.
|
676 |
|
|
|
677 |
|
|
@page
|
678 |
|
|
|
679 |
|
|
@subsection TASK_CREATE - Create a task
|
680 |
|
|
|
681 |
|
|
@cindex create a task
|
682 |
|
|
|
683 |
|
|
@subheading CALLING SEQUENCE:
|
684 |
|
|
|
685 |
|
|
@ifset is-C
|
686 |
|
|
@findex rtems_task_create
|
687 |
|
|
@example
|
688 |
|
|
rtems_status_code rtems_task_create(
|
689 |
|
|
rtems_name name,
|
690 |
|
|
rtems_task_priority initial_priority,
|
691 |
|
|
rtems_unsigned32 stack_size,
|
692 |
|
|
rtems_mode initial_modes,
|
693 |
|
|
rtems_attribute attribute_set,
|
694 |
|
|
rtems_id *id
|
695 |
|
|
);
|
696 |
|
|
@end example
|
697 |
|
|
@end ifset
|
698 |
|
|
|
699 |
|
|
@ifset is-Ada
|
700 |
|
|
@example
|
701 |
|
|
procedure Task_Create (
|
702 |
|
|
Name : in RTEMS.Name;
|
703 |
|
|
Initial_Priority : in RTEMS.Task_Priority;
|
704 |
|
|
Stack_Size : in RTEMS.Unsigned32;
|
705 |
|
|
Initial_Modes : in RTEMS.Mode;
|
706 |
|
|
Attribute_Set : in RTEMS.Attribute;
|
707 |
|
|
ID : out RTEMS.ID;
|
708 |
|
|
Result : out RTEMS.Status_Codes
|
709 |
|
|
);
|
710 |
|
|
@end example
|
711 |
|
|
@end ifset
|
712 |
|
|
|
713 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
714 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task created successfully@*
|
715 |
|
|
@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
|
716 |
|
|
@code{@value{RPREFIX}INVALID_SIZE} - stack too small@*
|
717 |
|
|
@code{@value{RPREFIX}INVALID_PRIORITY} - invalid task priority@*
|
718 |
|
|
@code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured@*
|
719 |
|
|
@code{@value{RPREFIX}TOO_MANY} - too many tasks created@*
|
720 |
|
|
@code{@value{RPREFIX}UNSATISFIED} - not enough memory for stack/FP context@*
|
721 |
|
|
@code{@value{RPREFIX}TOO_MANY} - too many global objects
|
722 |
|
|
|
723 |
|
|
@subheading DESCRIPTION:
|
724 |
|
|
This directive creates a task which resides on the local node.
|
725 |
|
|
It allocates and initializes a TCB, a stack, and an optional
|
726 |
|
|
floating point context area. The mode parameter contains values
|
727 |
|
|
which sets the task's initial execution mode. The
|
728 |
|
|
@code{@value{RPREFIX}FLOATING_POINT} attribute should be
|
729 |
|
|
specified if the created task
|
730 |
|
|
is to use a numeric coprocessor. For performance reasons, it is
|
731 |
|
|
recommended that tasks not using the numeric coprocessor should
|
732 |
|
|
specify the @code{@value{RPREFIX}NO_FLOATING_POINT} attribute.
|
733 |
|
|
If the @code{@value{RPREFIX}GLOBAL}
|
734 |
|
|
attribute is specified, the task can be accessed from remote
|
735 |
|
|
nodes. The task id, returned in id, is used in other task
|
736 |
|
|
related directives to access the task. When created, a task is
|
737 |
|
|
placed in the dormant state and can only be made ready to
|
738 |
|
|
execute using the directive @code{@value{DIRPREFIX}task_start}.
|
739 |
|
|
|
740 |
|
|
@subheading NOTES:
|
741 |
|
|
This directive will not cause the calling task to be preempted.
|
742 |
|
|
|
743 |
|
|
Valid task priorities range from a high of 1 to a low of 255.
|
744 |
|
|
|
745 |
|
|
The requested stack size should be at least
|
746 |
|
|
@code{@value{RPREFIX}MINIMUM_STACK_SIZE}
|
747 |
|
|
bytes. The value of @code{@value{RPREFIX}MINIMUM_STACK_SIZE}
|
748 |
|
|
is processor dependent.
|
749 |
|
|
Application developers should consider the stack usage of the
|
750 |
|
|
device drivers when calculating the stack size required for
|
751 |
|
|
tasks which utilize the driver.
|
752 |
|
|
|
753 |
|
|
The following task attribute constants are defined by RTEMS:
|
754 |
|
|
|
755 |
|
|
@itemize @bullet
|
756 |
|
|
@item @code{@value{RPREFIX}NO_FLOATING_POINT} - does not use coprocessor (default)
|
757 |
|
|
@item @code{@value{RPREFIX}FLOATING_POINT} - uses numeric coprocessor
|
758 |
|
|
@item @code{@value{RPREFIX}LOCAL} - local task (default)
|
759 |
|
|
@item @code{@value{RPREFIX}GLOBAL} - global task
|
760 |
|
|
@end itemize
|
761 |
|
|
|
762 |
|
|
The following task mode constants are defined by RTEMS:
|
763 |
|
|
|
764 |
|
|
@itemize @bullet
|
765 |
|
|
@item @code{@value{RPREFIX}PREEMPT} - enable preemption (default)
|
766 |
|
|
@item @code{@value{RPREFIX}NO_PREEMPT} - disable preemption
|
767 |
|
|
@item @code{@value{RPREFIX}NO_TIMESLICE} - disable timeslicing (default)
|
768 |
|
|
@item @code{@value{RPREFIX}TIMESLICE} - enable timeslicing
|
769 |
|
|
@item @code{@value{RPREFIX}ASR} - enable ASR processing (default)
|
770 |
|
|
@item @code{@value{RPREFIX}NO_ASR} - disable ASR processing
|
771 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} - enable all interrupts (default)
|
772 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} - execute at interrupt level n
|
773 |
|
|
@end itemize
|
774 |
|
|
|
775 |
|
|
The interrupt level portion of the task execution mode
|
776 |
|
|
supports a maximum of 256 interrupt levels. These levels are
|
777 |
|
|
mapped onto the interrupt levels actually supported by the
|
778 |
|
|
target processor in a processor dependent fashion.
|
779 |
|
|
|
780 |
|
|
Tasks should not be made global unless remote tasks must
|
781 |
|
|
interact with them. This avoids the system overhead incurred by
|
782 |
|
|
the creation of a global task. When a global task is created,
|
783 |
|
|
the task's name and id must be transmitted to every node in the
|
784 |
|
|
system for insertion in the local copy of the global object
|
785 |
|
|
table.
|
786 |
|
|
|
787 |
|
|
The total number of global objects, including tasks, is limited
|
788 |
|
|
by the maximum_global_objects field in the Configuration Table.
|
789 |
|
|
|
790 |
|
|
@page
|
791 |
|
|
|
792 |
|
|
@subsection TASK_IDENT - Get ID of a task
|
793 |
|
|
|
794 |
|
|
@cindex get ID of a task
|
795 |
|
|
|
796 |
|
|
@subheading CALLING SEQUENCE:
|
797 |
|
|
|
798 |
|
|
@ifset is-C
|
799 |
|
|
@findex rtems_task_ident
|
800 |
|
|
@example
|
801 |
|
|
rtems_status_code rtems_task_ident(
|
802 |
|
|
rtems_name name,
|
803 |
|
|
rtems_unsigned32 node,
|
804 |
|
|
rtems_id *id
|
805 |
|
|
);
|
806 |
|
|
@end example
|
807 |
|
|
@end ifset
|
808 |
|
|
|
809 |
|
|
@ifset is-Ada
|
810 |
|
|
@example
|
811 |
|
|
procedure Task_Ident (
|
812 |
|
|
Name : in RTEMS.Name;
|
813 |
|
|
Node : in RTEMS.Node;
|
814 |
|
|
ID : out RTEMS.ID;
|
815 |
|
|
Result : out RTEMS.Status_Codes
|
816 |
|
|
);
|
817 |
|
|
@end example
|
818 |
|
|
@end ifset
|
819 |
|
|
|
820 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
821 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task identified successfully@*
|
822 |
|
|
@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
|
823 |
|
|
@code{@value{RPREFIX}INVALID_NODE} - invalid node id
|
824 |
|
|
|
825 |
|
|
@subheading DESCRIPTION:
|
826 |
|
|
This directive obtains the task id associated with the task name
|
827 |
|
|
specified in name. A task may obtain its own id by specifying
|
828 |
|
|
@code{@value{RPREFIX}SELF} or its own task name in name. If the task name is not
|
829 |
|
|
unique, then the task id returned will match one of the tasks
|
830 |
|
|
with that name. However, this task id is not guaranteed to
|
831 |
|
|
correspond to the desired task. The task id, returned in id, is
|
832 |
|
|
used in other task related directives to access the task.
|
833 |
|
|
|
834 |
|
|
@subheading NOTES:
|
835 |
|
|
This directive will not cause the running task to be preempted.
|
836 |
|
|
|
837 |
|
|
If node is @code{@value{RPREFIX}SEARCH_ALL_NODES}, all nodes are searched with the
|
838 |
|
|
local node being searched first. All other nodes are searched
|
839 |
|
|
with the lowest numbered node searched first.
|
840 |
|
|
|
841 |
|
|
If node is a valid node number which does not represent the
|
842 |
|
|
local node, then only the tasks exported by the designated node
|
843 |
|
|
are searched.
|
844 |
|
|
|
845 |
|
|
This directive does not generate activity on remote nodes. It
|
846 |
|
|
accesses only the local copy of the global object table.
|
847 |
|
|
|
848 |
|
|
@page
|
849 |
|
|
|
850 |
|
|
@subsection TASK_START - Start a task
|
851 |
|
|
|
852 |
|
|
@cindex starting a task
|
853 |
|
|
|
854 |
|
|
@subheading CALLING SEQUENCE:
|
855 |
|
|
|
856 |
|
|
@ifset is-C
|
857 |
|
|
@findex rtems_task_start
|
858 |
|
|
@example
|
859 |
|
|
rtems_status_code rtems_task_start(
|
860 |
|
|
rtems_id id,
|
861 |
|
|
rtems_task_entry entry_point,
|
862 |
|
|
rtems_task_argument argument
|
863 |
|
|
);
|
864 |
|
|
@end example
|
865 |
|
|
@end ifset
|
866 |
|
|
|
867 |
|
|
@ifset is-Ada
|
868 |
|
|
@example
|
869 |
|
|
procedure Task_Start (
|
870 |
|
|
ID : in RTEMS.ID;
|
871 |
|
|
Entry_Point : in System.Address;
|
872 |
|
|
Argument : in RTEMS.Task_Argument_PTR;
|
873 |
|
|
Result : out RTEMS.Status_Codes
|
874 |
|
|
);
|
875 |
|
|
@end example
|
876 |
|
|
@end ifset
|
877 |
|
|
|
878 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
879 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - ask started successfully@*
|
880 |
|
|
@code{@value{RPREFIX}INVALID_ADDRESS} - invalid task entry point@*
|
881 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
882 |
|
|
@code{@value{RPREFIX}INCORRECT_STATE} - task not in the dormant state@*
|
883 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot start remote task
|
884 |
|
|
|
885 |
|
|
@subheading DESCRIPTION:
|
886 |
|
|
This directive readies the task, specified by tid, for execution
|
887 |
|
|
based on the priority and execution mode specified when the task
|
888 |
|
|
was created. The starting address of the task is given in
|
889 |
|
|
entry_point. The task's starting argument is contained in
|
890 |
|
|
argument. This argument can be a single value or used as an
|
891 |
|
|
index into an array of parameter blocks.
|
892 |
|
|
|
893 |
|
|
@subheading NOTES:
|
894 |
|
|
The calling task will be preempted if its preemption mode is
|
895 |
|
|
enabled and the task being started has a higher priority.
|
896 |
|
|
|
897 |
|
|
Any actions performed on a dormant task such as suspension or
|
898 |
|
|
change of priority are nullified when the task is initiated via
|
899 |
|
|
the @code{@value{DIRPREFIX}task_start} directive.
|
900 |
|
|
|
901 |
|
|
@page
|
902 |
|
|
|
903 |
|
|
@subsection TASK_RESTART - Restart a task
|
904 |
|
|
|
905 |
|
|
@cindex restarting a task
|
906 |
|
|
|
907 |
|
|
@subheading CALLING SEQUENCE:
|
908 |
|
|
|
909 |
|
|
@ifset is-C
|
910 |
|
|
@findex rtems_task_restart
|
911 |
|
|
@example
|
912 |
|
|
rtems_status_code rtems_task_restart(
|
913 |
|
|
rtems_id id,
|
914 |
|
|
rtems_task_argument argument
|
915 |
|
|
);
|
916 |
|
|
@end example
|
917 |
|
|
@end ifset
|
918 |
|
|
|
919 |
|
|
@ifset is-Ada
|
920 |
|
|
@example
|
921 |
|
|
procedure Task_Restart (
|
922 |
|
|
ID : in RTEMS.ID;
|
923 |
|
|
Argument : in RTEMS.Task_Argument_PTR;
|
924 |
|
|
Result : out RTEMS.Status_Codes
|
925 |
|
|
);
|
926 |
|
|
@end example
|
927 |
|
|
@end ifset
|
928 |
|
|
|
929 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
930 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
|
931 |
|
|
@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
|
932 |
|
|
@code{@value{RPREFIX}INCORRECT_STATE} - task never started@*
|
933 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot restart remote task
|
934 |
|
|
|
935 |
|
|
@subheading DESCRIPTION:
|
936 |
|
|
This directive resets the task specified by id to begin
|
937 |
|
|
execution at its original starting address. The task's priority
|
938 |
|
|
and execution mode are set to the original creation values. If
|
939 |
|
|
the task is currently blocked, RTEMS automatically makes the
|
940 |
|
|
task ready. A task can be restarted from any state, except the
|
941 |
|
|
dormant state.
|
942 |
|
|
|
943 |
|
|
The task's starting argument is contained in argument. This
|
944 |
|
|
argument can be a single value or an index into an array of
|
945 |
|
|
parameter blocks. This new argument may be used to distinguish
|
946 |
|
|
between the initial @code{@value{DIRPREFIX}task_start}
|
947 |
|
|
of the task and any ensuing calls
|
948 |
|
|
to @code{@value{DIRPREFIX}task_restart}
|
949 |
|
|
of the task. This can be beneficial in deleting
|
950 |
|
|
a task. Instead of deleting a task using
|
951 |
|
|
the @code{@value{DIRPREFIX}task_delete}
|
952 |
|
|
directive, a task can delete another task by restarting that
|
953 |
|
|
task, and allowing that task to release resources back to RTEMS
|
954 |
|
|
and then delete itself.
|
955 |
|
|
|
956 |
|
|
@subheading NOTES:
|
957 |
|
|
If id is @code{@value{RPREFIX}SELF}, the calling task will be restarted and will not
|
958 |
|
|
return from this directive.
|
959 |
|
|
|
960 |
|
|
The calling task will be preempted if its preemption mode is
|
961 |
|
|
enabled and the task being restarted has a higher priority.
|
962 |
|
|
|
963 |
|
|
The task must reside on the local node, even if the task was
|
964 |
|
|
created with the @code{@value{RPREFIX}GLOBAL} option.
|
965 |
|
|
|
966 |
|
|
@page
|
967 |
|
|
|
968 |
|
|
@subsection TASK_DELETE - Delete a task
|
969 |
|
|
|
970 |
|
|
@cindex deleting a task
|
971 |
|
|
|
972 |
|
|
@subheading CALLING SEQUENCE:
|
973 |
|
|
|
974 |
|
|
@ifset is-C
|
975 |
|
|
@findex rtems_task_delete
|
976 |
|
|
@example
|
977 |
|
|
rtems_status_code rtems_task_delete(
|
978 |
|
|
rtems_id id
|
979 |
|
|
);
|
980 |
|
|
@end example
|
981 |
|
|
@end ifset
|
982 |
|
|
|
983 |
|
|
@ifset is-Ada
|
984 |
|
|
@example
|
985 |
|
|
procedure Task_Delete (
|
986 |
|
|
ID : in RTEMS.ID;
|
987 |
|
|
Result : out RTEMS.Status_Codes
|
988 |
|
|
);
|
989 |
|
|
@end example
|
990 |
|
|
@end ifset
|
991 |
|
|
|
992 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
993 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
|
994 |
|
|
@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
|
995 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot restart remote task
|
996 |
|
|
|
997 |
|
|
@subheading DESCRIPTION:
|
998 |
|
|
This directive deletes a task, either the calling task or
|
999 |
|
|
another task, as specified by id. RTEMS stops the execution of
|
1000 |
|
|
the task and reclaims the stack memory, any allocated delay or
|
1001 |
|
|
timeout timers, the TCB, and, if the task is @code{@value{RPREFIX}FLOATING_POINT}, its
|
1002 |
|
|
floating point context area. RTEMS does not reclaim the
|
1003 |
|
|
following resources: region segments, partition buffers,
|
1004 |
|
|
semaphores, timers, or rate monotonic periods.
|
1005 |
|
|
|
1006 |
|
|
@subheading NOTES:
|
1007 |
|
|
A task is responsible for releasing its resources back to RTEMS
|
1008 |
|
|
before deletion. To insure proper deallocation of resources, a
|
1009 |
|
|
task should not be deleted unless it is unable to execute or
|
1010 |
|
|
does not hold any RTEMS resources. If a task holds RTEMS
|
1011 |
|
|
resources, the task should be allowed to deallocate its
|
1012 |
|
|
resources before deletion. A task can be directed to release
|
1013 |
|
|
its resources and delete itself by restarting it with a special
|
1014 |
|
|
argument or by sending it a message, an event, or a signal.
|
1015 |
|
|
|
1016 |
|
|
Deletion of the current task (@code{@value{RPREFIX}SELF}) will force RTEMS to select
|
1017 |
|
|
another task to execute.
|
1018 |
|
|
|
1019 |
|
|
When a global task is deleted, the task id must be transmitted
|
1020 |
|
|
to every node in the system for deletion from the local copy of
|
1021 |
|
|
the global object table.
|
1022 |
|
|
|
1023 |
|
|
The task must reside on the local node, even if the task was
|
1024 |
|
|
created with the @code{@value{RPREFIX}GLOBAL} option.
|
1025 |
|
|
|
1026 |
|
|
@page
|
1027 |
|
|
|
1028 |
|
|
@subsection TASK_SUSPEND - Suspend a task
|
1029 |
|
|
|
1030 |
|
|
@cindex suspending a task
|
1031 |
|
|
|
1032 |
|
|
@subheading CALLING SEQUENCE:
|
1033 |
|
|
|
1034 |
|
|
@ifset is-C
|
1035 |
|
|
@findex rtems_task_suspend
|
1036 |
|
|
@example
|
1037 |
|
|
rtems_status_code rtems_task_suspend(
|
1038 |
|
|
rtems_id id
|
1039 |
|
|
);
|
1040 |
|
|
@end example
|
1041 |
|
|
@end ifset
|
1042 |
|
|
|
1043 |
|
|
@ifset is-Ada
|
1044 |
|
|
@example
|
1045 |
|
|
procedure Task_Suspend (
|
1046 |
|
|
ID : in RTEMS.ID;
|
1047 |
|
|
Result : out RTEMS.Status_Codes
|
1048 |
|
|
);
|
1049 |
|
|
@end example
|
1050 |
|
|
@end ifset
|
1051 |
|
|
|
1052 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1053 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
|
1054 |
|
|
@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
|
1055 |
|
|
@code{@value{RPREFIX}ALREADY_SUSPENDED} - task already suspended
|
1056 |
|
|
|
1057 |
|
|
@subheading DESCRIPTION:
|
1058 |
|
|
This directive suspends the task specified by id from further
|
1059 |
|
|
execution by placing it in the suspended state. This state is
|
1060 |
|
|
additive to any other blocked state that the task may already be
|
1061 |
|
|
in. The task will not execute again until another task issues
|
1062 |
|
|
the @code{@value{DIRPREFIX}task_resume}
|
1063 |
|
|
directive for this task and any blocked state
|
1064 |
|
|
has been removed.
|
1065 |
|
|
|
1066 |
|
|
@subheading NOTES:
|
1067 |
|
|
The requesting task can suspend itself by specifying @code{@value{RPREFIX}SELF} as id.
|
1068 |
|
|
In this case, the task will be suspended and a successful
|
1069 |
|
|
return code will be returned when the task is resumed.
|
1070 |
|
|
|
1071 |
|
|
Suspending a global task which does not reside on the local node
|
1072 |
|
|
will generate a request to the remote node to suspend the
|
1073 |
|
|
specified task.
|
1074 |
|
|
|
1075 |
|
|
If the task specified by id is already suspended, then the
|
1076 |
|
|
@code{@value{RPREFIX}ALREADY_SUSPENDED} status code is returned.
|
1077 |
|
|
|
1078 |
|
|
@page
|
1079 |
|
|
|
1080 |
|
|
@subsection TASK_RESUME - Resume a task
|
1081 |
|
|
|
1082 |
|
|
@cindex resuming a task
|
1083 |
|
|
|
1084 |
|
|
@subheading CALLING SEQUENCE:
|
1085 |
|
|
|
1086 |
|
|
@ifset is-C
|
1087 |
|
|
@findex rtems_task_resume
|
1088 |
|
|
@example
|
1089 |
|
|
rtems_status_code rtems_task_resume(
|
1090 |
|
|
rtems_id id
|
1091 |
|
|
);
|
1092 |
|
|
@end example
|
1093 |
|
|
@end ifset
|
1094 |
|
|
|
1095 |
|
|
@ifset is-Ada
|
1096 |
|
|
@example
|
1097 |
|
|
procedure Task_Resume (
|
1098 |
|
|
ID : in RTEMS.ID;
|
1099 |
|
|
Result : out RTEMS.Status_Codes
|
1100 |
|
|
);
|
1101 |
|
|
@end example
|
1102 |
|
|
@end ifset
|
1103 |
|
|
|
1104 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1105 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
|
1106 |
|
|
@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
|
1107 |
|
|
@code{@value{RPREFIX}INCORRECT_STATE} - task not suspended
|
1108 |
|
|
|
1109 |
|
|
@subheading DESCRIPTION:
|
1110 |
|
|
This directive removes the task specified by id from the
|
1111 |
|
|
suspended state. If the task is in the ready state after the
|
1112 |
|
|
suspension is removed, then it will be scheduled to run. If the
|
1113 |
|
|
task is still in a blocked state after the suspension is
|
1114 |
|
|
removed, then it will remain in that blocked state.
|
1115 |
|
|
|
1116 |
|
|
@subheading NOTES:
|
1117 |
|
|
The running task may be preempted if its preemption mode is
|
1118 |
|
|
enabled and the local task being resumed has a higher priority.
|
1119 |
|
|
|
1120 |
|
|
Resuming a global task which does not reside on the local node
|
1121 |
|
|
will generate a request to the remote node to resume the
|
1122 |
|
|
specified task.
|
1123 |
|
|
|
1124 |
|
|
If the task specified by id is not suspended, then the
|
1125 |
|
|
@code{@value{RPREFIX}INCORRECT_STATE} status code is returned.
|
1126 |
|
|
|
1127 |
|
|
@page
|
1128 |
|
|
|
1129 |
|
|
@subsection TASK_IS_SUSPENDED - Determine if a task is Suspended
|
1130 |
|
|
|
1131 |
|
|
@cindex is task suspended
|
1132 |
|
|
|
1133 |
|
|
@subheading CALLING SEQUENCE:
|
1134 |
|
|
|
1135 |
|
|
@ifset is-C
|
1136 |
|
|
@findex rtems_task_is_suspended
|
1137 |
|
|
@example
|
1138 |
|
|
rtems_status_code rtems_task_is_suspended(
|
1139 |
|
|
rtems_id id
|
1140 |
|
|
);
|
1141 |
|
|
@end example
|
1142 |
|
|
@end ifset
|
1143 |
|
|
|
1144 |
|
|
@ifset is-Ada
|
1145 |
|
|
@example
|
1146 |
|
|
procedure Task_Is_Suspended (
|
1147 |
|
|
ID : in RTEMS.ID;
|
1148 |
|
|
Result : out RTEMS.Status_Codes
|
1149 |
|
|
);
|
1150 |
|
|
@end example
|
1151 |
|
|
@end ifset
|
1152 |
|
|
|
1153 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1154 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task is not suspended@*
|
1155 |
|
|
@code{@value{RPREFIX}ALREADY_SUSPENDED} - task is not suspended@*
|
1156 |
|
|
@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
|
1157 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks
|
1158 |
|
|
|
1159 |
|
|
@subheading DESCRIPTION:
|
1160 |
|
|
|
1161 |
|
|
This directive returns a status code indicating whether or
|
1162 |
|
|
not the specified task is currently suspended.
|
1163 |
|
|
|
1164 |
|
|
@subheading NOTES:
|
1165 |
|
|
|
1166 |
|
|
This operation is not currently supported on remote tasks.
|
1167 |
|
|
|
1168 |
|
|
@page
|
1169 |
|
|
|
1170 |
|
|
@subsection TASK_SET_PRIORITY - Set task priority
|
1171 |
|
|
|
1172 |
|
|
@findex rtems_task_set_priority
|
1173 |
|
|
@cindex current task priority
|
1174 |
|
|
@cindex set task priority
|
1175 |
|
|
@cindex get task priority
|
1176 |
|
|
@cindex obtain task priority
|
1177 |
|
|
|
1178 |
|
|
@subheading CALLING SEQUENCE:
|
1179 |
|
|
|
1180 |
|
|
@ifset is-C
|
1181 |
|
|
@example
|
1182 |
|
|
rtems_status_code rtems_task_set_priority(
|
1183 |
|
|
rtems_id id,
|
1184 |
|
|
rtems_task_priority new_priority,
|
1185 |
|
|
rtems_task_priority *old_priority
|
1186 |
|
|
);
|
1187 |
|
|
@end example
|
1188 |
|
|
@end ifset
|
1189 |
|
|
|
1190 |
|
|
@ifset is-Ada
|
1191 |
|
|
@example
|
1192 |
|
|
procedure Task_Set_Priority (
|
1193 |
|
|
ID : in RTEMS.ID;
|
1194 |
|
|
New_Priority : in RTEMS.Task_Priority;
|
1195 |
|
|
Old_Priority : out RTEMS.Task_Priority;
|
1196 |
|
|
Result : out RTEMS.Status_Codes
|
1197 |
|
|
);
|
1198 |
|
|
@end example
|
1199 |
|
|
@end ifset
|
1200 |
|
|
|
1201 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1202 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task priority set successfully@*
|
1203 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
1204 |
|
|
@code{@value{RPREFIX}INVALID_ADDRESS} - invalid return argument pointer@*
|
1205 |
|
|
@code{@value{RPREFIX}INVALID_PRIORITY} - invalid task priority
|
1206 |
|
|
|
1207 |
|
|
@subheading DESCRIPTION:
|
1208 |
|
|
This directive manipulates the priority of the task specified by
|
1209 |
|
|
id. An id of @code{@value{RPREFIX}SELF} is used to indicate
|
1210 |
|
|
the calling task. When new_priority is not equal to
|
1211 |
|
|
@code{@value{RPREFIX}CURRENT_PRIORITY}, the specified
|
1212 |
|
|
task's previous priority is returned in old_priority. When
|
1213 |
|
|
new_priority is @code{@value{RPREFIX}CURRENT_PRIORITY},
|
1214 |
|
|
the specified task's current
|
1215 |
|
|
priority is returned in old_priority. Valid priorities range
|
1216 |
|
|
from a high of 1 to a low of 255.
|
1217 |
|
|
|
1218 |
|
|
@subheading NOTES:
|
1219 |
|
|
The calling task may be preempted if its preemption mode is
|
1220 |
|
|
enabled and it lowers its own priority or raises another task's
|
1221 |
|
|
priority.
|
1222 |
|
|
|
1223 |
|
|
Setting the priority of a global task which does not reside on
|
1224 |
|
|
the local node will generate a request to the remote node to
|
1225 |
|
|
change the priority of the specified task.
|
1226 |
|
|
|
1227 |
|
|
If the task specified by id is currently holding any binary
|
1228 |
|
|
semaphores which use the priority inheritance algorithm, then
|
1229 |
|
|
the task's priority cannot be lowered immediately. If the
|
1230 |
|
|
task's priority were lowered immediately, then priority
|
1231 |
|
|
inversion results. The requested lowering of the task's
|
1232 |
|
|
priority will occur when the task has released all priority
|
1233 |
|
|
inheritance binary semaphores. The task's priority can be
|
1234 |
|
|
increased regardless of the task's use of priority inheritance
|
1235 |
|
|
binary semaphores.
|
1236 |
|
|
|
1237 |
|
|
@page
|
1238 |
|
|
|
1239 |
|
|
@subsection TASK_MODE - Change the current task mode
|
1240 |
|
|
|
1241 |
|
|
@cindex current task mode
|
1242 |
|
|
@cindex set task mode
|
1243 |
|
|
@cindex get task mode
|
1244 |
|
|
@cindex set task preemption mode
|
1245 |
|
|
@cindex get task preemption mode
|
1246 |
|
|
@cindex obtain task mode
|
1247 |
|
|
|
1248 |
|
|
@subheading CALLING SEQUENCE:
|
1249 |
|
|
|
1250 |
|
|
@ifset is-C
|
1251 |
|
|
@findex rtems_task_mode
|
1252 |
|
|
@example
|
1253 |
|
|
rtems_status_code rtems_task_mode(
|
1254 |
|
|
rtems_mode mode_set,
|
1255 |
|
|
rtems_mode mask,
|
1256 |
|
|
rtems_mode *previous_mode_set
|
1257 |
|
|
);
|
1258 |
|
|
@end example
|
1259 |
|
|
@end ifset
|
1260 |
|
|
|
1261 |
|
|
@ifset is-Ada
|
1262 |
|
|
@example
|
1263 |
|
|
procedure Task_Delete (
|
1264 |
|
|
Mode_Set : in RTEMS.Mode;
|
1265 |
|
|
Mask : in RTEMS.Mode;
|
1266 |
|
|
Previous_Mode_Set : in RTEMS.Mode;
|
1267 |
|
|
Result : out RTEMS.Status_Codes
|
1268 |
|
|
);
|
1269 |
|
|
@end example
|
1270 |
|
|
@end ifset
|
1271 |
|
|
|
1272 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1273 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task mode set successfully
|
1274 |
|
|
|
1275 |
|
|
@subheading DESCRIPTION:
|
1276 |
|
|
This directive manipulates the execution mode of the calling
|
1277 |
|
|
task. A task's execution mode enables and disables preemption,
|
1278 |
|
|
timeslicing, asynchronous signal processing, as well as
|
1279 |
|
|
specifying the current interrupt level. To modify an execution
|
1280 |
|
|
mode, the mode class(es) to be changed must be specified in the
|
1281 |
|
|
mask parameter and the desired mode(s) must be specified in the
|
1282 |
|
|
mode parameter.
|
1283 |
|
|
|
1284 |
|
|
@subheading NOTES:
|
1285 |
|
|
The calling task will be preempted if it enables preemption and
|
1286 |
|
|
a higher priority task is ready to run.
|
1287 |
|
|
|
1288 |
|
|
Enabling timeslicing has no effect if preemption is disabled. For
|
1289 |
|
|
a task to be timesliced, that task must have both preemption and
|
1290 |
|
|
timeslicing enabled.
|
1291 |
|
|
|
1292 |
|
|
A task can obtain its current execution mode, without modifying
|
1293 |
|
|
it, by calling this directive with a mask value of
|
1294 |
|
|
@code{@value{RPREFIX}CURRENT_MODE}.
|
1295 |
|
|
|
1296 |
|
|
To temporarily disable the processing of a valid ASR, a task
|
1297 |
|
|
should call this directive with the @code{@value{RPREFIX}NO_ASR}
|
1298 |
|
|
indicator specified in mode.
|
1299 |
|
|
|
1300 |
|
|
The set of task mode constants and each mode's corresponding
|
1301 |
|
|
mask constant is provided in the following table:
|
1302 |
|
|
|
1303 |
|
|
@ifset use-ascii
|
1304 |
|
|
@itemize @bullet
|
1305 |
|
|
@item @code{@value{RPREFIX}PREEMPT} is masked by
|
1306 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
|
1307 |
|
|
|
1308 |
|
|
@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
|
1309 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
|
1310 |
|
|
|
1311 |
|
|
@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
|
1312 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
|
1313 |
|
|
|
1314 |
|
|
@item @code{@value{RPREFIX}TIMESLICE} is masked by
|
1315 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
|
1316 |
|
|
|
1317 |
|
|
@item @code{@value{RPREFIX}ASR} is masked by
|
1318 |
|
|
@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
|
1319 |
|
|
|
1320 |
|
|
@item @code{@value{RPREFIX}NO_ASR} is masked by
|
1321 |
|
|
@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
|
1322 |
|
|
|
1323 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
|
1324 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
|
1325 |
|
|
|
1326 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
|
1327 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
|
1328 |
|
|
|
1329 |
|
|
@end itemize
|
1330 |
|
|
@end ifset
|
1331 |
|
|
|
1332 |
|
|
@ifset use-tex
|
1333 |
|
|
@sp 1
|
1334 |
|
|
@c this is temporary
|
1335 |
|
|
@itemize @bullet
|
1336 |
|
|
@item @code{@value{RPREFIX}PREEMPT} is masked by
|
1337 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
|
1338 |
|
|
|
1339 |
|
|
@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
|
1340 |
|
|
@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
|
1341 |
|
|
|
1342 |
|
|
@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
|
1343 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
|
1344 |
|
|
|
1345 |
|
|
@item @code{@value{RPREFIX}TIMESLICE} is masked by
|
1346 |
|
|
@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
|
1347 |
|
|
|
1348 |
|
|
@item @code{@value{RPREFIX}ASR} is masked by
|
1349 |
|
|
@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
|
1350 |
|
|
|
1351 |
|
|
@item @code{@value{RPREFIX}NO_ASR} is masked by
|
1352 |
|
|
@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
|
1353 |
|
|
|
1354 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
|
1355 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
|
1356 |
|
|
|
1357 |
|
|
@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
|
1358 |
|
|
@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
|
1359 |
|
|
|
1360 |
|
|
@end itemize
|
1361 |
|
|
|
1362 |
|
|
@tex
|
1363 |
|
|
@end tex
|
1364 |
|
|
@end ifset
|
1365 |
|
|
|
1366 |
|
|
@ifset use-html
|
1367 |
|
|
@html
|
1368 |
|
|
|
1369 |
|
|
1370 |
|
|
Mode Constant |
1371 |
|
|
Mask Constant |
|
1372 |
|
|
Description |
|
|
1373 |
|
|
@value{RPREFIX}PREEMPT |
1374 |
|
|
@value{RPREFIX}PREEMPT_MASK |
|
1375 |
|
|
enables preemption |
|
|
1376 |
|
|
@value{RPREFIX}NO_PREEMPT |
1377 |
|
|
@value{RPREFIX}PREEMPT_MASK |
|
1378 |
|
|
disables preemption |
|
|
1379 |
|
|
@value{RPREFIX}NO_TIMESLICE |
1380 |
|
|
@value{RPREFIX}TIMESLICE_MASK |
|
1381 |
|
|
disables timeslicing |
|
|
1382 |
|
|
@value{RPREFIX}TIMESLICE |
1383 |
|
|
@value{RPREFIX}TIMESLICE_MASK |
|
1384 |
|
|
enables timeslicing |
|
|
1385 |
|
|
@value{RPREFIX}ASR |
1386 |
|
|
@value{RPREFIX}ASR_MASK |
|
1387 |
|
|
enables ASR processing |
|
|
1388 |
|
|
@value{RPREFIX}NO_ASR |
1389 |
|
|
@value{RPREFIX}ASR_MASK |
|
1390 |
|
|
disables ASR processing |
|
|
1391 |
|
|
@value{RPREFIX}INTERRUPT_LEVEL(0) |
1392 |
|
|
@value{RPREFIX}INTERRUPT_MASK |
|
1393 |
|
|
enables all interrupts |
|
|
1394 |
|
|
@value{RPREFIX}INTERRUPT_LEVEL(n) |
1395 |
|
|
@value{RPREFIX}INTERRUPT_MASK |
|
1396 |
|
|
sets interrupts level n |
|
|
1397 |
|
|
|
|
1398 |
|
|
|
1399 |
|
|
@end html
|
1400 |
|
|
@end ifset
|
1401 |
|
|
|
1402 |
|
|
@page
|
1403 |
|
|
|
1404 |
|
|
@subsection TASK_GET_NOTE - Get task notepad entry
|
1405 |
|
|
|
1406 |
|
|
@cindex get task notepad entry
|
1407 |
|
|
|
1408 |
|
|
@subheading CALLING SEQUENCE:
|
1409 |
|
|
|
1410 |
|
|
@ifset is-C
|
1411 |
|
|
@findex rtems_task_get_note
|
1412 |
|
|
@example
|
1413 |
|
|
rtems_status_code rtems_task_get_note(
|
1414 |
|
|
rtems_id id,
|
1415 |
|
|
rtems_unsigned32 notepad,
|
1416 |
|
|
rtems_unsigned32 *note
|
1417 |
|
|
);
|
1418 |
|
|
@end example
|
1419 |
|
|
@end ifset
|
1420 |
|
|
|
1421 |
|
|
@ifset is-Ada
|
1422 |
|
|
@example
|
1423 |
|
|
procedure Task_Get_Note (
|
1424 |
|
|
ID : in RTEMS.ID;
|
1425 |
|
|
Notepad : in RTEMS.Notepad_Index;
|
1426 |
|
|
Note : out RTEMS.Unsigned32;
|
1427 |
|
|
Result : out RTEMS.Status_Codes
|
1428 |
|
|
);
|
1429 |
|
|
@end example
|
1430 |
|
|
@end ifset
|
1431 |
|
|
|
1432 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1433 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - note obtained successfully@*
|
1434 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
1435 |
|
|
@code{@value{RPREFIX}INVALID_NUMBER} - invalid notepad location
|
1436 |
|
|
|
1437 |
|
|
@subheading DESCRIPTION:
|
1438 |
|
|
This directive returns the note contained in the notepad
|
1439 |
|
|
location of the task specified by id.
|
1440 |
|
|
|
1441 |
|
|
@subheading NOTES:
|
1442 |
|
|
This directive will not cause the running task to be preempted.
|
1443 |
|
|
|
1444 |
|
|
If id is set to @code{@value{RPREFIX}SELF},
|
1445 |
|
|
the calling task accesses its own notepad.
|
1446 |
|
|
|
1447 |
|
|
@c This version of the paragraph avoids the overfull hbox error.
|
1448 |
|
|
@c The constants NOTEPAD_0 through NOTEPAD_15 can be used to access the
|
1449 |
|
|
@c sixteen notepad locations.
|
1450 |
|
|
|
1451 |
|
|
The sixteen notepad locations can be accessed using the constants
|
1452 |
|
|
@code{@value{RPREFIX}NOTEPAD_0} through @code{@value{RPREFIX}NOTEPAD_15}.
|
1453 |
|
|
|
1454 |
|
|
Getting a note of a global task which does not reside on the
|
1455 |
|
|
local node will generate a request to the remote node to obtain
|
1456 |
|
|
the notepad entry of the specified task.
|
1457 |
|
|
|
1458 |
|
|
@page
|
1459 |
|
|
|
1460 |
|
|
@subsection TASK_SET_NOTE - Set task notepad entry
|
1461 |
|
|
|
1462 |
|
|
@cindex set task notepad entry
|
1463 |
|
|
|
1464 |
|
|
@subheading CALLING SEQUENCE:
|
1465 |
|
|
|
1466 |
|
|
@ifset is-C
|
1467 |
|
|
@findex rtems_task_set_note
|
1468 |
|
|
@example
|
1469 |
|
|
rtems_status_code rtems_task_set_note(
|
1470 |
|
|
rtems_id id,
|
1471 |
|
|
rtems_unsigned32 notepad,
|
1472 |
|
|
rtems_unsigned32 note
|
1473 |
|
|
);
|
1474 |
|
|
@end example
|
1475 |
|
|
@end ifset
|
1476 |
|
|
|
1477 |
|
|
@ifset is-Ada
|
1478 |
|
|
@example
|
1479 |
|
|
procedure Task_Set_Note (
|
1480 |
|
|
ID : in RTEMS.ID;
|
1481 |
|
|
Notepad : in RTEMS.Notepad_Index;
|
1482 |
|
|
Note : in RTEMS.Unsigned32;
|
1483 |
|
|
Result : out RTEMS.Status_Codes
|
1484 |
|
|
);
|
1485 |
|
|
@end example
|
1486 |
|
|
@end ifset
|
1487 |
|
|
|
1488 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1489 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - task's note set successfully@*
|
1490 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
1491 |
|
|
@code{@value{RPREFIX}INVALID_NUMBER} - invalid notepad location
|
1492 |
|
|
|
1493 |
|
|
@subheading DESCRIPTION:
|
1494 |
|
|
This directive sets the notepad entry for the task specified by
|
1495 |
|
|
id to the value note.
|
1496 |
|
|
|
1497 |
|
|
@subheading NOTES:
|
1498 |
|
|
If id is set to @code{@value{RPREFIX}SELF}, the calling
|
1499 |
|
|
task accesses its own notepad locations.
|
1500 |
|
|
|
1501 |
|
|
This directive will not cause the running task to be preempted.
|
1502 |
|
|
|
1503 |
|
|
@c This version of the paragraph avoids the overfull hbox error.
|
1504 |
|
|
@c The constants NOTEPAD_0 through NOTEPAD_15 can be used to access the
|
1505 |
|
|
@c sixteen notepad locations.
|
1506 |
|
|
|
1507 |
|
|
The sixteen notepad locations can be accessed using the constants
|
1508 |
|
|
@code{@value{RPREFIX}NOTEPAD_0} through @code{@value{RPREFIX}NOTEPAD_15}.
|
1509 |
|
|
|
1510 |
|
|
Setting a notepad location of a global task which does not
|
1511 |
|
|
reside on the local node will generate a request to the remote
|
1512 |
|
|
node to set the specified notepad entry.
|
1513 |
|
|
|
1514 |
|
|
@page
|
1515 |
|
|
|
1516 |
|
|
@subsection TASK_WAKE_AFTER - Wake up after interval
|
1517 |
|
|
|
1518 |
|
|
@cindex delay a task for an interval
|
1519 |
|
|
@cindex wake up after an interval
|
1520 |
|
|
|
1521 |
|
|
@subheading CALLING SEQUENCE:
|
1522 |
|
|
|
1523 |
|
|
@ifset is-C
|
1524 |
|
|
@findex rtems_task_wake_after
|
1525 |
|
|
@example
|
1526 |
|
|
rtems_status_code rtems_task_wake_after(
|
1527 |
|
|
rtems_interval ticks
|
1528 |
|
|
);
|
1529 |
|
|
@end example
|
1530 |
|
|
@end ifset
|
1531 |
|
|
|
1532 |
|
|
@ifset is-Ada
|
1533 |
|
|
@example
|
1534 |
|
|
procedure Task_Wake_After (
|
1535 |
|
|
Ticks : in RTEMS.Interval;
|
1536 |
|
|
Result : out RTEMS.Status_Codes
|
1537 |
|
|
);
|
1538 |
|
|
@end example
|
1539 |
|
|
@end ifset
|
1540 |
|
|
|
1541 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1542 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - always successful
|
1543 |
|
|
|
1544 |
|
|
@subheading DESCRIPTION:
|
1545 |
|
|
This directive blocks the calling task for the specified number
|
1546 |
|
|
of system clock ticks. When the requested interval has elapsed,
|
1547 |
|
|
the task is made ready. The @code{@value{DIRPREFIX}clock_tick}
|
1548 |
|
|
directive automatically updates the delay period.
|
1549 |
|
|
|
1550 |
|
|
@subheading NOTES:
|
1551 |
|
|
Setting the system date and time with the
|
1552 |
|
|
@code{@value{DIRPREFIX}clock_set} directive
|
1553 |
|
|
has no effect on a @code{@value{DIRPREFIX}task_wake_after} blocked task.
|
1554 |
|
|
|
1555 |
|
|
A task may give up the processor and remain in the ready state
|
1556 |
|
|
by specifying a value of @code{@value{RPREFIX}YIELD_PROCESSOR} in ticks.
|
1557 |
|
|
|
1558 |
|
|
The maximum timer interval that can be specified is the maximum
|
1559 |
|
|
value which can be represented by the rtems_unsigned32 type.
|
1560 |
|
|
|
1561 |
|
|
A clock tick is required to support the functionality of this directive.
|
1562 |
|
|
|
1563 |
|
|
@page
|
1564 |
|
|
|
1565 |
|
|
@subsection TASK_WAKE_WHEN - Wake up when specified
|
1566 |
|
|
|
1567 |
|
|
@cindex delay a task until a wall time
|
1568 |
|
|
@cindex wake up at a wall time
|
1569 |
|
|
|
1570 |
|
|
@subheading CALLING SEQUENCE:
|
1571 |
|
|
|
1572 |
|
|
@ifset is-C
|
1573 |
|
|
@findex rtems_task_wake_when
|
1574 |
|
|
@example
|
1575 |
|
|
rtems_status_code rtems_task_wake_when(
|
1576 |
|
|
rtems_time_of_day *time_buffer
|
1577 |
|
|
);
|
1578 |
|
|
@end example
|
1579 |
|
|
@end ifset
|
1580 |
|
|
|
1581 |
|
|
@ifset is-Ada
|
1582 |
|
|
@example
|
1583 |
|
|
procedure Task_Wake_When (
|
1584 |
|
|
Time_Buffer : in RTEMS.Time_Of_Day;
|
1585 |
|
|
Result : out RTEMS.Status_Codes
|
1586 |
|
|
);
|
1587 |
|
|
@end example
|
1588 |
|
|
@end ifset
|
1589 |
|
|
|
1590 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1591 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - awakened at date/time successfully@*
|
1592 |
|
|
@code{@value{RPREFIX}INVALID_TIME_OF_DAY} - invalid time buffer@*
|
1593 |
|
|
@code{@value{RPREFIX}NOT_DEFINED} - system date and time is not set
|
1594 |
|
|
|
1595 |
|
|
@subheading DESCRIPTION:
|
1596 |
|
|
This directive blocks a task until the date and time specified
|
1597 |
|
|
in time_buffer. At the requested date and time, the calling
|
1598 |
|
|
task will be unblocked and made ready to execute.
|
1599 |
|
|
|
1600 |
|
|
@subheading NOTES:
|
1601 |
|
|
The ticks portion of time_buffer @value{STRUCTURE} is ignored. The
|
1602 |
|
|
timing granularity of this directive is a second.
|
1603 |
|
|
|
1604 |
|
|
A clock tick is required to support the functionality of this directive.
|
1605 |
|
|
|
1606 |
|
|
@page
|
1607 |
|
|
|
1608 |
|
|
@subsection TASK_VARIABLE_ADD - Associate per task variable
|
1609 |
|
|
|
1610 |
|
|
@cindex per-task variable
|
1611 |
|
|
@cindex task private variable
|
1612 |
|
|
@cindex task private data
|
1613 |
|
|
|
1614 |
|
|
@subheading CALLING SEQUENCE:
|
1615 |
|
|
|
1616 |
|
|
@ifset is-C
|
1617 |
|
|
@findex rtems_task_variable_add
|
1618 |
|
|
@example
|
1619 |
|
|
rtems_status_code rtems_task_variable_add(
|
1620 |
|
|
rtems_id tid,
|
1621 |
|
|
void **ptr,
|
1622 |
|
|
void (*dtor)(void *)
|
1623 |
|
|
);
|
1624 |
|
|
@end example
|
1625 |
|
|
@end ifset
|
1626 |
|
|
|
1627 |
|
|
@ifset is-Ada
|
1628 |
|
|
@example
|
1629 |
|
|
procedure Task_Variable_Add (
|
1630 |
|
|
Id : in RTEMS.ID;
|
1631 |
|
|
Ptr : in RTEMS.Address;
|
1632 |
|
|
Result : out RTEMS.Status_Codes
|
1633 |
|
|
);
|
1634 |
|
|
@end example
|
1635 |
|
|
@end ifset
|
1636 |
|
|
|
1637 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1638 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - per task variable added successfully@*
|
1639 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
1640 |
|
|
@code{@value{RPREFIX}NO_MEMORY} - invalid task id@*
|
1641 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks@*
|
1642 |
|
|
|
1643 |
|
|
@subheading DESCRIPTION:
|
1644 |
|
|
This directive adds the memory location specified by the
|
1645 |
|
|
ptr argument to the context of the given task. The variable will
|
1646 |
|
|
then be private to the task. The task can access and modify the
|
1647 |
|
|
variable, but the modifications will not appear to other tasks, and
|
1648 |
|
|
other tasks' modifications to that variable will not affect the value
|
1649 |
|
|
seen by the task. This is accomplished by saving and restoring the
|
1650 |
|
|
variable's value each time a task switch occurs to or from the calling task.
|
1651 |
|
|
If the dtor argument is non-NULL it specifies the address of a `destructor'
|
1652 |
|
|
function which will be called when the task is deleted. The argument
|
1653 |
|
|
passed to the destructor function is the task's value of the variable.
|
1654 |
|
|
|
1655 |
|
|
@subheading NOTES:
|
1656 |
|
|
|
1657 |
|
|
Task variables increase the context switch time to and from the
|
1658 |
|
|
tasks that own them so it is desirable to minimize the number of
|
1659 |
|
|
task variables. One efficient method
|
1660 |
|
|
is to have a single task variable that is a pointer to a dynamically
|
1661 |
|
|
allocated structure containing the task's private `global' data.
|
1662 |
|
|
In this case the destructor function could be `free'.
|
1663 |
|
|
|
1664 |
|
|
@page
|
1665 |
|
|
|
1666 |
|
|
@subsection TASK_VARIABLE_GET - Obtain value of a per task variable
|
1667 |
|
|
|
1668 |
|
|
@cindex get per-task variable
|
1669 |
|
|
@cindex obtain per-task variable
|
1670 |
|
|
|
1671 |
|
|
@subheading CALLING SEQUENCE:
|
1672 |
|
|
|
1673 |
|
|
@ifset is-C
|
1674 |
|
|
@findex rtems_task_variable_get
|
1675 |
|
|
@example
|
1676 |
|
|
rtems_status_code rtems_task_variable_get(
|
1677 |
|
|
rtems_id tid,
|
1678 |
|
|
void **ptr,
|
1679 |
|
|
void **result
|
1680 |
|
|
);
|
1681 |
|
|
@end example
|
1682 |
|
|
@end ifset
|
1683 |
|
|
|
1684 |
|
|
@ifset is-Ada
|
1685 |
|
|
@example
|
1686 |
|
|
procedure Task_Variable_Get (
|
1687 |
|
|
Id : in RTEMS.ID;
|
1688 |
|
|
Ptr : in RTEMS.Address;
|
1689 |
|
|
Value : out RTEMS.Address;
|
1690 |
|
|
Result : out RTEMS.Status_Codes
|
1691 |
|
|
);
|
1692 |
|
|
@end example
|
1693 |
|
|
@end ifset
|
1694 |
|
|
|
1695 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1696 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - per task variable added successfully@*
|
1697 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
1698 |
|
|
@code{@value{RPREFIX}NO_MEMORY} - invalid task id@*
|
1699 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks@*
|
1700 |
|
|
|
1701 |
|
|
@subheading DESCRIPTION:
|
1702 |
|
|
This directive looks up the private value of a task variable for a
|
1703 |
|
|
specified task and stores that value in the location pointed to by
|
1704 |
|
|
the result argument. The specified task is usually not the calling
|
1705 |
|
|
task, which can get its private value by directly accessing the variable.
|
1706 |
|
|
|
1707 |
|
|
@subheading NOTES:
|
1708 |
|
|
|
1709 |
|
|
If you change memory which @code{result} points to, remember to declare that
|
1710 |
|
|
memory as volatile, so that the compiler will optimize it correctly. In this
|
1711 |
|
|
case both the pointer @code{result} and data referenced by @code{result}
|
1712 |
|
|
should be considered volatile.
|
1713 |
|
|
|
1714 |
|
|
@page
|
1715 |
|
|
|
1716 |
|
|
@subsection TASK_VARIABLE_DELETE - Remove per task variable
|
1717 |
|
|
|
1718 |
|
|
@cindex per-task variable
|
1719 |
|
|
@cindex task private variable
|
1720 |
|
|
@cindex task private data
|
1721 |
|
|
|
1722 |
|
|
@subheading CALLING SEQUENCE:
|
1723 |
|
|
|
1724 |
|
|
@ifset is-C
|
1725 |
|
|
@findex rtems_task_variable_delete
|
1726 |
|
|
@example
|
1727 |
|
|
rtems_status_code rtems_task_variable_delete(
|
1728 |
|
|
rtems_id tid,
|
1729 |
|
|
void **ptr
|
1730 |
|
|
);
|
1731 |
|
|
@end example
|
1732 |
|
|
@end ifset
|
1733 |
|
|
|
1734 |
|
|
@ifset is-Ada
|
1735 |
|
|
@example
|
1736 |
|
|
procedure Task_Variable_Delete (
|
1737 |
|
|
Id : in RTEMS.ID;
|
1738 |
|
|
Ptr : in RTEMS.Address;
|
1739 |
|
|
Result : out RTEMS.Status_Codes
|
1740 |
|
|
);
|
1741 |
|
|
@end example
|
1742 |
|
|
@end ifset
|
1743 |
|
|
|
1744 |
|
|
@subheading DIRECTIVE STATUS CODES:
|
1745 |
|
|
@code{@value{RPREFIX}SUCCESSFUL} - per task variable added successfully@*
|
1746 |
|
|
@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
|
1747 |
|
|
@code{@value{RPREFIX}NO_MEMORY} - invalid task id@*
|
1748 |
|
|
@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks@*
|
1749 |
|
|
|
1750 |
|
|
@subheading DESCRIPTION:
|
1751 |
|
|
This directive removes the given location from a task's context.
|
1752 |
|
|
|
1753 |
|
|
@subheading NOTES:
|
1754 |
|
|
|
1755 |
|
|
NONE
|