1 |
1254 |
phoenix |
|
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 |
|
|
The eCos Kernel
|
39 |
|
|
|
40 |
|
|
|
41 |
|
|
|
42 |
|
|
|
43 |
|
|
|
44 |
|
|
|
45 |
|
|
Kernel Overview
|
46 |
|
|
|
47 |
|
|
|
48 |
|
|
|
49 |
|
|
Kernel
|
50 |
|
|
Overview of the eCos Kernel
|
51 |
|
|
|
52 |
|
|
|
53 |
|
|
|
54 |
|
|
|
55 |
|
|
|
56 |
|
|
Description
|
57 |
|
|
|
58 |
|
|
The kernel is one of the key packages in all of eCos. It provides the
|
59 |
|
|
core functionality needed for developing multi-threaded applications:
|
60 |
|
|
|
61 |
|
|
|
62 |
|
|
|
63 |
|
|
The ability to create new threads in the system, either during startup
|
64 |
|
|
or when the system is already running.
|
65 |
|
|
|
66 |
|
|
|
67 |
|
|
Control over the various threads in the system, for example
|
68 |
|
|
manipulating their priorities.
|
69 |
|
|
|
70 |
|
|
|
71 |
|
|
A choice of schedulers, determining which thread should currently be
|
72 |
|
|
running.
|
73 |
|
|
|
74 |
|
|
|
75 |
|
|
A range of synchronization primitives, allowing threads to interact
|
76 |
|
|
and share data safely.
|
77 |
|
|
|
78 |
|
|
|
79 |
|
|
Integration with the system's support for interrupts and exceptions.
|
80 |
|
|
|
81 |
|
|
|
82 |
|
|
|
83 |
|
|
In some other operating systems the kernel provides additional
|
84 |
|
|
functionality. For example the kernel may also provide memory
|
85 |
|
|
allocation functionality, and device drivers may be part of the kernel
|
86 |
|
|
as well. This is not the case for eCos. Memory allocation is handled
|
87 |
|
|
by a separate package. Similary each device driver will typically be a
|
88 |
|
|
separate package. Various packages are combined and configured using
|
89 |
|
|
the eCos configuration technology to meet the requirements of the
|
90 |
|
|
application.
|
91 |
|
|
|
92 |
|
|
|
93 |
|
|
The eCos kernel package is optional. It is possible to write
|
94 |
|
|
single-threaded applications which do not use any kernel
|
95 |
|
|
functionality, for example RedBoot. Typically such applications are
|
96 |
|
|
based around a central polling loop, continually checking all devices
|
97 |
|
|
and taking appropriate action when I/O occurs. A small amount of
|
98 |
|
|
calculation is possible every iteration, at the cost of an increased
|
99 |
|
|
delay between an I/O event occurring and the polling loop detecting
|
100 |
|
|
the event. When the requirements are straightforward it may well be
|
101 |
|
|
easier to develop the application using a polling loop, avoiding the
|
102 |
|
|
complexities of multiple threads and synchronization between threads.
|
103 |
|
|
As requirements get more complicated a multi-threaded solution becomes
|
104 |
|
|
more appropriate, requiring the use of the kernel. In fact some of the
|
105 |
|
|
more advanced packages in eCos, for example the TCP/IP stack, use
|
106 |
|
|
multi-threading internally. Therefore if the application uses any of
|
107 |
|
|
those packages then the kernel becomes a required package, not an
|
108 |
|
|
optional one.
|
109 |
|
|
|
110 |
|
|
|
111 |
|
|
The kernel functionality can be used in one of two ways. The kernel
|
112 |
|
|
provides its own C API, with functions like
|
113 |
|
|
cyg_thread_create and
|
114 |
|
|
cyg_mutex_lock. These can be called directly from
|
115 |
|
|
application code or from other packages. Alternatively there are a
|
116 |
|
|
number of packages which provide compatibility with existing API's,
|
117 |
|
|
for example POSIX threads or µITRON. These allow application
|
118 |
|
|
code to call standard functions such as
|
119 |
|
|
pthread_create, and those functions are
|
120 |
|
|
implemented using the basic functionality provided by the eCos kernel.
|
121 |
|
|
Using compatibility packages in an eCos application can make it much
|
122 |
|
|
easier to reuse code developed in other environments, and to share
|
123 |
|
|
code.
|
124 |
|
|
|
125 |
|
|
|
126 |
|
|
Although the different compatibility packages have similar
|
127 |
|
|
requirements on the underlying kernel, for example the ability to
|
128 |
|
|
create a new thread, there are differences in the exact semantics. For
|
129 |
|
|
example, strict µITRON compliance requires that kernel
|
130 |
|
|
timeslicing is disabled. This is achieved largely through the
|
131 |
|
|
configuration technology. The kernel provides a number of
|
132 |
|
|
configuration options that control the exact semantics that are
|
133 |
|
|
provided, and the various compatibility packages require particular
|
134 |
|
|
settings for those options. This has two important consequences.
|
135 |
|
|
First, it is not usually possible to have two different compatibility
|
136 |
|
|
packages in one eCos configuration because they will have conflicting
|
137 |
|
|
requirements on the underlying kernel. Second, the semantics of the
|
138 |
|
|
kernel's own API are only loosely defined because of the many
|
139 |
|
|
configuration options. For example cyg_mutex_lock
|
140 |
|
|
will always attempt to lock a mutex, but various configuration options
|
141 |
|
|
determine the behaviour when the mutex is already locked and there is
|
142 |
|
|
a possibility of priority inversion.
|
143 |
|
|
|
144 |
|
|
|
145 |
|
|
The optional nature of the kernel package presents some complications
|
146 |
|
|
for other code, especially device drivers. Wherever possible a device
|
147 |
|
|
driver should work whether or not the kernel is present. However there
|
148 |
|
|
are some parts of the system, especially those related to interrupt
|
149 |
|
|
handling, which should be implemented differently in multi-threaded
|
150 |
|
|
environments containing the eCos kernel and in single-threaded
|
151 |
|
|
environments without the kernel. To cope with both scenarios the
|
152 |
|
|
common HAL package provides a driver API, with functions such as
|
153 |
|
|
cyg_drv_interrupt_attach. When the kernel package
|
154 |
|
|
is present these driver API functions map directly on to the
|
155 |
|
|
equivalent kernel functions such as
|
156 |
|
|
cyg_interrupt_attach, using macros to avoid any
|
157 |
|
|
overheads. When the kernel is absent the common HAL package implements
|
158 |
|
|
the driver API directly, but this implementation is simpler than the
|
159 |
|
|
one in the kernel because it can assume a single-threaded environment.
|
160 |
|
|
|
161 |
|
|
|
162 |
|
|
|
163 |
|
|
|
164 |
|
|
|
165 |
|
|
|
166 |
|
|
|
167 |
|
|
Schedulers
|
168 |
|
|
|
169 |
|
|
When a system involves multiple threads, a scheduler is needed to
|
170 |
|
|
determine which thread should currently be running. The eCos kernel
|
171 |
|
|
can be configured with one of two schedulers, the bitmap scheduler and
|
172 |
|
|
the multi-level queue (MLQ) scheduler. The bitmap scheduler is
|
173 |
|
|
somewhat more efficient, but has a number of limitations. Most systems
|
174 |
|
|
will instead use the MLQ scheduler. Other schedulers may be added in
|
175 |
|
|
the future, either as extensions to the kernel package or in separate
|
176 |
|
|
packages.
|
177 |
|
|
|
178 |
|
|
|
179 |
|
|
Both the bitmap and the MLQ scheduler use a simple numerical priority
|
180 |
|
|
to determine which thread should be running. The number of priority
|
181 |
|
|
levels is configurable via the option
|
182 |
|
|
CYGNUM_KERNEL_SCHED_PRIORITIES, but a typical
|
183 |
|
|
system will have up to 32 priority levels. Therefore thread priorities
|
184 |
|
|
will be in the range 0 to 31, with 0 being the highest priority and 31
|
185 |
|
|
the lowest. Usually only the system's idle thread will run at the
|
186 |
|
|
lowest priority. Thread priorities are absolute, so the kernel will
|
187 |
|
|
only run a lower-priority thread if all higher-priority threads are
|
188 |
|
|
currently blocked.
|
189 |
|
|
|
190 |
|
|
|
191 |
|
|
The bitmap scheduler only allows one thread per priority level, so if
|
192 |
|
|
the system is configured with 32 priority levels then it is limited to
|
193 |
|
|
only 32 threads — still enough for many applications. A simple
|
194 |
|
|
bitmap can be used to keep track of which threads are currently
|
195 |
|
|
runnable. Bitmaps can also be used to keep track of threads waiting on
|
196 |
|
|
a mutex or other synchronization primitive. Identifying the
|
197 |
|
|
highest-priority runnable or waiting thread involves a simple
|
198 |
|
|
operation on the bitmap, and an array index operation can then be used
|
199 |
|
|
to get hold of the thread data structure itself. This makes the
|
200 |
|
|
bitmap scheduler fast and totally deterministic.
|
201 |
|
|
|
202 |
|
|
|
203 |
|
|
The MLQ scheduler allows multiple threads to run at the same priority.
|
204 |
|
|
This means that there is no limit on the number of threads in the
|
205 |
|
|
system, other than the amount of memory available. However operations
|
206 |
|
|
such as finding the highest priority runnable thread are a little bit
|
207 |
|
|
more expensive than for the bitmap scheduler.
|
208 |
|
|
|
209 |
|
|
|
210 |
|
|
Optionally the MLQ scheduler supports timeslicing, where the scheduler
|
211 |
|
|
automatically switches from one runnable thread to another when some
|
212 |
|
|
number of clock ticks have occurred. Timeslicing only comes into play
|
213 |
|
|
when there are two runnable threads at the same priority and no higher
|
214 |
|
|
priority runnable threads. If timeslicing is disabled then a thread
|
215 |
|
|
will not be preempted by another thread of the same priority, and will
|
216 |
|
|
continue running until either it explicitly yields the processor or
|
217 |
|
|
until it blocks by, for example, waiting on a synchronization
|
218 |
|
|
primitive. The configuration options
|
219 |
|
|
CYGSEM_KERNEL_SCHED_TIMESLICE and
|
220 |
|
|
CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS control
|
221 |
|
|
timeslicing. The bitmap scheduler does not provide timeslicing
|
222 |
|
|
support. It only allows one thread per priority level, so it is not
|
223 |
|
|
possible to preempt the current thread in favour of another one with
|
224 |
|
|
the same priority.
|
225 |
|
|
|
226 |
|
|
|
227 |
|
|
Another important configuration option that affects the MLQ scheduler
|
228 |
|
|
is CYGIMP_KERNEL_SCHED_SORTED_QUEUES. This
|
229 |
|
|
determines what happens when a thread blocks, for example by waiting
|
230 |
|
|
on a semaphore which has no pending events. The default behaviour of
|
231 |
|
|
the system is last-in-first-out queuing. For example if several
|
232 |
|
|
threads are waiting on a semaphore and an event is posted, the thread
|
233 |
|
|
that gets woken up is the last one that called
|
234 |
|
|
cyg_semaphore_wait. This allows for a simple and
|
235 |
|
|
fast implementation of both the queue and dequeue operations. However
|
236 |
|
|
if there are several queued threads with different priorities, it may
|
237 |
|
|
not be the highest priority one that gets woken up. In practice this
|
238 |
|
|
is rarely a problem: usually there will be at most one thread waiting
|
239 |
|
|
on a queue, or when there are several threads they will be of the same
|
240 |
|
|
priority. However if the application does require strict priority
|
241 |
|
|
queueing then the option
|
242 |
|
|
CYGIMP_KERNEL_SCHED_SORTED_QUEUES should be
|
243 |
|
|
enabled. There are disadvantages: more work is needed whenever a
|
244 |
|
|
thread is queued, and the scheduler needs to be locked for this
|
245 |
|
|
operation so the system's dispatch latency is worse. If the bitmap
|
246 |
|
|
scheduler is used then priority queueing is automatic and does not
|
247 |
|
|
involve any penalties.
|
248 |
|
|
|
249 |
|
|
|
250 |
|
|
Some kernel functionality is currently only supported with the MLQ
|
251 |
|
|
scheduler, not the bitmap scheduler. This includes support for SMP
|
252 |
|
|
systems, and protection against priority inversion using either mutex
|
253 |
|
|
priority ceilings or priority inheritance.
|
254 |
|
|
|
255 |
|
|
|
256 |
|
|
|
257 |
|
|
|
258 |
|
|
|
259 |
|
|
|
260 |
|
|
|
261 |
|
|
Synchronization Primitives
|
262 |
|
|
|
263 |
|
|
The eCos kernel provides a number of different synchronization
|
264 |
|
|
primitives: mutexes,
|
265 |
|
|
condition variables,
|
266 |
|
|
counting semaphores,
|
267 |
|
|
mail boxes and
|
268 |
|
|
event flags.
|
269 |
|
|
|
270 |
|
|
|
271 |
|
|
Mutexes serve a very different purpose from the other primitives. A
|
272 |
|
|
mutex allows multiple threads to share a resource safely: a thread
|
273 |
|
|
locks a mutex, manipulates the shared resource, and then unlocks the
|
274 |
|
|
mutex again. The other primitives are used to communicate information
|
275 |
|
|
between threads, or alternatively from a DSR associated with an
|
276 |
|
|
interrupt handler to a thread.
|
277 |
|
|
|
278 |
|
|
|
279 |
|
|
When a thread that has locked a mutex needs to wait for some condition
|
280 |
|
|
to become true, it should use a condition variable. A condition
|
281 |
|
|
variable is essentially just a place for a thread to wait, and which
|
282 |
|
|
another thread, or DSR, can use to wake it up. When a thread waits on
|
283 |
|
|
a condition variable it releases the mutex before waiting, and when it
|
284 |
|
|
wakes up it reacquires it before proceeding. These operations are
|
285 |
|
|
atomic so that synchronization race conditions cannot be introduced.
|
286 |
|
|
|
287 |
|
|
|
288 |
|
|
A counting semaphore is used to indicate that a particular event has
|
289 |
|
|
occurred. A consumer thread can wait for this event to occur, and a
|
290 |
|
|
producer thread or a DSR can post the event. There is a count
|
291 |
|
|
associated with the semaphore so if the event occurs multiple times in
|
292 |
|
|
quick succession this information is not lost, and the appropriate
|
293 |
|
|
number of semaphore wait operations will succeed.
|
294 |
|
|
|
295 |
|
|
|
296 |
|
|
Mail boxes are also used to indicate that a particular event has
|
297 |
|
|
occurred, and allows for one item of data to be exchanged per event.
|
298 |
|
|
Typically this item of data would be a pointer to some data structure.
|
299 |
|
|
Because of the need to store this extra data, mail boxes have a
|
300 |
|
|
finite capacity. If a producer thread generates mail box events
|
301 |
|
|
faster than they can be consumed then, to avoid overflow, it will be
|
302 |
|
|
blocked until space is again available in the mail box. This means
|
303 |
|
|
that mail boxes usually cannot be used by a DSR to wake up a
|
304 |
|
|
thread. Instead mail boxes are typically only used between threads.
|
305 |
|
|
|
306 |
|
|
|
307 |
|
|
Event flags can be used to wait on some number of different events,
|
308 |
|
|
and to signal that one or several of these events have occurred. This
|
309 |
|
|
is achieved by associating bits in a bit mask with the different
|
310 |
|
|
events. Unlike a counting semaphore no attempt is made to keep track
|
311 |
|
|
of the number of events that have occurred, only the fact that an
|
312 |
|
|
event has occurred at least once. Unlike a mail box it is not
|
313 |
|
|
possible to send additional data with the event, but this does mean
|
314 |
|
|
that there is no possibility of an overflow and hence event flags can
|
315 |
|
|
be used between a DSR and a thread as well as between threads.
|
316 |
|
|
|
317 |
|
|
|
318 |
|
|
The eCos common HAL package provides its own device driver API which
|
319 |
|
|
contains some of the above synchronization primitives. These allow
|
320 |
|
|
the DSR for an interrupt handler to signal events to higher-level
|
321 |
|
|
code. If the configuration includes the eCos kernel package then
|
322 |
|
|
the driver API routines map directly on to the equivalent kernel
|
323 |
|
|
routines, allowing interrupt handlers to interact with threads. If the
|
324 |
|
|
kernel package is not included and the application consists of just a
|
325 |
|
|
single thread running in polled mode then the driver API is
|
326 |
|
|
implemented entirely within the common HAL, and with no need to worry
|
327 |
|
|
about multiple threads the implementation can obviously be rather
|
328 |
|
|
simpler.
|
329 |
|
|
|
330 |
|
|
|
331 |
|
|
|
332 |
|
|
|
333 |
|
|
|
334 |
|
|
|
335 |
|
|
|
336 |
|
|
Threads and Interrupt Handling
|
337 |
|
|
|
338 |
|
|
During normal operation the processor will be running one of the
|
339 |
|
|
threads in the system. This may be an application thread, a system
|
340 |
|
|
thread running inside say the TCP/IP stack, or the idle thread. From
|
341 |
|
|
time to time a hardware interrupt will occur, causing control to be
|
342 |
|
|
transferred briefly to an interrupt handler. When the interrupt has
|
343 |
|
|
been completed the system's scheduler will decide whether to return
|
344 |
|
|
control to the interrupted thread or to some other runnable thread.
|
345 |
|
|
|
346 |
|
|
|
347 |
|
|
Threads and interrupt handlers must be able to interact. If a thread
|
348 |
|
|
is waiting for some I/O operation to complete, the interrupt handler
|
349 |
|
|
associated with that I/O must be able to inform the thread that the
|
350 |
|
|
operation has completed. This can be achieved in a number of ways. One
|
351 |
|
|
very simple approach is for the interrupt handler to set a volatile
|
352 |
|
|
variable. A thread can then poll continuously until this flag is set,
|
353 |
|
|
possibly sleeping for a clock tick in between. Polling continuously
|
354 |
|
|
means that the cpu time is not available for other activities, which
|
355 |
|
|
may be acceptable for some but not all applications. Polling once
|
356 |
|
|
every clock tick imposes much less overhead, but means that the thread
|
357 |
|
|
may not detect that the I/O event has occurred until an entire clock
|
358 |
|
|
tick has elapsed. In typical systems this could be as long as 10
|
359 |
|
|
milliseconds. Such a delay might be acceptable for some applications,
|
360 |
|
|
but not all.
|
361 |
|
|
|
362 |
|
|
|
363 |
|
|
A better solution would be to use one of the synchronization
|
364 |
|
|
primitives. The interrupt handler could signal a condition variable,
|
365 |
|
|
post to a semaphore, or use one of the other primitives. The thread
|
366 |
|
|
would perform a wait operation on the same primitive. It would not
|
367 |
|
|
consume any cpu cycles until the I/O event had occurred, and when the
|
368 |
|
|
event does occur the thread can start running again immediately
|
369 |
|
|
(subject to any higher priority threads that might also be runnable).
|
370 |
|
|
|
371 |
|
|
|
372 |
|
|
Synchronization primitives constitute shared data, so care must be
|
373 |
|
|
taken to avoid problems with concurrent access. If the thread that was
|
374 |
|
|
interrupted was just performing some calculations then the interrupt
|
375 |
|
|
handler could manipulate the synchronization primitive quite safely.
|
376 |
|
|
However if the interrupted thread happened to be inside some kernel
|
377 |
|
|
call then there is a real possibility that some kernel data structure
|
378 |
|
|
will be corrupted.
|
379 |
|
|
|
380 |
|
|
|
381 |
|
|
One way of avoiding such problems would be for the kernel functions to
|
382 |
|
|
disable interrupts when executing any critical region. On most
|
383 |
|
|
architectures this would be simple to implement and very fast, but it
|
384 |
|
|
would mean that interrupts would be disabled often and for quite a
|
385 |
|
|
long time. For some applications that might not matter, but many
|
386 |
|
|
embedded applications require that the interrupt handler run as soon
|
387 |
|
|
as possible after the hardware interrupt has occurred. If the kernel
|
388 |
|
|
relied on disabling interrupts then it would not be able to support
|
389 |
|
|
such applications.
|
390 |
|
|
|
391 |
|
|
|
392 |
|
|
Instead the kernel uses a two-level approach to interrupt handling.
|
393 |
|
|
Associated with every interrupt vector is an Interrupt Service Routine
|
394 |
|
|
or ISR, which will run as quickly as possible so that it can service
|
395 |
|
|
the hardware. However an ISR can make only a small number of kernel
|
396 |
|
|
calls, mostly related to the interrupt subsystem, and it cannot make
|
397 |
|
|
any call that would cause a thread to wake up. If an ISR detects that
|
398 |
|
|
an I/O operation has completed and hence that a thread should be woken
|
399 |
|
|
up, it can cause the associated Deferred Service Routine or DSR to
|
400 |
|
|
run. A DSR is allowed to make more kernel calls, for example it can
|
401 |
|
|
signal a condition variable or post to a semaphore.
|
402 |
|
|
|
403 |
|
|
|
404 |
|
|
Disabling interrupts prevents ISRs from running, but very few parts of
|
405 |
|
|
the system disable interrupts and then only for short periods of time.
|
406 |
|
|
The main reason for a thread to disable interrupts is to manipulate
|
407 |
|
|
some state that is shared with an ISR. For example if a thread needs
|
408 |
|
|
to add another buffer to a linked list of free buffers and the ISR may
|
409 |
|
|
remove a buffer from this list at any time, the thread would need to
|
410 |
|
|
disable interrupts for the few instructions needed to manipulate the
|
411 |
|
|
list. If the hardware raises an interrupt at this time, it remains
|
412 |
|
|
pending until interrupts are reenabled.
|
413 |
|
|
|
414 |
|
|
|
415 |
|
|
Analogous to interrupts being disabled or enabled, the kernel has a
|
416 |
|
|
scheduler lock. The various kernel functions such as
|
417 |
|
|
cyg_mutex_lock and
|
418 |
|
|
cyg_semaphore_post will claim the scheduler lock,
|
419 |
|
|
manipulate the kernel data structures, and then release the scheduler
|
420 |
|
|
lock. If an interrupt results in a DSR being requested and the
|
421 |
|
|
scheduler is currently locked, the DSR remains pending. When the
|
422 |
|
|
scheduler lock is released any pending DSRs will run. These may post
|
423 |
|
|
events to synchronization primitives, causing other higher priority
|
424 |
|
|
threads to be woken up.
|
425 |
|
|
|
426 |
|
|
|
427 |
|
|
For an example, consider the following scenario. The system has a high
|
428 |
|
|
priority thread A, responsible for processing some data coming from an
|
429 |
|
|
external device. This device will raise an interrupt when data is
|
430 |
|
|
available. There are two other threads B and C which spend their time
|
431 |
|
|
performing calculations and occasionally writing results to a display
|
432 |
|
|
of some sort. This display is a shared resource so a mutex is used to
|
433 |
|
|
control access.
|
434 |
|
|
|
435 |
|
|
|
436 |
|
|
At a particular moment in time thread A is likely to be blocked,
|
437 |
|
|
waiting on a semaphore or another synchronization primitive until data
|
438 |
|
|
is available. Thread B might be running performing some calculations,
|
439 |
|
|
and thread C is runnable waiting for its next timeslice. Interrupts
|
440 |
|
|
are enabled, and the scheduler is unlocked because none of the threads
|
441 |
|
|
are in the middle of a kernel operation. At this point the device
|
442 |
|
|
raises an interrupt. The hardware transfers control to a low-level
|
443 |
|
|
interrupt handler provided by eCos which works out exactly which
|
444 |
|
|
interrupt occurs, and then the corresponding ISR is run. This ISR
|
445 |
|
|
manipulates the hardware as appropriate, determines that there is now
|
446 |
|
|
data available, and wants to wake up thread A by posting to the
|
447 |
|
|
semaphore. However ISR's are not allowed to call
|
448 |
|
|
cyg_semaphore_post directly, so instead the ISR
|
449 |
|
|
requests that its associated DSR be run and returns. There are no more
|
450 |
|
|
interrupts to be processed, so the kernel next checks for DSR's. One
|
451 |
|
|
DSR is pending and the scheduler is currently unlocked, so the DSR can
|
452 |
|
|
run immediately and post the semaphore. This will have the effect of
|
453 |
|
|
making thread A runnable again, so the scheduler's data structures are
|
454 |
|
|
adjusted accordingly. When the DSR returns thread B is no longer the
|
455 |
|
|
highest priority runnable thread so it will be suspended, and instead
|
456 |
|
|
thread A gains control over the cpu.
|
457 |
|
|
|
458 |
|
|
|
459 |
|
|
In the above example no kernel data structures were being manipulated
|
460 |
|
|
at the exact moment that the interrupt happened. However that cannot
|
461 |
|
|
be assumed. Suppose that thread B had finished its current set of
|
462 |
|
|
calculations and wanted to write the results to the display. It would
|
463 |
|
|
claim the appropriate mutex and manipulate the display. Now suppose
|
464 |
|
|
that thread B was timesliced in favour of thread C, and that thread C
|
465 |
|
|
also finished its calculations and wanted to write the results to the
|
466 |
|
|
display. It would call cyg_mutex_lock. This
|
467 |
|
|
kernel call locks the scheduler, examines the current state of the
|
468 |
|
|
mutex, discovers that the mutex is already owned by another thread,
|
469 |
|
|
suspends the current thread, and switches control to another runnable
|
470 |
|
|
thread. Another interrupt happens in the middle of this
|
471 |
|
|
cyg_mutex_lock call, causing the ISR to run
|
472 |
|
|
immediately. The ISR decides that thread A should be woken up so it
|
473 |
|
|
requests that its DSR be run and returns back to the kernel. At this
|
474 |
|
|
point there is a pending DSR, but the scheduler is still locked by the
|
475 |
|
|
call to cyg_mutex_lock so the DSR cannot run
|
476 |
|
|
immediately. Instead the call to cyg_mutex_lock
|
477 |
|
|
is allowed to continue, which at some point involves unlocking the
|
478 |
|
|
scheduler. The pending DSR can now run, safely post the semaphore, and
|
479 |
|
|
thus wake up thread A.
|
480 |
|
|
|
481 |
|
|
|
482 |
|
|
If the ISR had called cyg_semaphore_post directly
|
483 |
|
|
rather than leaving it to a DSR, it is likely that there would have
|
484 |
|
|
been some sort of corruption of a kernel data structure. For example
|
485 |
|
|
the kernel might have completely lost track of one of the threads, and
|
486 |
|
|
that thread would never have run again. The two-level approach to
|
487 |
|
|
interrupt handling, ISR's and DSR's, prevents such problems with no
|
488 |
|
|
need to disable interrupts.
|
489 |
|
|
|
490 |
|
|
|
491 |
|
|
|
492 |
|
|
|
493 |
|
|
|
494 |
|
|
|
495 |
|
|
|
496 |
|
|
Calling Contexts
|
497 |
|
|
|
498 |
|
|
eCos defines a number of contexts. Only certain calls are allowed from
|
499 |
|
|
inside each context, for example most operations on threads or
|
500 |
|
|
synchronization primitives are not allowed from ISR context. The
|
501 |
|
|
different contexts are initialization, thread, ISR and DSR.
|
502 |
|
|
|
503 |
|
|
|
504 |
|
|
When eCos starts up it goes through a number of phases, including
|
505 |
|
|
setting up the hardware and invoking C++ static constructors. During
|
506 |
|
|
this time interrupts are disabled and the scheduler is locked. When a
|
507 |
|
|
configuration includes the kernel package the final operation is a
|
508 |
|
|
call to
|
509 |
|
|
linkend="kernel-schedcontrol">cyg_scheduler_start.
|
510 |
|
|
At this point interrupts are enabled, the scheduler is unlocked, and
|
511 |
|
|
control is transferred to the highest priority runnable thread. If the
|
512 |
|
|
configuration also includes the C library package then usually the C
|
513 |
|
|
library startup package will have created a thread which will call the
|
514 |
|
|
application's main entry point.
|
515 |
|
|
|
516 |
|
|
|
517 |
|
|
Some application code can also run before the scheduler is started,
|
518 |
|
|
and this code runs in initialization context. If the application is
|
519 |
|
|
written partly or completely in C++ then the constructors for any
|
520 |
|
|
static objects will be run. Alternatively application code can define
|
521 |
|
|
a function cyg_user_start which gets called after
|
522 |
|
|
any C++ static constructors. This allows applications to be written
|
523 |
|
|
entirely in C.
|
524 |
|
|
|
525 |
|
|
|
526 |
|
|
void
|
527 |
|
|
cyg_user_start(void)
|
528 |
|
|
{
|
529 |
|
|
/* Perform application-specific initialization here */
|
530 |
|
|
}
|
531 |
|
|
|
532 |
|
|
|
533 |
|
|
It is not necessary for applications to provide a
|
534 |
|
|
cyg_user_start function since the system will
|
535 |
|
|
provide a default implementation which does nothing.
|
536 |
|
|
|
537 |
|
|
|
538 |
|
|
Typical operations that are performed from inside static constructors
|
539 |
|
|
or cyg_user_start include creating threads,
|
540 |
|
|
synchronization primitives, setting up alarms, and registering
|
541 |
|
|
application-specific interrupt handlers. In fact for many applications
|
542 |
|
|
all such creation operations happen at this time, using statically
|
543 |
|
|
allocated data, avoiding any need for dynamic memory allocation or
|
544 |
|
|
other overheads.
|
545 |
|
|
|
546 |
|
|
|
547 |
|
|
Code running in initialization context runs with interrupts disabled
|
548 |
|
|
and the scheduler locked. It is not permitted to reenable interrupts
|
549 |
|
|
or unlock the scheduler because the system is not guaranteed to be in
|
550 |
|
|
a totally consistent state at this point. A consequence is that
|
551 |
|
|
initialization code cannot use synchronization primitives such as
|
552 |
|
|
cyg_semaphore_wait to wait for an external event.
|
553 |
|
|
It is permitted to lock and unlock a mutex: there are no other threads
|
554 |
|
|
running so it is guaranteed that the mutex is not yet locked, and
|
555 |
|
|
therefore the lock operation will never block; this is useful when
|
556 |
|
|
making library calls that may use a mutex internally.
|
557 |
|
|
|
558 |
|
|
|
559 |
|
|
At the end of the startup sequence the system will call
|
560 |
|
|
cyg_scheduler_start and the various threads will
|
561 |
|
|
start running. In thread context nearly all of the kernel functions
|
562 |
|
|
are available. There may be some restrictions on interrupt-related
|
563 |
|
|
operations, depending on the target hardware. For example the hardware
|
564 |
|
|
may require that interrupts be acknowledged in the ISR or DSR before
|
565 |
|
|
control returns to thread context, in which case
|
566 |
|
|
cyg_interrupt_acknowledge should not be called
|
567 |
|
|
by a thread.
|
568 |
|
|
|
569 |
|
|
|
570 |
|
|
At any time the processor may receive an external interrupt, causing
|
571 |
|
|
control to be transferred from the current thread. Typically a VSR
|
572 |
|
|
provided by eCos will run and determine exactly which interrupt
|
573 |
|
|
occurred. Then the VSR will switch to the appropriate ISR, which can
|
574 |
|
|
be provided by a HAL package, a device driver, or by the application.
|
575 |
|
|
During this time the system is running at ISR context, and most of the
|
576 |
|
|
kernel function calls are disallowed. This includes the various
|
577 |
|
|
synchronization primitives, so for example an ISR is not allowed to
|
578 |
|
|
post to a semaphore to indicate that an event has happened. Usually
|
579 |
|
|
the only operations that should be performed from inside an ISR are
|
580 |
|
|
ones related to the interrupt subsystem itself, for example masking an
|
581 |
|
|
interrupt or acknowledging that an interrupt has been processed. On
|
582 |
|
|
SMP systems it is also possible to use spinlocks from ISR context.
|
583 |
|
|
|
584 |
|
|
|
585 |
|
|
When an ISR returns it can request that the corresponding DSR be run
|
586 |
|
|
as soon as it is safe to do so, and that will run in DSR context. This
|
587 |
|
|
context is also used for running alarm functions, and threads can
|
588 |
|
|
switch temporarily to DSR context by locking the scheduler. Only
|
589 |
|
|
certain kernel functions can be called from DSR context, although more
|
590 |
|
|
than in ISR context. In particular it is possible to use any
|
591 |
|
|
synchronization primitives which cannot block. These include
|
592 |
|
|
cyg_semaphore_post,
|
593 |
|
|
cyg_cond_signal,
|
594 |
|
|
cyg_cond_broadcast,
|
595 |
|
|
cyg_flag_setbits, and
|
596 |
|
|
cyg_mbox_tryput. It is not possible to use any
|
597 |
|
|
primitives that may block such as
|
598 |
|
|
cyg_semaphore_wait,
|
599 |
|
|
cyg_mutex_lock, or
|
600 |
|
|
cyg_mbox_put. Calling such functions from inside
|
601 |
|
|
a DSR may cause the system to hang.
|
602 |
|
|
|
603 |
|
|
|
604 |
|
|
The specific documentation for the various kernel functions gives more
|
605 |
|
|
details about valid contexts.
|
606 |
|
|
|
607 |
|
|
|
608 |
|
|
|
609 |
|
|
|
610 |
|
|
|
611 |
|
|
|
612 |
|
|
|
613 |
|
|
Error Handling and Assertions
|
614 |
|
|
|
615 |
|
|
In many APIs each function is expected to perform some validation of
|
616 |
|
|
its parameters and possibly of the current state of the system. This
|
617 |
|
|
is supposed to ensure that each function is used correctly, and that
|
618 |
|
|
application code is not attempting to perform a semaphore operation on
|
619 |
|
|
a mutex or anything like that. If an error is detected then a suitable
|
620 |
|
|
error code is returned, for example the POSIX function
|
621 |
|
|
pthread_mutex_lock can return various error codes
|
622 |
|
|
including EINVAL and EDEADLK.
|
623 |
|
|
There are a number of problems with this approach, especially in the
|
624 |
|
|
context of deeply embedded systems:
|
625 |
|
|
|
626 |
|
|
|
627 |
|
|
|
628 |
|
|
Performing these checks inside the mutex lock and all the other
|
629 |
|
|
functions requires extra cpu cycles and adds significantly to the code
|
630 |
|
|
size. Even if the application is written correctly and only makes
|
631 |
|
|
system function calls with sensible arguments and under the right
|
632 |
|
|
conditions, these overheads still exist.
|
633 |
|
|
|
634 |
|
|
|
635 |
|
|
Returning an error code is only useful if the calling code detects
|
636 |
|
|
these error codes and takes appropriate action. In practice the
|
637 |
|
|
calling code will often ignore any errors because the programmer
|
638 |
|
|
“knows” that the function is being
|
639 |
|
|
used correctly. If the programmer is mistaken then an error condition
|
640 |
|
|
may be detected and reported, but the application continues running
|
641 |
|
|
anyway and is likely to fail some time later in mysterious ways.
|
642 |
|
|
|
643 |
|
|
|
644 |
|
|
If the calling code does always check for error codes, that adds yet
|
645 |
|
|
more cpu cycles and code size overhead.
|
646 |
|
|
|
647 |
|
|
|
648 |
|
|
Usually there will be no way to recover from certain errors, so if the
|
649 |
|
|
application code detected an error such as EINVAL
|
650 |
|
|
then all it could do is abort the application somehow.
|
651 |
|
|
|
652 |
|
|
|
653 |
|
|
|
654 |
|
|
The approach taken within the eCos kernel is different. Functions such
|
655 |
|
|
as cyg_mutex_lock will not return an error code.
|
656 |
|
|
Instead they contain various assertions, which can be enabled or
|
657 |
|
|
disabled. During the development process assertions are normally left
|
658 |
|
|
enabled, and the various kernel functions will perform parameter
|
659 |
|
|
checks and other system consistency checks. If a problem is detected
|
660 |
|
|
then an assertion failure will be reported and the application will be
|
661 |
|
|
terminated. In a typical debug session a suitable breakpoint will have
|
662 |
|
|
been installed and the developer can now examine the state of the
|
663 |
|
|
system and work out exactly what is going on. Towards the end of the
|
664 |
|
|
development cycle assertions will be disabled by manipulating
|
665 |
|
|
configuration options within the eCos infrastructure package, and all
|
666 |
|
|
assertions will be eliminated at compile-time. The assumption is that
|
667 |
|
|
by this time the application code has been mostly debugged: the
|
668 |
|
|
initial version of the code might have tried to perform a semaphore
|
669 |
|
|
operation on a mutex, but any problems like that will have been fixed
|
670 |
|
|
some time ago. This approach has a number of advantages:
|
671 |
|
|
|
672 |
|
|
|
673 |
|
|
|
674 |
|
|
In the final application there will be no overheads for checking
|
675 |
|
|
parameters and other conditions. All that code will have been
|
676 |
|
|
eliminated at compile-time.
|
677 |
|
|
|
678 |
|
|
|
679 |
|
|
Because the final application will not suffer any overheads, it is
|
680 |
|
|
reasonable for the system to do more work during the development
|
681 |
|
|
process. In particular the various assertions can test for more error
|
682 |
|
|
conditions and more complicated errors. When an error is detected
|
683 |
|
|
it is possible to give a text message describing the error rather than
|
684 |
|
|
just return an error code.
|
685 |
|
|
|
686 |
|
|
|
687 |
|
|
There is no need for application programmers to handle error codes
|
688 |
|
|
returned by various kernel function calls. This simplifies the
|
689 |
|
|
application code.
|
690 |
|
|
|
691 |
|
|
|
692 |
|
|
If an error is detected then an assertion failure will be reported
|
693 |
|
|
immediately and the application will be halted. There is no
|
694 |
|
|
possibility of an error condition being ignored because application
|
695 |
|
|
code did not check for an error code.
|
696 |
|
|
|
697 |
|
|
|
698 |
|
|
|
699 |
|
|
Although none of the kernel functions return an error code, many of
|
700 |
|
|
them do return a status condition. For example the function
|
701 |
|
|
cyg_semaphore_timed_wait waits until either an
|
702 |
|
|
event has been posted to a semaphore, or until a certain number of
|
703 |
|
|
clock ticks have occurred. Usually the calling code will need to know
|
704 |
|
|
whether the wait operation succeeded or whether a timeout occurred.
|
705 |
|
|
cyg_semaphore_timed_wait returns a boolean: a
|
706 |
|
|
return value of zero or false indicates a timeout, a non-zero return
|
707 |
|
|
value indicates that the wait succeeded.
|
708 |
|
|
|
709 |
|
|
|
710 |
|
|
In conventional APIs one common error conditions is lack of memory.
|
711 |
|
|
For example the POSIX function pthread_create
|
712 |
|
|
usually has to allocate some memory dynamically for the thread stack
|
713 |
|
|
and other per-thread data. If the target hardware does not have enough
|
714 |
|
|
memory to meet all demands, or more commonly if the application
|
715 |
|
|
contains a memory leak, then there may not be enough memory available
|
716 |
|
|
and the function call would fail. The eCos kernel avoids such problems
|
717 |
|
|
by never performing any dynamic memory allocation. Instead it is the
|
718 |
|
|
responsibility of the application code to provide all the memory
|
719 |
|
|
required for kernel data structures and other needs. In the case of
|
720 |
|
|
cyg_thread_create this means a
|
721 |
|
|
cyg_thread data structure to hold the thread
|
722 |
|
|
details, and a char array for the thread stack.
|
723 |
|
|
|
724 |
|
|
|
725 |
|
|
In many applications this approach results in all data structures
|
726 |
|
|
being allocated statically rather than dynamically. This has several
|
727 |
|
|
advantages. If the application is in fact too large for the target
|
728 |
|
|
hardware's memory then there will be an error at link-time rather than
|
729 |
|
|
at run-time, making the problem much easier to diagnose. Static
|
730 |
|
|
allocation does not involve any of the usual overheads associated with
|
731 |
|
|
dynamic allocation, for example there is no need to keep track of the
|
732 |
|
|
various free blocks in the system, and it may be possible to eliminate
|
733 |
|
|
malloc from the system completely. Problems such
|
734 |
|
|
as fragmentation and memory leaks cannot occur if all data is
|
735 |
|
|
allocated statically. However, some applications are sufficiently
|
736 |
|
|
complicated that dynamic memory allocation is required, and the
|
737 |
|
|
various kernel functions do not distinguish between statically and
|
738 |
|
|
dynamically allocated memory. It still remains the responsibility of
|
739 |
|
|
the calling code to ensure that sufficient memory is available, and
|
740 |
|
|
passing null pointers to the kernel will result in assertions or
|
741 |
|
|
system failure.
|
742 |
|
|
|
743 |
|
|
|
744 |
|
|
|
745 |
|
|
|
746 |
|
|
|
747 |
|
|
|
748 |
|
|
|
749 |
|
|
|
750 |
|
|
|
751 |
|
|
|
752 |
|
|
|
753 |
|
|
|
754 |
|
|
|
755 |
|
|
SMP Support
|
756 |
|
|
|
757 |
|
|
|
758 |
|
|
|
759 |
|
|
SMP
|
760 |
|
|
Support Symmetric Multiprocessing Systems
|
761 |
|
|
|
762 |
|
|
|
763 |
|
|
|
764 |
|
|
Description
|
765 |
|
|
|
766 |
|
|
eCos contains support for limited Symmetric Multi-Processing (SMP).
|
767 |
|
|
This is only available on selected architectures and platforms.
|
768 |
|
|
The implementation has a number of restrictions on the kind of
|
769 |
|
|
hardware supported. These are described in .
|
770 |
|
|
|
771 |
|
|
|
772 |
|
|
|
773 |
|
|
The following sections describe the changes that have been made to the
|
774 |
|
|
eCos kernel to support SMP operation.
|
775 |
|
|
|
776 |
|
|
|
777 |
|
|
|
778 |
|
|
|
779 |
|
|
System Startup
|
780 |
|
|
|
781 |
|
|
The system startup sequence needs to be somewhat different on an SMP
|
782 |
|
|
system, although this is largely transparent to application code. The
|
783 |
|
|
main startup takes place on only one CPU, called the primary CPU. All
|
784 |
|
|
other CPUs, the secondary CPUs, are either placed in suspended state
|
785 |
|
|
at reset, or are captured by the HAL and put into a spin as they start
|
786 |
|
|
up. The primary CPU is responsible for copying the DATA segment and
|
787 |
|
|
zeroing the BSS (if required), calling HAL variant and platform
|
788 |
|
|
initialization routines and invoking constructors. It then calls
|
789 |
|
|
cyg_start to enter the application. The
|
790 |
|
|
application may then create extra threads and other objects.
|
791 |
|
|
|
792 |
|
|
|
793 |
|
|
It is only when the application calls
|
794 |
|
|
cyg_scheduler_start that the secondary CPUs are
|
795 |
|
|
initialized. This routine scans the list of available secondary CPUs
|
796 |
|
|
and invokes HAL_SMP_CPU_START to start each
|
797 |
|
|
CPU. Finally it calls an internal function
|
798 |
|
|
Cyg_Scheduler::start_cpu to enter the scheduler
|
799 |
|
|
for the primary CPU.
|
800 |
|
|
|
801 |
|
|
|
802 |
|
|
Each secondary CPU starts in the HAL, where it completes any per-CPU
|
803 |
|
|
initialization before calling into the kernel at
|
804 |
|
|
cyg_kernel_cpu_startup. Here it claims the
|
805 |
|
|
scheduler lock and calls
|
806 |
|
|
Cyg_Scheduler::start_cpu.
|
807 |
|
|
|
808 |
|
|
|
809 |
|
|
Cyg_Scheduler::start_cpu is common to both the
|
810 |
|
|
primary and secondary CPUs. The first thing this code does is to
|
811 |
|
|
install an interrupt object for this CPU's inter-CPU interrupt. From
|
812 |
|
|
this point on the code is the same as for the single CPU case: an
|
813 |
|
|
initial thread is chosen and entered.
|
814 |
|
|
|
815 |
|
|
|
816 |
|
|
From this point on the CPUs are all equal, eCos makes no further
|
817 |
|
|
distinction between the primary and secondary CPUs. However, the
|
818 |
|
|
hardware may still distinguish between them as far as interrupt
|
819 |
|
|
delivery is concerned.
|
820 |
|
|
|
821 |
|
|
|
822 |
|
|
|
823 |
|
|
|
824 |
|
|
Scheduling
|
825 |
|
|
|
826 |
|
|
To function correctly an operating system kernel must protect its
|
827 |
|
|
vital data structures, such as the run queues, from concurrent
|
828 |
|
|
access. In a single CPU system the only concurrent activities to worry
|
829 |
|
|
about are asynchronous interrupts. The kernel can easily guard its
|
830 |
|
|
data structures against these by disabling interrupts. However, in a
|
831 |
|
|
multi-CPU system, this is inadequate since it does not block access by
|
832 |
|
|
other CPUs.
|
833 |
|
|
|
834 |
|
|
|
835 |
|
|
The eCos kernel protects its vital data structures using the scheduler
|
836 |
|
|
lock. In single CPU systems this is a simple counter that is
|
837 |
|
|
atomically incremented to acquire the lock and decremented to release
|
838 |
|
|
it. If the lock is decremented to zero then the scheduler may be
|
839 |
|
|
invoked to choose a different thread to run. Because interrupts may
|
840 |
|
|
continue to be serviced while the scheduler lock is claimed, ISRs are
|
841 |
|
|
not allowed to access kernel data structures, or call kernel routines
|
842 |
|
|
that can. Instead all such operations are deferred to an associated
|
843 |
|
|
DSR routine that is run during the lock release operation, when the
|
844 |
|
|
data structures are in a consistent state.
|
845 |
|
|
|
846 |
|
|
|
847 |
|
|
By choosing a kernel locking mechanism that does not rely on interrupt
|
848 |
|
|
manipulation to protect data structures, it is easier to convert eCos
|
849 |
|
|
to SMP than would otherwise be the case. The principal change needed to
|
850 |
|
|
make eCos SMP-safe is to convert the scheduler lock into a nestable
|
851 |
|
|
spin lock. This is done by adding a spinlock and a CPU id to the
|
852 |
|
|
original counter.
|
853 |
|
|
|
854 |
|
|
|
855 |
|
|
The algorithm for acquiring the scheduler lock is very simple. If the
|
856 |
|
|
scheduler lock's CPU id matches the current CPU then it can just increment
|
857 |
|
|
the counter and continue. If it does not match, the CPU must spin on
|
858 |
|
|
the spinlock, after which it may increment the counter and store its
|
859 |
|
|
own identity in the CPU id.
|
860 |
|
|
|
861 |
|
|
|
862 |
|
|
To release the lock, the counter is decremented. If it goes to zero
|
863 |
|
|
the CPU id value must be set to NONE and the spinlock cleared.
|
864 |
|
|
|
865 |
|
|
|
866 |
|
|
To protect these sequences against interrupts, they must be performed
|
867 |
|
|
with interrupts disabled. However, since these are very short code
|
868 |
|
|
sequences, they will not have an adverse effect on the interrupt
|
869 |
|
|
latency.
|
870 |
|
|
|
871 |
|
|
|
872 |
|
|
Beyond converting the scheduler lock, further preparing the kernel for
|
873 |
|
|
SMP is a relatively minor matter. The main changes are to convert
|
874 |
|
|
various scalar housekeeping variables into arrays indexed by CPU
|
875 |
|
|
id. These include the current thread pointer, the need_reschedule
|
876 |
|
|
flag and the timeslice counter.
|
877 |
|
|
|
878 |
|
|
|
879 |
|
|
At present only the Multi-Level Queue (MLQ) scheduler is capable of
|
880 |
|
|
supporting SMP configurations. The main change made to this scheduler
|
881 |
|
|
is to cope with having several threads in execution at the same
|
882 |
|
|
time. Running threads are marked with the CPU that they are executing on.
|
883 |
|
|
When scheduling a thread, the scheduler skips past any running threads
|
884 |
|
|
until it finds a thread that is pending. While not a constant-time
|
885 |
|
|
algorithm, as in the single CPU case, this is still deterministic,
|
886 |
|
|
since the worst case time is bounded by the number of CPUs in the
|
887 |
|
|
system.
|
888 |
|
|
|
889 |
|
|
|
890 |
|
|
A second change to the scheduler is in the code used to decide when
|
891 |
|
|
the scheduler should be called to choose a new thread. The scheduler
|
892 |
|
|
attempts to keep the n CPUs running the
|
893 |
|
|
n highest priority threads. Since an event or
|
894 |
|
|
interrupt on one CPU may require a reschedule on another CPU, there
|
895 |
|
|
must be a mechanism for deciding this. The algorithm currently
|
896 |
|
|
implemented is very simple. Given a thread that has just been awakened
|
897 |
|
|
(or had its priority changed), the scheduler scans the CPUs, starting
|
898 |
|
|
with the one it is currently running on, for a current thread that is
|
899 |
|
|
of lower priority than the new one. If one is found then a reschedule
|
900 |
|
|
interrupt is sent to that CPU and the scan continues, but now using
|
901 |
|
|
the current thread of the rescheduled CPU as the candidate thread. In
|
902 |
|
|
this way the new thread gets to run as quickly as possible, hopefully
|
903 |
|
|
on the current CPU, and the remaining CPUs will pick up the remaining
|
904 |
|
|
highest priority threads as a consequence of processing the reschedule
|
905 |
|
|
interrupt.
|
906 |
|
|
|
907 |
|
|
|
908 |
|
|
The final change to the scheduler is in the handling of
|
909 |
|
|
timeslicing. Only one CPU receives timer interrupts, although all CPUs
|
910 |
|
|
must handle timeslicing. To make this work, the CPU that receives the
|
911 |
|
|
timer interrupt decrements the timeslice counter for all CPUs, not
|
912 |
|
|
just its own. If the counter for a CPU reaches zero, then it sends a
|
913 |
|
|
timeslice interrupt to that CPU. On receiving the interrupt the
|
914 |
|
|
destination CPU enters the scheduler and looks for another thread at
|
915 |
|
|
the same priority to run. This is somewhat more efficient than
|
916 |
|
|
distributing clock ticks to all CPUs, since the interrupt is only
|
917 |
|
|
needed when a timeslice occurs.
|
918 |
|
|
|
919 |
|
|
|
920 |
|
|
All existing synchronization mechanisms work as before in an SMP
|
921 |
|
|
system. Additional synchronization mechanisms have been added to
|
922 |
|
|
provide explicit synchronization for SMP, in the form of
|
923 |
|
|
spinlocks.
|
924 |
|
|
|
925 |
|
|
|
926 |
|
|
|
927 |
|
|
|
928 |
|
|
SMP Interrupt Handling
|
929 |
|
|
|
930 |
|
|
The main area where the SMP nature of a system requires special
|
931 |
|
|
attention is in device drivers and especially interrupt handling. It
|
932 |
|
|
is quite possible for the ISR, DSR and thread components of a device
|
933 |
|
|
driver to execute on different CPUs. For this reason it is much more
|
934 |
|
|
important that SMP-capable device drivers use the interrupt-related
|
935 |
|
|
functions correctly. Typically a device driver would use the driver
|
936 |
|
|
API rather than call the kernel directly, but it is unlikely that
|
937 |
|
|
anybody would attempt to use a multiprocessor system without the
|
938 |
|
|
kernel package.
|
939 |
|
|
|
940 |
|
|
|
941 |
|
|
Two new functions have been added to the Kernel API
|
942 |
|
|
to do interrupt
|
943 |
|
|
routing: cyg_interrupt_set_cpu and
|
944 |
|
|
cyg_interrupt_get_cpu. Although not currently
|
945 |
|
|
supported, special values for the cpu argument may be used in future
|
946 |
|
|
to indicate that the interrupt is being routed dynamically or is
|
947 |
|
|
CPU-local. Once a vector has been routed to a new CPU, all other
|
948 |
|
|
interrupt masking and configuration operations are relative to that
|
949 |
|
|
CPU, where relevant.
|
950 |
|
|
|
951 |
|
|
|
952 |
|
|
|
953 |
|
|
There are more details of how interrupts should be handled in SMP
|
954 |
|
|
systems in .
|
955 |
|
|
|
956 |
|
|
|
957 |
|
|
|
958 |
|
|
|
959 |
|
|
|
960 |
|
|
|
961 |
|
|
|
962 |
|
|
|
963 |
|
|
|
964 |
|
|
|
965 |
|
|
|
966 |
|
|
|
967 |
|
|
Thread creation
|
968 |
|
|
|
969 |
|
|
|
970 |
|
|
|
971 |
|
|
cyg_thread_create
|
972 |
|
|
Create a new thread
|
973 |
|
|
|
974 |
|
|
|
975 |
|
|
|
976 |
|
|
|
977 |
|
|
|
978 |
|
|
#include <cyg/kernel/kapi.h>
|
979 |
|
|
|
980 |
|
|
|
981 |
|
|
void cyg_thread_create
|
982 |
|
|
cyg_addrword_t sched_info
|
983 |
|
|
cyg_thread_entry_t* entry
|
984 |
|
|
cyg_addrword_t entry_data
|
985 |
|
|
char* name
|
986 |
|
|
void* stack_base
|
987 |
|
|
cyg_ucount32 stack_size
|
988 |
|
|
cyg_handle_t* handle
|
989 |
|
|
cyg_thread* thread
|
990 |
|
|
|
991 |
|
|
|
992 |
|
|
|
993 |
|
|
|
994 |
|
|
Description
|
995 |
|
|
|
996 |
|
|
The cyg_thread_create function allows application
|
997 |
|
|
code and eCos packages to create new threads. In many applications
|
998 |
|
|
this only happens during system initialization and all required data
|
999 |
|
|
is allocated statically. However additional threads can be created at
|
1000 |
|
|
any time, if necessary. A newly created thread is always in suspended
|
1001 |
|
|
state and will not start running until it has been resumed via a call
|
1002 |
|
|
to cyg_thread_resume. Also, if threads are
|
1003 |
|
|
created during system initialization then they will not start running
|
1004 |
|
|
until the eCos scheduler has been started.
|
1005 |
|
|
|
1006 |
|
|
|
1007 |
|
|
The name argument is used
|
1008 |
|
|
primarily for debugging purposes, making it easier to keep track of
|
1009 |
|
|
which cyg_thread structure is associated with
|
1010 |
|
|
which application-level thread. The kernel configuration option
|
1011 |
|
|
CYGVAR_KERNEL_THREADS_NAME controls whether or not
|
1012 |
|
|
this name is actually used.
|
1013 |
|
|
|
1014 |
|
|
|
1015 |
|
|
On creation each thread is assigned a unique handle, and this will be
|
1016 |
|
|
stored in the location pointed at by the
|
1017 |
|
|
class="function">handle argument. Subsequent operations on
|
1018 |
|
|
this thread including the required
|
1019 |
|
|
cyg_thread_resume should use this handle to
|
1020 |
|
|
identify the thread.
|
1021 |
|
|
|
1022 |
|
|
|
1023 |
|
|
The kernel requires a small amount of space for each thread, in the
|
1024 |
|
|
form of a cyg_thread data structure, to hold
|
1025 |
|
|
information such as the current state of that thread. To avoid any
|
1026 |
|
|
need for dynamic memory allocation within the kernel this space has to
|
1027 |
|
|
be provided by higher-level code, typically in the form of a static
|
1028 |
|
|
variable. The thread argument
|
1029 |
|
|
provides this space.
|
1030 |
|
|
|
1031 |
|
|
|
1032 |
|
|
|
1033 |
|
|
Thread Entry Point
|
1034 |
|
|
|
1035 |
|
|
The entry point for a thread takes the form:
|
1036 |
|
|
|
1037 |
|
|
|
1038 |
|
|
void
|
1039 |
|
|
thread_entry_function(cyg_addrword_t data)
|
1040 |
|
|
{
|
1041 |
|
|
…
|
1042 |
|
|
}
|
1043 |
|
|
|
1044 |
|
|
|
1045 |
|
|
The second argument to cyg_thread_create is a
|
1046 |
|
|
pointer to such a function. The third argument
|
1047 |
|
|
class="function">entry_data is used to pass additional
|
1048 |
|
|
data to the function. Typically this takes the form of a pointer to
|
1049 |
|
|
some static data, or a small integer, or 0 if the
|
1050 |
|
|
thread does not require any additional data.
|
1051 |
|
|
|
1052 |
|
|
|
1053 |
|
|
If the thread entry function ever returns then this is equivalent to
|
1054 |
|
|
the thread calling cyg_thread_exit. Even though
|
1055 |
|
|
the thread will no longer run again, it remains registered with the
|
1056 |
|
|
scheduler. If the application needs to re-use the
|
1057 |
|
|
cyg_thread data structure then a call to
|
1058 |
|
|
cyg_thread_delete is required first.
|
1059 |
|
|
|
1060 |
|
|
|
1061 |
|
|
|
1062 |
|
|
Thread Priorities
|
1063 |
|
|
|
1064 |
|
|
The sched_info argument
|
1065 |
|
|
provides additional information to the scheduler. The exact details
|
1066 |
|
|
depend on the scheduler being used. For the bitmap and mlqueue
|
1067 |
|
|
schedulers it is a small integer, typically in the range 0 to 31, with
|
1068 |
|
|
|
1069 |
|
|
only by the system's idle thread. The exact number of priorities is
|
1070 |
|
|
controlled by the kernel configuration option
|
1071 |
|
|
CYGNUM_KERNEL_SCHED_PRIORITIES.
|
1072 |
|
|
|
1073 |
|
|
|
1074 |
|
|
It is the responsibility of the application developer to be aware of
|
1075 |
|
|
the various threads in the system, including those created by eCos
|
1076 |
|
|
packages, and to ensure that all threads run at suitable priorities.
|
1077 |
|
|
For threads created by other packages the documentation provided by
|
1078 |
|
|
those packages should indicate any requirements.
|
1079 |
|
|
|
1080 |
|
|
|
1081 |
|
|
The functions cyg_thread_set_priority,
|
1082 |
|
|
cyg_thread_get_priority, and
|
1083 |
|
|
cyg_thread_get_current_priority can be used to
|
1084 |
|
|
manipulate a thread's priority.
|
1085 |
|
|
|
1086 |
|
|
|
1087 |
|
|
|
1088 |
|
|
Stacks and Stack Sizes
|
1089 |
|
|
|
1090 |
|
|
Each thread needs its own stack for local variables and to keep track
|
1091 |
|
|
of function calls and returns. Again it is expected that this stack is
|
1092 |
|
|
provided by the calling code, usually in the form of static data, so
|
1093 |
|
|
that the kernel does not need any dynamic memory allocation
|
1094 |
|
|
facilities. cyg_thread_create takes two arguments
|
1095 |
|
|
related to the stack, a pointer to the base of the stack and the total
|
1096 |
|
|
size of this stack. On many processors stacks actually descend from the
|
1097 |
|
|
top down, so the kernel will add the stack size to the base address to
|
1098 |
|
|
determine the starting location.
|
1099 |
|
|
|
1100 |
|
|
|
1101 |
|
|
The exact stack size requirements for any given thread depend on a
|
1102 |
|
|
number of factors. The most important is of course the code that will
|
1103 |
|
|
be executed in the context of this code: if this involves significant
|
1104 |
|
|
nesting of function calls, recursion, or large local arrays, then the
|
1105 |
|
|
stack size needs to be set to a suitably high value. There are some
|
1106 |
|
|
architectural issues, for example the number of cpu registers and the
|
1107 |
|
|
calling conventions will have some effect on stack usage. Also,
|
1108 |
|
|
depending on the configuration, it is possible that some other code
|
1109 |
|
|
such as interrupt handlers will occasionally run on the current
|
1110 |
|
|
thread's stack. This depends in part on configuration options such as
|
1111 |
|
|
CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
|
1112 |
|
|
and CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING.
|
1113 |
|
|
|
1114 |
|
|
|
1115 |
|
|
Determining an application's actual stack size requirements is the
|
1116 |
|
|
responsibility of the application developer, since the kernel cannot
|
1117 |
|
|
know in advance what code a given thread will run. However, the system
|
1118 |
|
|
does provide some hints about reasonable stack sizes in the form of
|
1119 |
|
|
two constants: CYGNUM_HAL_STACK_SIZE_MINIMUM and
|
1120 |
|
|
CYGNUM_HAL_STACK_SIZE_TYPICAL. These are defined by
|
1121 |
|
|
the appropriate HAL package. The MINIMUM value is
|
1122 |
|
|
appropriate for a thread that just runs a single function and makes
|
1123 |
|
|
very simple system calls. Trying to create a thread with a smaller
|
1124 |
|
|
stack than this is illegal. The TYPICAL value is
|
1125 |
|
|
appropriate for applications where application calls are nested no
|
1126 |
|
|
more than half a dozen or so levels, and there are no large arrays on
|
1127 |
|
|
the stack.
|
1128 |
|
|
|
1129 |
|
|
|
1130 |
|
|
If the stack sizes are not estimated correctly and a stack overflow
|
1131 |
|
|
occurs, the probably result is some form of memory corruption. This
|
1132 |
|
|
can be very hard to track down. The kernel does contain some code to
|
1133 |
|
|
help detect stack overflows, controlled by the configuration option
|
1134 |
|
|
CYGFUN_KERNEL_THREADS_STACK_CHECKING: a small
|
1135 |
|
|
amount of space is reserved at the stack limit and filled with a
|
1136 |
|
|
special signature: every time a thread context switch occurs this
|
1137 |
|
|
signature is checked, and if invalid that is a good indication (but
|
1138 |
|
|
not absolute proof) that a stack overflow has occurred. This form of
|
1139 |
|
|
stack checking is enabled by default when the system is built with
|
1140 |
|
|
debugging enabled. A related configuration option is
|
1141 |
|
|
CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT: enabling
|
1142 |
|
|
this option means that a thread can call the function
|
1143 |
|
|
cyg_thread_measure_stack_usage to find out the
|
1144 |
|
|
maximum stack usage to date. Note that this is not necessarily the
|
1145 |
|
|
true maximum because, for example, it is possible that in the current
|
1146 |
|
|
run no interrupt occurred at the worst possible moment.
|
1147 |
|
|
|
1148 |
|
|
|
1149 |
|
|
|
1150 |
|
|
Valid contexts
|
1151 |
|
|
|
1152 |
|
|
cyg_thread_create may be called during
|
1153 |
|
|
initialization and from within thread context. It may not be called
|
1154 |
|
|
from inside a DSR.
|
1155 |
|
|
|
1156 |
|
|
|
1157 |
|
|
|
1158 |
|
|
Example
|
1159 |
|
|
|
1160 |
|
|
A simple example of thread creation is shown below. This involves
|
1161 |
|
|
creating five threads, one producer and four consumers or workers. The
|
1162 |
|
|
threads are created in the system's
|
1163 |
|
|
cyg_user_start: depending on the configuration it
|
1164 |
|
|
might be more appropriate to do this elsewhere, for example inside
|
1165 |
|
|
main.
|
1166 |
|
|
|
1167 |
|
|
|
1168 |
|
|
#include <cyg/hal/hal_arch.h>
|
1169 |
|
|
#include <cyg/kernel/kapi.h>
|
1170 |
|
|
|
1171 |
|
|
// These numbers depend entirely on your application
|
1172 |
|
|
#define NUMBER_OF_WORKERS 4
|
1173 |
|
|
#define PRODUCER_PRIORITY 10
|
1174 |
|
|
#define WORKER_PRIORITY 11
|
1175 |
|
|
#define PRODUCER_STACKSIZE CYGNUM_HAL_STACK_SIZE_TYPICAL
|
1176 |
|
|
#define WORKER_STACKSIZE (CYGNUM_HAL_STACK_SIZE_MINIMUM + 1024)
|
1177 |
|
|
|
1178 |
|
|
static unsigned char producer_stack[PRODUCER_STACKSIZE];
|
1179 |
|
|
static unsigned char worker_stacks[NUMBER_OF_WORKERS][WORKER_STACKSIZE];
|
1180 |
|
|
static cyg_handle_t producer_handle, worker_handles[NUMBER_OF_WORKERS];
|
1181 |
|
|
static cyg_thread_t producer_thread, worker_threads[NUMBER_OF_WORKERS];
|
1182 |
|
|
|
1183 |
|
|
static void
|
1184 |
|
|
producer(cyg_addrword_t data)
|
1185 |
|
|
{
|
1186 |
|
|
…
|
1187 |
|
|
}
|
1188 |
|
|
|
1189 |
|
|
static void
|
1190 |
|
|
worker(cyg_addrword_t data)
|
1191 |
|
|
{
|
1192 |
|
|
…
|
1193 |
|
|
}
|
1194 |
|
|
|
1195 |
|
|
void
|
1196 |
|
|
cyg_user_start(void)
|
1197 |
|
|
{
|
1198 |
|
|
int i;
|
1199 |
|
|
|
1200 |
|
|
cyg_thread_create(PRODUCER_PRIORITY, &producer, 0, "producer",
|
1201 |
|
|
producer_stack, PRODUCER_STACKSIZE,
|
1202 |
|
|
&producer_handle, &producer_thread);
|
1203 |
|
|
cyg_thread_resume(producer_handle);
|
1204 |
|
|
for (i = 0; i < NUMBER_OF_WORKERS; i++) {
|
1205 |
|
|
cyg_thread_create(WORKER_PRIORITY, &worker, i, "worker",
|
1206 |
|
|
worker_stacks[i], WORKER_STACKSIZE,
|
1207 |
|
|
&(worker_handles[i]), &(worker_threads[i]));
|
1208 |
|
|
cyg_thread_resume(worker_handles[i]);
|
1209 |
|
|
}
|
1210 |
|
|
}
|
1211 |
|
|
|
1212 |
|
|
|
1213 |
|
|
|
1214 |
|
|
|
1215 |
|
|
Thread Entry Points and C++
|
1216 |
|
|
|
1217 |
|
|
For code written in C++ the thread entry function must be either a
|
1218 |
|
|
static member function of a class or an ordinary function outside any
|
1219 |
|
|
class. It cannot be a normal member function of a class because such
|
1220 |
|
|
member functions take an implicit additional argument
|
1221 |
|
|
this, and the kernel has no way of knowing what
|
1222 |
|
|
value to use for this argument. One way around this problem is to make
|
1223 |
|
|
use of a special static member function, for example:
|
1224 |
|
|
|
1225 |
|
|
|
1226 |
|
|
class fred {
|
1227 |
|
|
public:
|
1228 |
|
|
void thread_function();
|
1229 |
|
|
static void static_thread_aux(cyg_addrword_t);
|
1230 |
|
|
};
|
1231 |
|
|
|
1232 |
|
|
void
|
1233 |
|
|
fred::static_thread_aux(cyg_addrword_t objptr)
|
1234 |
|
|
{
|
1235 |
|
|
fred* object = static_cast<fred*>(objptr);
|
1236 |
|
|
object->thread_function();
|
1237 |
|
|
}
|
1238 |
|
|
|
1239 |
|
|
static fred instance;
|
1240 |
|
|
|
1241 |
|
|
extern "C" void
|
1242 |
|
|
cyg_start( void )
|
1243 |
|
|
{
|
1244 |
|
|
…
|
1245 |
|
|
cyg_thread_create( …,
|
1246 |
|
|
&fred::static_thread_aux,
|
1247 |
|
|
static_cast<cyg_addrword_t>(&instance),
|
1248 |
|
|
…);
|
1249 |
|
|
…
|
1250 |
|
|
}
|
1251 |
|
|
|
1252 |
|
|
|
1253 |
|
|
Effectively this uses the
|
1254 |
|
|
class="function">entry_data argument to
|
1255 |
|
|
cyg_thread_create to hold the
|
1256 |
|
|
this pointer. Unfortunately this approach does
|
1257 |
|
|
require the use of some C++ casts, so some of the type safety that can
|
1258 |
|
|
be achieved when programming in C++ is lost.
|
1259 |
|
|
|
1260 |
|
|
|
1261 |
|
|
|
1262 |
|
|
|
1263 |
|
|
|
1264 |
|
|
|
1265 |
|
|
|
1266 |
|
|
|
1267 |
|
|
|
1268 |
|
|
|
1269 |
|
|
|
1270 |
|
|
Thread information
|
1271 |
|
|
|
1272 |
|
|
|
1273 |
|
|
|
1274 |
|
|
cyg_thread_self
|
1275 |
|
|
cyg_thread_idle_thread
|
1276 |
|
|
cyg_thread_get_stack_base
|
1277 |
|
|
cyg_thread_get_stack_size
|
1278 |
|
|
cyg_thread_measure_stack_usage
|
1279 |
|
|
cyg_thread_get_next
|
1280 |
|
|
cyg_thread_get_info
|
1281 |
|
|
cyg_thread_find
|
1282 |
|
|
Get basic thread information
|
1283 |
|
|
|
1284 |
|
|
|
1285 |
|
|
|
1286 |
|
|
|
1287 |
|
|
|
1288 |
|
|
#include <cyg/kernel/kapi.h>
|
1289 |
|
|
|
1290 |
|
|
|
1291 |
|
|
cyg_handle_t cyg_thread_self
|
1292 |
|
|
|
1293 |
|
|
|
1294 |
|
|
|
1295 |
|
|
cyg_handle_t cyg_thread_idle_thread
|
1296 |
|
|
|
1297 |
|
|
|
1298 |
|
|
|
1299 |
|
|
cyg_addrword_t cyg_thread_get_stack_base
|
1300 |
|
|
cyg_handle_t thread
|
1301 |
|
|
|
1302 |
|
|
|
1303 |
|
|
cyg_uint32 cyg_thread_get_stack_size
|
1304 |
|
|
cyg_handle_t thread
|
1305 |
|
|
|
1306 |
|
|
|
1307 |
|
|
cyg_uint32 cyg_thread_measure_stack_usage
|
1308 |
|
|
cyg_handle_t thread
|
1309 |
|
|
|
1310 |
|
|
|
1311 |
|
|
cyg_bool cyg_thread_get_next
|
1312 |
|
|
cyg_handle_t *thread
|
1313 |
|
|
cyg_uint16 *id
|
1314 |
|
|
|
1315 |
|
|
|
1316 |
|
|
cyg_bool cyg_thread_get_info
|
1317 |
|
|
cyg_handle_t thread
|
1318 |
|
|
cyg_uint16 id
|
1319 |
|
|
cyg_thread_info *info
|
1320 |
|
|
|
1321 |
|
|
|
1322 |
|
|
cyg_handle_t cyg_thread_find
|
1323 |
|
|
cyg_uint16 id
|
1324 |
|
|
|
1325 |
|
|
|
1326 |
|
|
|
1327 |
|
|
|
1328 |
|
|
Description
|
1329 |
|
|
|
1330 |
|
|
These functions can be used to obtain some basic information about
|
1331 |
|
|
various threads in the system. Typically they serve little or no
|
1332 |
|
|
purpose in real applications, but they can be useful during debugging.
|
1333 |
|
|
|
1334 |
|
|
|
1335 |
|
|
cyg_thread_self returns a handle corresponding
|
1336 |
|
|
to the current thread. It will be the same as the value filled in by
|
1337 |
|
|
cyg_thread_create when the current thread was
|
1338 |
|
|
created. This handle can then be passed to other functions such as
|
1339 |
|
|
cyg_thread_get_priority.
|
1340 |
|
|
|
1341 |
|
|
|
1342 |
|
|
cyg_thread_idle_thread returns the handle
|
1343 |
|
|
corresponding to the idle thread. This thread is created automatically
|
1344 |
|
|
by the kernel, so application-code has no other way of getting hold of
|
1345 |
|
|
this information.
|
1346 |
|
|
|
1347 |
|
|
|
1348 |
|
|
cyg_thread_get_stack_base and
|
1349 |
|
|
cyg_thread_get_stack_size return information
|
1350 |
|
|
about a specific thread's stack. The values returned will match the
|
1351 |
|
|
values passed to cyg_thread_create when this
|
1352 |
|
|
thread was created.
|
1353 |
|
|
|
1354 |
|
|
|
1355 |
|
|
cyg_thread_measure_stack_usage is only available
|
1356 |
|
|
if the configuration option
|
1357 |
|
|
CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT is enabled.
|
1358 |
|
|
The return value is the maximum number of bytes of stack space used so
|
1359 |
|
|
far by the specified thread. Note that this should not be considered a
|
1360 |
|
|
true upper bound, for example it is possible that in the current test
|
1361 |
|
|
run the specified thread has not yet been interrupted at the deepest
|
1362 |
|
|
point in the function call graph. Never the less the value returned
|
1363 |
|
|
can give some useful indication of the thread's stack requirements.
|
1364 |
|
|
|
1365 |
|
|
|
1366 |
|
|
cyg_thread_get_next is used to enumerate all the
|
1367 |
|
|
current threads in the system. It should be called initially with the
|
1368 |
|
|
locations pointed to by thread and
|
1369 |
|
|
id set to zero. On return these will be set to
|
1370 |
|
|
the handle and ID of the first thread. On subsequent calls, these
|
1371 |
|
|
parameters should be left set to the values returned by the previous
|
1372 |
|
|
call. The handle and ID of the next thread in the system will be
|
1373 |
|
|
installed each time, until a false return value
|
1374 |
|
|
indicates the end of the list.
|
1375 |
|
|
|
1376 |
|
|
|
1377 |
|
|
cyg_thread_get_info fills in the
|
1378 |
|
|
cyg_thread_info structure with information about the
|
1379 |
|
|
thread described by the thread and
|
1380 |
|
|
id arguments. The information returned includes
|
1381 |
|
|
the thread's handle and id, its state and name, priorities and stack
|
1382 |
|
|
parameters. If the thread does not exist the function returns
|
1383 |
|
|
false.
|
1384 |
|
|
|
1385 |
|
|
|
1386 |
|
|
The cyg_thread_info structure is defined as follows by
|
1387 |
|
|
<>, but may
|
1388 |
|
|
be extended in future with additional members, and so its size should
|
1389 |
|
|
not be relied upon:
|
1390 |
|
|
|
1391 |
|
|
typedef struct
|
1392 |
|
|
{
|
1393 |
|
|
cyg_handle_t handle;
|
1394 |
|
|
cyg_uint16 id;
|
1395 |
|
|
cyg_uint32 state;
|
1396 |
|
|
char *name;
|
1397 |
|
|
cyg_priority_t set_pri;
|
1398 |
|
|
cyg_priority_t cur_pri;
|
1399 |
|
|
cyg_addrword_t stack_base;
|
1400 |
|
|
cyg_uint32 stack_size;
|
1401 |
|
|
cyg_uint32 stack_used;
|
1402 |
|
|
} cyg_thread_info;
|
1403 |
|
|
|
1404 |
|
|
|
1405 |
|
|
|
1406 |
|
|
cyg_thread_find returns a handle for the thread
|
1407 |
|
|
whose ID is id. If no such thread exists, a
|
1408 |
|
|
zero handle is returned.
|
1409 |
|
|
|
1410 |
|
|
|
1411 |
|
|
|
1412 |
|
|
Valid contexts
|
1413 |
|
|
|
1414 |
|
|
cyg_thread_self may only be called from thread
|
1415 |
|
|
context. cyg_thread_idle_thread may be called
|
1416 |
|
|
from thread or DSR context, but only after the system has been
|
1417 |
|
|
initialized. cyg_thread_get_stack_base,
|
1418 |
|
|
cyg_thread_get_stack_size and
|
1419 |
|
|
cyg_thread_measure_stack_usage may be called
|
1420 |
|
|
any time after the specified thread has been created, but measuring
|
1421 |
|
|
stack usage involves looping over at least part of the thread's stack
|
1422 |
|
|
so this should normally only be done from thread context.
|
1423 |
|
|
|
1424 |
|
|
|
1425 |
|
|
|
1426 |
|
|
Examples
|
1427 |
|
|
|
1428 |
|
|
A simple example of the use of the
|
1429 |
|
|
cyg_thread_get_next and
|
1430 |
|
|
cyg_thread_get_info follows:
|
1431 |
|
|
|
1432 |
|
|
|
1433 |
|
|
|
1434 |
|
|
#include <cyg/kernel/kapi.h>
|
1435 |
|
|
#include <stdio.h>
|
1436 |
|
|
|
1437 |
|
|
void show_threads(void)
|
1438 |
|
|
{
|
1439 |
|
|
cyg_handle_t thread = 0;
|
1440 |
|
|
cyg_uint16 id = 0;
|
1441 |
|
|
|
1442 |
|
|
while( cyg_thread_get_next( &thread, &id ) )
|
1443 |
|
|
{
|
1444 |
|
|
cyg_thread_info info;
|
1445 |
|
|
|
1446 |
|
|
if( !cyg_thread_get_info( thread, id, &info ) )
|
1447 |
|
|
break;
|
1448 |
|
|
|
1449 |
|
|
printf("ID: %04x name: %10s pri: %d\n",
|
1450 |
|
|
info.id, info.name?info.name:"----", info.set_pri );
|
1451 |
|
|
}
|
1452 |
|
|
}
|
1453 |
|
|
|
1454 |
|
|
|
1455 |
|
|
|
1456 |
|
|
|
1457 |
|
|
|
1458 |
|
|
|
1459 |
|
|
|
1460 |
|
|
|
1461 |
|
|
|
1462 |
|
|
|
1463 |
|
|
|
1464 |
|
|
|
1465 |
|
|
Thread control
|
1466 |
|
|
|
1467 |
|
|
|
1468 |
|
|
|
1469 |
|
|
cyg_thread_yield
|
1470 |
|
|
cyg_thread_delay
|
1471 |
|
|
cyg_thread_suspend
|
1472 |
|
|
cyg_thread_resume
|
1473 |
|
|
cyg_thread_release
|
1474 |
|
|
Control whether or not a thread is running
|
1475 |
|
|
|
1476 |
|
|
|
1477 |
|
|
|
1478 |
|
|
|
1479 |
|
|
|
1480 |
|
|
#include <cyg/kernel/kapi.h>
|
1481 |
|
|
|
1482 |
|
|
|
1483 |
|
|
void cyg_thread_yield
|
1484 |
|
|
|
1485 |
|
|
|
1486 |
|
|
|
1487 |
|
|
void cyg_thread_delay
|
1488 |
|
|
cyg_tick_count_t delay
|
1489 |
|
|
|
1490 |
|
|
|
1491 |
|
|
void cyg_thread_suspend
|
1492 |
|
|
cyg_handle_t thread
|
1493 |
|
|
|
1494 |
|
|
|
1495 |
|
|
void cyg_thread_resume
|
1496 |
|
|
cyg_handle_t thread
|
1497 |
|
|
|
1498 |
|
|
|
1499 |
|
|
void cyg_thread_release
|
1500 |
|
|
cyg_handle_t thread
|
1501 |
|
|
|
1502 |
|
|
|
1503 |
|
|
|
1504 |
|
|
|
1505 |
|
|
Description
|
1506 |
|
|
|
1507 |
|
|
These functions provide some control over whether or not a particular
|
1508 |
|
|
thread can run. Apart from the required use of
|
1509 |
|
|
cyg_thread_resume to start a newly-created
|
1510 |
|
|
thread, application code should normally use proper synchronization
|
1511 |
|
|
primitives such as condition variables or mail boxes.
|
1512 |
|
|
|
1513 |
|
|
|
1514 |
|
|
|
1515 |
|
|
Yield
|
1516 |
|
|
|
1517 |
|
|
cyg_thread_yield allows a thread to relinquish
|
1518 |
|
|
control of the processor to some other runnable thread which has the
|
1519 |
|
|
same priority. This can have no effect on any higher-priority thread
|
1520 |
|
|
since, if such a thread were runnable, the current thread would have
|
1521 |
|
|
been preempted in its favour. Similarly it can have no effect on any
|
1522 |
|
|
lower-priority thread because the current thread will always be run in
|
1523 |
|
|
preference to those. As a consequence this function is only useful
|
1524 |
|
|
in configurations with a scheduler that allows multiple threads to run
|
1525 |
|
|
at the same priority, for example the mlqueue scheduler. If instead
|
1526 |
|
|
the bitmap scheduler was being used then
|
1527 |
|
|
cyg_thread_yield() would serve no purpose.
|
1528 |
|
|
|
1529 |
|
|
|
1530 |
|
|
Even if a suitable scheduler such as the mlqueue scheduler has been
|
1531 |
|
|
configured, cyg_thread_yield will still rarely
|
1532 |
|
|
prove useful: instead timeslicing will be used to ensure that all
|
1533 |
|
|
threads of a given priority get a fair slice of the available
|
1534 |
|
|
processor time. However it is possible to disable timeslicing via the
|
1535 |
|
|
configuration option CYGSEM_KERNEL_SCHED_TIMESLICE,
|
1536 |
|
|
in which case cyg_thread_yield can be used to
|
1537 |
|
|
implement a form of cooperative multitasking.
|
1538 |
|
|
|
1539 |
|
|
|
1540 |
|
|
|
1541 |
|
|
Delay
|
1542 |
|
|
|
1543 |
|
|
cyg_thread_delay allows a thread to suspend until
|
1544 |
|
|
the specified number of clock ticks have occurred. For example, if a
|
1545 |
|
|
value of 1 is used and the system clock runs at a frequency of 100Hz
|
1546 |
|
|
then the thread will sleep for up to 10 milliseconds. This
|
1547 |
|
|
functionality depends on the presence of a real-time system clock, as
|
1548 |
|
|
controlled by the configuration option
|
1549 |
|
|
CYGVAR_KERNEL_COUNTERS_CLOCK.
|
1550 |
|
|
|
1551 |
|
|
|
1552 |
|
|
If the application requires delays measured in milliseconds or similar
|
1553 |
|
|
units rather than in clock ticks, some calculations are needed to
|
1554 |
|
|
convert between these units as described in
|
1555 |
|
|
linkend="kernel-clocks">. Usually these calculations can be done by
|
1556 |
|
|
the application developer, or at compile-time. Performing such
|
1557 |
|
|
calculations prior to every call to
|
1558 |
|
|
cyg_thread_delay adds unnecessary overhead to the
|
1559 |
|
|
system.
|
1560 |
|
|
|
1561 |
|
|
|
1562 |
|
|
|
1563 |
|
|
Suspend and Resume
|
1564 |
|
|
|
1565 |
|
|
Associated with each thread is a suspend counter. When a thread is
|
1566 |
|
|
first created this counter is initialized to 1.
|
1567 |
|
|
cyg_thread_suspend can be used to increment the
|
1568 |
|
|
suspend counter, and cyg_thread_resume decrements
|
1569 |
|
|
it. The scheduler will never run a thread with a non-zero suspend
|
1570 |
|
|
counter. Therefore a newly created thread will not run until it has
|
1571 |
|
|
been resumed.
|
1572 |
|
|
|
1573 |
|
|
|
1574 |
|
|
An occasional problem with the use of suspend and resume functionality
|
1575 |
|
|
is that a thread gets suspended more times than it is resumed and
|
1576 |
|
|
hence never becomes runnable again. This can lead to very confusing
|
1577 |
|
|
behaviour. To help with debugging such problems the kernel provides a
|
1578 |
|
|
configuration option
|
1579 |
|
|
CYGNUM_KERNEL_MAX_SUSPEND_COUNT_ASSERT which
|
1580 |
|
|
imposes an upper bound on the number of suspend calls without matching
|
1581 |
|
|
resumes, with a reasonable default value. This functionality depends
|
1582 |
|
|
on infrastructure assertions being enabled.
|
1583 |
|
|
|
1584 |
|
|
|
1585 |
|
|
|
1586 |
|
|
Releasing a Blocked Thread
|
1587 |
|
|
|
1588 |
|
|
When a thread is blocked on a synchronization primitive such as a
|
1589 |
|
|
semaphore or a mutex, or when it is waiting for an alarm to trigger,
|
1590 |
|
|
it can be forcibly woken up using
|
1591 |
|
|
cyg_thread_release. Typically this will call the
|
1592 |
|
|
affected synchronization primitive to return false, indicating that
|
1593 |
|
|
the operation was not completed successfully. This function has to be
|
1594 |
|
|
used with great care, and in particular it should only be used on
|
1595 |
|
|
threads that have been designed appropriately and check all return
|
1596 |
|
|
codes. If instead it were to be used on, say, an arbitrary thread that
|
1597 |
|
|
is attempting to claim a mutex then that thread might not bother to
|
1598 |
|
|
check the result of the mutex lock operation - usually there would be
|
1599 |
|
|
no reason to do so. Therefore the thread will now continue running in
|
1600 |
|
|
the false belief that it has successfully claimed a mutex lock, and
|
1601 |
|
|
the resulting behaviour is undefined. If the system has been built
|
1602 |
|
|
with assertions enabled then it is possible that an assertion will
|
1603 |
|
|
trigger when the thread tries to release the mutex it does not
|
1604 |
|
|
actually own.
|
1605 |
|
|
|
1606 |
|
|
|
1607 |
|
|
The main use of cyg_thread_release is in the
|
1608 |
|
|
POSIX compatibility layer, where it is used in the implementation of
|
1609 |
|
|
per-thread signals and cancellation handlers.
|
1610 |
|
|
|
1611 |
|
|
|
1612 |
|
|
|
1613 |
|
|
Valid contexts
|
1614 |
|
|
|
1615 |
|
|
cyg_thread_yield can only be called from thread
|
1616 |
|
|
context, A DSR must always run to completion and cannot yield the
|
1617 |
|
|
processor to some thread. cyg_thread_suspend,
|
1618 |
|
|
cyg_thread_resume, and
|
1619 |
|
|
cyg_thread_release may be called from thread or
|
1620 |
|
|
DSR context.
|
1621 |
|
|
|
1622 |
|
|
|
1623 |
|
|
|
1624 |
|
|
|
1625 |
|
|
|
1626 |
|
|
|
1627 |
|
|
|
1628 |
|
|
|
1629 |
|
|
|
1630 |
|
|
|
1631 |
|
|
|
1632 |
|
|
Thread termination
|
1633 |
|
|
|
1634 |
|
|
|
1635 |
|
|
|
1636 |
|
|
cyg_thread_exit
|
1637 |
|
|
cyg_thread_kill
|
1638 |
|
|
cyg_thread_delete
|
1639 |
|
|
Allow threads to terminate
|
1640 |
|
|
|
1641 |
|
|
|
1642 |
|
|
|
1643 |
|
|
|
1644 |
|
|
|
1645 |
|
|
#include <cyg/kernel/kapi.h>
|
1646 |
|
|
|
1647 |
|
|
|
1648 |
|
|
void cyg_thread_exit
|
1649 |
|
|
|
1650 |
|
|
|
1651 |
|
|
|
1652 |
|
|
void cyg_thread_kill
|
1653 |
|
|
cyg_handle_t thread
|
1654 |
|
|
|
1655 |
|
|
|
1656 |
|
|
void cyg_thread_delete
|
1657 |
|
|
cyg_handle_t thread
|
1658 |
|
|
|
1659 |
|
|
|
1660 |
|
|
|
1661 |
|
|
|
1662 |
|
|
Description
|
1663 |
|
|
|
1664 |
|
|
In many embedded systems the various threads are allocated statically,
|
1665 |
|
|
created during initialization, and never need to terminate. This
|
1666 |
|
|
avoids any need for dynamic memory allocation or other resource
|
1667 |
|
|
management facilities. However if a given application does have a
|
1668 |
|
|
requirement that some threads be created dynamically, must terminate,
|
1669 |
|
|
and their resources such as the stack be reclaimed, then the kernel
|
1670 |
|
|
provides the functions cyg_thread_exit,
|
1671 |
|
|
cyg_thread_kill, and
|
1672 |
|
|
cyg_thread_delete.
|
1673 |
|
|
|
1674 |
|
|
|
1675 |
|
|
cyg_thread_exit allows a thread to terminate
|
1676 |
|
|
itself, thus ensuring that it will not be run again by the scheduler.
|
1677 |
|
|
However the cyg_thread data structure passed
|
1678 |
|
|
to cyg_thread_create remains in use, and the
|
1679 |
|
|
handle returned by cyg_thread_create remains
|
1680 |
|
|
valid. This allows other threads to perform certain operations on the
|
1681 |
|
|
terminated thread, for example to determine its stack usage via
|
1682 |
|
|
cyg_thread_measure_stack_usage. When the handle
|
1683 |
|
|
and cyg_thread structure are no longer
|
1684 |
|
|
required, cyg_thread_delete should be called to
|
1685 |
|
|
release these resources. If the stack was dynamically allocated then
|
1686 |
|
|
this should not be freed until after the call to
|
1687 |
|
|
cyg_thread_delete.
|
1688 |
|
|
|
1689 |
|
|
|
1690 |
|
|
Alternatively, one thread may use cyg_thread_kill
|
1691 |
|
|
on another This has much the same effect as the affected thread
|
1692 |
|
|
calling cyg_thread_exit. However killing a thread
|
1693 |
|
|
is generally rather dangerous because no attempt is made to unlock any
|
1694 |
|
|
synchronization primitives currently owned by that thread or release
|
1695 |
|
|
any other resources that thread may have claimed. Therefore use of
|
1696 |
|
|
this function should be avoided, and
|
1697 |
|
|
cyg_thread_exit is preferred.
|
1698 |
|
|
cyg_thread_kill cannot be used by a thread to
|
1699 |
|
|
kill itself.
|
1700 |
|
|
|
1701 |
|
|
|
1702 |
|
|
cyg_thread_delete should be used on a thread
|
1703 |
|
|
after it has exited and is no longer required. After this call the
|
1704 |
|
|
thread handle is no longer valid, and both the
|
1705 |
|
|
cyg_thread structure and the thread stack can
|
1706 |
|
|
be re-used or freed. If cyg_thread_delete is
|
1707 |
|
|
invoked on a thread that is still running then there is an implicit
|
1708 |
|
|
call to cyg_thread_kill.
|
1709 |
|
|
|
1710 |
|
|
|
1711 |
|
|
|
1712 |
|
|
Valid contexts
|
1713 |
|
|
|
1714 |
|
|
cyg_thread_exit,
|
1715 |
|
|
cyg_thread_kill and
|
1716 |
|
|
cyg_thread_delete can only be called from thread
|
1717 |
|
|
context.
|
1718 |
|
|
|
1719 |
|
|
|
1720 |
|
|
|
1721 |
|
|
|
1722 |
|
|
|
1723 |
|
|
|
1724 |
|
|
|
1725 |
|
|
|
1726 |
|
|
|
1727 |
|
|
|
1728 |
|
|
|
1729 |
|
|
Thread priorities
|
1730 |
|
|
|
1731 |
|
|
|
1732 |
|
|
|
1733 |
|
|
cyg_thread_get_priority
|
1734 |
|
|
cyg_thread_get_current_priority
|
1735 |
|
|
cyg_thread_set_priority
|
1736 |
|
|
Examine and manipulate thread priorities
|
1737 |
|
|
|
1738 |
|
|
|
1739 |
|
|
|
1740 |
|
|
|
1741 |
|
|
#include <cyg/kernel/kapi.h>
|
1742 |
|
|
|
1743 |
|
|
|
1744 |
|
|
cyg_priority_t cyg_thread_get_priority
|
1745 |
|
|
cyg_handle_t thread
|
1746 |
|
|
|
1747 |
|
|
|
1748 |
|
|
cyg_priority_t cyg_thread_get_current_priority
|
1749 |
|
|
cyg_handle_t thread
|
1750 |
|
|
|
1751 |
|
|
|
1752 |
|
|
void cyg_thread_set_priority
|
1753 |
|
|
cyg_handle_t thread
|
1754 |
|
|
cyg_priority_t priority
|
1755 |
|
|
|
1756 |
|
|
|
1757 |
|
|
|
1758 |
|
|
|
1759 |
|
|
Description
|
1760 |
|
|
|
1761 |
|
|
Typical schedulers use the concept of a thread priority to determine
|
1762 |
|
|
which thread should run next. Exactly what this priority consists of
|
1763 |
|
|
will depend on the scheduler, but a typical implementation would be a
|
1764 |
|
|
small integer in the range 0 to 31, with 0 being the highest priority.
|
1765 |
|
|
Usually only the idle thread will run at the lowest priority. The
|
1766 |
|
|
exact number of priority levels available depends on the
|
1767 |
|
|
configuration, typically the option
|
1768 |
|
|
CYGNUM_KERNEL_SCHED_PRIORITIES.
|
1769 |
|
|
|
1770 |
|
|
|
1771 |
|
|
cyg_thread_get_priority can be used to determine
|
1772 |
|
|
the priority of a thread, or more correctly the value last used in a
|
1773 |
|
|
cyg_thread_set_priority call or when the thread
|
1774 |
|
|
was first created. In some circumstances it is possible that the
|
1775 |
|
|
thread is actually running at a higher priority. For example, if it
|
1776 |
|
|
owns a mutex and priority ceilings or inheritance is being used to
|
1777 |
|
|
prevent priority inversion problems, then the thread's priority may
|
1778 |
|
|
have been boosted temporarily.
|
1779 |
|
|
cyg_thread_get_current_priority returns the real
|
1780 |
|
|
current priority.
|
1781 |
|
|
|
1782 |
|
|
|
1783 |
|
|
In many applications appropriate thread priorities can be determined
|
1784 |
|
|
and allocated statically. However, if it is necessary for a thread's
|
1785 |
|
|
priority to change at run-time then the
|
1786 |
|
|
cyg_thread_set_priority function provides this
|
1787 |
|
|
functionality.
|
1788 |
|
|
|
1789 |
|
|
|
1790 |
|
|
|
1791 |
|
|
Valid contexts
|
1792 |
|
|
|
1793 |
|
|
cyg_thread_get_priority and
|
1794 |
|
|
cyg_thread_get_current_priority can be called
|
1795 |
|
|
from thread or DSR context, although the latter is rarely useful.
|
1796 |
|
|
cyg_thread_set_priority should also only be
|
1797 |
|
|
called from thread context.
|
1798 |
|
|
|
1799 |
|
|
|
1800 |
|
|
|
1801 |
|
|
|
1802 |
|
|
|
1803 |
|
|
|
1804 |
|
|
|
1805 |
|
|
|
1806 |
|
|
|
1807 |
|
|
|
1808 |
|
|
Per-thread data
|
1809 |
|
|
|
1810 |
|
|
|
1811 |
|
|
|
1812 |
|
|
cyg_thread_new_data_index
|
1813 |
|
|
cyg_thread_free_data_index
|
1814 |
|
|
cyg_thread_get_data
|
1815 |
|
|
cyg_thread_get_data_ptr
|
1816 |
|
|
cyg_thread_set_data
|
1817 |
|
|
Manipulate per-thread data
|
1818 |
|
|
|
1819 |
|
|
|
1820 |
|
|
|
1821 |
|
|
|
1822 |
|
|
#include <cyg/kernel/kapi.h>
|
1823 |
|
|
|
1824 |
|
|
|
1825 |
|
|
cyg_ucount32 cyg_thread_new_data_index
|
1826 |
|
|
|
1827 |
|
|
|
1828 |
|
|
|
1829 |
|
|
void cyg_thread_free_data_index
|
1830 |
|
|
cyg_ucount32 index
|
1831 |
|
|
|
1832 |
|
|
|
1833 |
|
|
cyg_addrword_t cyg_thread_get_data
|
1834 |
|
|
cyg_ucount32 index
|
1835 |
|
|
|
1836 |
|
|
|
1837 |
|
|
cyg_addrword_t* cyg_thread_get_data_ptr
|
1838 |
|
|
cyg_ucount32 index
|
1839 |
|
|
|
1840 |
|
|
|
1841 |
|
|
void cyg_thread_set_data
|
1842 |
|
|
cyg_ucount32 index
|
1843 |
|
|
cyg_addrword_t data
|
1844 |
|
|
|
1845 |
|
|
|
1846 |
|
|
|
1847 |
|
|
|
1848 |
|
|
Description
|
1849 |
|
|
|
1850 |
|
|
In some applications and libraries it is useful to have some data that
|
1851 |
|
|
is specific to each thread. For example, many of the functions in the
|
1852 |
|
|
POSIX compatibility package return -1 to indicate an error and store
|
1853 |
|
|
additional information in what appears to be a global variable
|
1854 |
|
|
errno. However, if multiple threads make concurrent
|
1855 |
|
|
calls into the POSIX library and if errno were
|
1856 |
|
|
really a global variable then a thread would have no way of knowing
|
1857 |
|
|
whether the current errno value really corresponded
|
1858 |
|
|
to the last POSIX call it made, or whether some other thread had run
|
1859 |
|
|
in the meantime and made a different POSIX call which updated the
|
1860 |
|
|
variable. To avoid such confusion errno is instead
|
1861 |
|
|
implemented as a per-thread variable, and each thread has its own
|
1862 |
|
|
instance.
|
1863 |
|
|
|
1864 |
|
|
|
1865 |
|
|
The support for per-thread data can be disabled via the configuration
|
1866 |
|
|
option CYGVAR_KERNEL_THREADS_DATA. If enabled, each
|
1867 |
|
|
cyg_thread data structure holds a small array
|
1868 |
|
|
of words. The size of this array is determined by the configuration
|
1869 |
|
|
option CYGNUM_KERNEL_THREADS_DATA_MAX. When a
|
1870 |
|
|
thread is created the array is filled with zeroes.
|
1871 |
|
|
|
1872 |
|
|
|
1873 |
|
|
If an application needs to use per-thread data then it needs an index
|
1874 |
|
|
into this array which has not yet been allocated to other code. This
|
1875 |
|
|
index can be obtained by calling
|
1876 |
|
|
cyg_thread_new_data_index, and then used in
|
1877 |
|
|
subsequent calls to cyg_thread_get_data.
|
1878 |
|
|
Typically indices are allocated during system initialization and
|
1879 |
|
|
stored in static variables. If for some reason a slot in the array is
|
1880 |
|
|
no longer required and can be re-used then it can be released by calling
|
1881 |
|
|
cyg_thread_free_data_index,
|
1882 |
|
|
|
1883 |
|
|
|
1884 |
|
|
The current per-thread data in a given slot can be obtained using
|
1885 |
|
|
cyg_thread_get_data. This implicitly operates on
|
1886 |
|
|
the current thread, and its single argument should be an index as
|
1887 |
|
|
returned by cyg_thread_new_data_index. The
|
1888 |
|
|
per-thread data can be updated using
|
1889 |
|
|
cyg_thread_set_data. If a particular item of
|
1890 |
|
|
per-thread data is needed repeatedly then
|
1891 |
|
|
cyg_thread_get_data_ptr can be used to obtain the
|
1892 |
|
|
address of the data, and indirecting through this pointer allows the
|
1893 |
|
|
data to be examined and updated efficiently.
|
1894 |
|
|
|
1895 |
|
|
|
1896 |
|
|
Some packages, for example the error and POSIX packages, have
|
1897 |
|
|
pre-allocated slots in the array of per-thread data. These slots
|
1898 |
|
|
should not normally be used by application code, and instead slots
|
1899 |
|
|
should be allocated during initialization by a call to
|
1900 |
|
|
cyg_thread_new_data_index. If it is known that,
|
1901 |
|
|
for example, the configuration will never include the POSIX
|
1902 |
|
|
compatibility package then application code may instead decide to
|
1903 |
|
|
re-use the slot allocated to that package,
|
1904 |
|
|
CYGNUM_KERNEL_THREADS_DATA_POSIX, but obviously
|
1905 |
|
|
this does involve a risk of strange and subtle bugs if the
|
1906 |
|
|
application's requirements ever change.
|
1907 |
|
|
|
1908 |
|
|
|
1909 |
|
|
|
1910 |
|
|
Valid contexts
|
1911 |
|
|
|
1912 |
|
|
Typically cyg_thread_new_data_index is only
|
1913 |
|
|
called during initialization, but may also be called at any time in
|
1914 |
|
|
thread context. cyg_thread_free_data_index, if
|
1915 |
|
|
used at all, can also be called during initialization or from thread
|
1916 |
|
|
context. cyg_thread_get_data,
|
1917 |
|
|
cyg_thread_get_data_ptr, and
|
1918 |
|
|
cyg_thread_set_data may only be called from
|
1919 |
|
|
thread context because they implicitly operate on the current thread.
|
1920 |
|
|
|
1921 |
|
|
|
1922 |
|
|
|
1923 |
|
|
|
1924 |
|
|
|
1925 |
|
|
|
1926 |
|
|
|
1927 |
|
|
|
1928 |
|
|
|
1929 |
|
|
|
1930 |
|
|
|
1931 |
|
|
Thread destructors
|
1932 |
|
|
|
1933 |
|
|
|
1934 |
|
|
|
1935 |
|
|
cyg_thread_add_destructor
|
1936 |
|
|
cyg_thread_rem_destructor
|
1937 |
|
|
Call functions on thread termination
|
1938 |
|
|
|
1939 |
|
|
|
1940 |
|
|
|
1941 |
|
|
|
1942 |
|
|
#include <cyg/kernel/kapi.h>
|
1943 |
|
|
typedef void (*cyg_thread_destructor_fn)(cyg_addrword_t);
|
1944 |
|
|
|
1945 |
|
|
|
1946 |
|
|
cyg_bool_t cyg_thread_add_destructor
|
1947 |
|
|
cyg_thread_destructor_fn fn
|
1948 |
|
|
cyg_addrword_t data
|
1949 |
|
|
|
1950 |
|
|
|
1951 |
|
|
cyg_bool_t cyg_thread_rem_destructor
|
1952 |
|
|
cyg_thread_destructor_fn fn
|
1953 |
|
|
cyg_addrword_t data
|
1954 |
|
|
|
1955 |
|
|
|
1956 |
|
|
|
1957 |
|
|
|
1958 |
|
|
Description
|
1959 |
|
|
|
1960 |
|
|
These functions are provided for cases when an application requires a
|
1961 |
|
|
function to be automatically called when a thread exits. This is often
|
1962 |
|
|
useful when, for example, freeing up resources allocated by the thread.
|
1963 |
|
|
|
1964 |
|
|
|
1965 |
|
|
This support must be enabled with the configuration option
|
1966 |
|
|
CYGPKG_KERNEL_THREADS_DESTRUCTORS. When enabled,
|
1967 |
|
|
you may register a function of type
|
1968 |
|
|
cyg_thread_destructor_fn to be called on thread
|
1969 |
|
|
termination using cyg_thread_add_destructor. You
|
1970 |
|
|
may also provide it with a piece of arbitrary information in the
|
1971 |
|
|
data argument which will be passed to the
|
1972 |
|
|
destructor function fn when the thread
|
1973 |
|
|
terminates. If you no longer wish to call a function previous
|
1974 |
|
|
registered with cyg_thread_add_destructor, you
|
1975 |
|
|
may call cyg_thread_rem_destructor with the same
|
1976 |
|
|
parameters used to register the destructor function. Both these
|
1977 |
|
|
functions return true on success and
|
1978 |
|
|
false on failure.
|
1979 |
|
|
|
1980 |
|
|
|
1981 |
|
|
By default, thread destructors are per-thread, which means that registering
|
1982 |
|
|
a destructor function only registers that function for the current thread.
|
1983 |
|
|
In other words, each thread has its own list of destructors.
|
1984 |
|
|
Alternatively you may disable the configuration option
|
1985 |
|
|
CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD in which
|
1986 |
|
|
case any registered destructors will be run when any
|
1987 |
|
|
threads exit. In other words, the thread destructor list is global and all
|
1988 |
|
|
threads have the same destructors.
|
1989 |
|
|
|
1990 |
|
|
|
1991 |
|
|
There is a limit to the number of destructors which may be registered,
|
1992 |
|
|
which can be controlled with the
|
1993 |
|
|
CYGNUM_KERNEL_THREADS_DESTRUCTORS configuration
|
1994 |
|
|
option. Increasing this value will very slightly increase the amount
|
1995 |
|
|
of memory in use, and when
|
1996 |
|
|
CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD is
|
1997 |
|
|
enabled, the amount of memory used per thread will increase. When the
|
1998 |
|
|
limit has been reached, cyg_thread_add_destructor
|
1999 |
|
|
will return false.
|
2000 |
|
|
|
2001 |
|
|
|
2002 |
|
|
|
2003 |
|
|
Valid contexts
|
2004 |
|
|
|
2005 |
|
|
When CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD
|
2006 |
|
|
is enabled, these functions must only be called from a thread context
|
2007 |
|
|
as they implicitly operate on the current thread. When
|
2008 |
|
|
CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD is
|
2009 |
|
|
disabled, these functions may be called from thread or DSR context,
|
2010 |
|
|
or at initialization time.
|
2011 |
|
|
|
2012 |
|
|
|
2013 |
|
|
|
2014 |
|
|
|
2015 |
|
|
|
2016 |
|
|
|
2017 |
|
|
|
2018 |
|
|
|
2019 |
|
|
|
2020 |
|
|
|
2021 |
|
|
|
2022 |
|
|
Exception handling
|
2023 |
|
|
|
2024 |
|
|
|
2025 |
|
|
|
2026 |
|
|
cyg_exception_set_handler
|
2027 |
|
|
cyg_exception_clear_handler
|
2028 |
|
|
cyg_exception_call_handler
|
2029 |
|
|
Handle processor exceptions
|
2030 |
|
|
|
2031 |
|
|
|
2032 |
|
|
|
2033 |
|
|
|
2034 |
|
|
#include <cyg/kernel/kapi.h>
|
2035 |
|
|
|
2036 |
|
|
|
2037 |
|
|
void cyg_exception_set_handler
|
2038 |
|
|
cyg_code_t exception_number
|
2039 |
|
|
cyg_exception_handler_t* new_handler
|
2040 |
|
|
cyg_addrword_t new_data
|
2041 |
|
|
cyg_exception_handler_t** old_handler
|
2042 |
|
|
cyg_addrword_t* old_data
|
2043 |
|
|
|
2044 |
|
|
|
2045 |
|
|
void cyg_exception_clear_handler
|
2046 |
|
|
cyg_code_t exception_number
|
2047 |
|
|
|
2048 |
|
|
|
2049 |
|
|
void cyg_exception_call_handler
|
2050 |
|
|
cyg_handle_t thread
|
2051 |
|
|
cyg_code_t exception_number
|
2052 |
|
|
cyg_addrword_t exception_info
|
2053 |
|
|
|
2054 |
|
|
|
2055 |
|
|
|
2056 |
|
|
|
2057 |
|
|
Description
|
2058 |
|
|
|
2059 |
|
|
Sometimes code attempts operations that are not legal on the current
|
2060 |
|
|
hardware, for example dividing by zero, or accessing data through a
|
2061 |
|
|
pointer that is not properly aligned. When this happens the hardware
|
2062 |
|
|
will raise an exception. This is very similar to an interrupt, but
|
2063 |
|
|
happens synchronously with code execution rather than asynchronously
|
2064 |
|
|
and hence can be tied to the thread that is currently running.
|
2065 |
|
|
|
2066 |
|
|
|
2067 |
|
|
The exceptions that can be raised depend very much on the hardware,
|
2068 |
|
|
especially the processor. The corresponding documentation should be
|
2069 |
|
|
consulted for more details. Alternatively the architectural HAL header
|
2070 |
|
|
file , or one of the
|
2071 |
|
|
variant or platform header files it includes, will contain appropriate
|
2072 |
|
|
definitions. The details of how to handle exceptions, including
|
2073 |
|
|
whether or not it is possible to recover from them, also depend on the
|
2074 |
|
|
hardware.
|
2075 |
|
|
|
2076 |
|
|
|
2077 |
|
|
Exception handling is optional, and can be disabled through the
|
2078 |
|
|
configuration option CYGPKG_KERNEL_EXCEPTIONS. If
|
2079 |
|
|
an application has been exhaustively tested and is trusted never to
|
2080 |
|
|
raise a hardware exception then this option can be disabled and code
|
2081 |
|
|
and data sizes will be reduced somewhat. If exceptions are left
|
2082 |
|
|
enabled then the system will provide default handlers for the various
|
2083 |
|
|
exceptions, but these do nothing. Even the specific type of exception
|
2084 |
|
|
is ignored, so there is no point in attempting to decode this and
|
2085 |
|
|
distinguish between say a divide-by-zero and an unaligned access.
|
2086 |
|
|
If the application installs its own handlers and wants details of the
|
2087 |
|
|
specific exception being raised then the configuration option
|
2088 |
|
|
CYGSEM_KERNEL_EXCEPTIONS_DECODE has to be enabled.
|
2089 |
|
|
|
2090 |
|
|
|
2091 |
|
|
An alternative handler can be installed using
|
2092 |
|
|
cyg_exception_set_handler. This requires a code
|
2093 |
|
|
for the exception, a function pointer for the new exception handler,
|
2094 |
|
|
and a parameter to be passed to this handler. Details of the
|
2095 |
|
|
previously installed exception handler will be returned via the
|
2096 |
|
|
remaining two arguments, allowing that handler to be reinstated, or
|
2097 |
|
|
null pointers can be used if this information is of no interest. An
|
2098 |
|
|
exception handling function should take the following form:
|
2099 |
|
|
|
2100 |
|
|
|
2101 |
|
|
void
|
2102 |
|
|
my_exception_handler(cyg_addrword_t data, cyg_code_t exception, cyg_addrword_t info)
|
2103 |
|
|
{
|
2104 |
|
|
…
|
2105 |
|
|
}
|
2106 |
|
|
|
2107 |
|
|
|
2108 |
|
|
The data argument corresponds to the new_data
|
2109 |
|
|
parameter supplied to cyg_exception_set_handler.
|
2110 |
|
|
The exception code is provided as well, in case a single handler is
|
2111 |
|
|
expected to support multiple exceptions. The info
|
2112 |
|
|
argument will depend on the hardware and on the specific exception.
|
2113 |
|
|
|
2114 |
|
|
|
2115 |
|
|
cyg_exception_clear_handler can be used to
|
2116 |
|
|
restore the default handler, if desired. It is also possible for
|
2117 |
|
|
software to raise an exception and cause the current handler to be
|
2118 |
|
|
invoked, but generally this is useful only for testing.
|
2119 |
|
|
|
2120 |
|
|
|
2121 |
|
|
By default the system maintains a single set of global exception
|
2122 |
|
|
handlers. However, since exceptions occur synchronously it is
|
2123 |
|
|
sometimes useful to handle them on a per-thread basis, and have a
|
2124 |
|
|
different set of handlers for each thread. This behaviour can be
|
2125 |
|
|
obtained by disabling the configuration option
|
2126 |
|
|
CYGSEM_KERNEL_EXCEPTIONS_GLOBAL. If per-thread
|
2127 |
|
|
exception handlers are being used then
|
2128 |
|
|
cyg_exception_set_handler and
|
2129 |
|
|
cyg_exception_clear_handler apply to the current
|
2130 |
|
|
thread. Otherwise they apply to the global set of handlers.
|
2131 |
|
|
|
2132 |
|
|
|
2133 |
|
|
|
2134 |
|
|
In the current implementation
|
2135 |
|
|
cyg_exception_call_handler can only be used on
|
2136 |
|
|
the current thread. There is no support for delivering an exception to
|
2137 |
|
|
another thread.
|
2138 |
|
|
|
2139 |
|
|
|
2140 |
|
|
Exceptions at the eCos kernel level refer specifically to
|
2141 |
|
|
hardware-related events such as unaligned accesses to memory or
|
2142 |
|
|
division by zero. There is no relation with other concepts that are
|
2143 |
|
|
also known as exceptions, for example the throw and
|
2144 |
|
|
catch facilities associated with C++.
|
2145 |
|
|
|
2146 |
|
|
|
2147 |
|
|
|
2148 |
|
|
|
2149 |
|
|
Valid contexts
|
2150 |
|
|
|
2151 |
|
|
If the system is configured with a single set of global exception
|
2152 |
|
|
handlers then
|
2153 |
|
|
cyg_exception_set_handler and
|
2154 |
|
|
cyg_exception_clear_handler may be called during
|
2155 |
|
|
initialization or from thread context. If instead per-thread exception
|
2156 |
|
|
handlers are being used then it is not possible to install new
|
2157 |
|
|
handlers during initialization because the functions operate
|
2158 |
|
|
implicitly on the current thread, so they can only be called from
|
2159 |
|
|
thread context. cyg_exception_call_handler should
|
2160 |
|
|
only be called from thread context.
|
2161 |
|
|
|
2162 |
|
|
|
2163 |
|
|
|
2164 |
|
|
|
2165 |
|
|
|
2166 |
|
|
|
2167 |
|
|
|
2168 |
|
|
|
2169 |
|
|
|
2170 |
|
|
|
2171 |
|
|
|
2172 |
|
|
Counters
|
2173 |
|
|
|
2174 |
|
|
|
2175 |
|
|
|
2176 |
|
|
cyg_counter_create
|
2177 |
|
|
cyg_counter_delete
|
2178 |
|
|
cyg_counter_current_value
|
2179 |
|
|
cyg_counter_set_value
|
2180 |
|
|
cyg_counter_tick
|
2181 |
|
|
Count event occurrences
|
2182 |
|
|
|
2183 |
|
|
|
2184 |
|
|
|
2185 |
|
|
|
2186 |
|
|
|
2187 |
|
|
#include <cyg/kernel/kapi.h>
|
2188 |
|
|
|
2189 |
|
|
|
2190 |
|
|
void cyg_counter_create
|
2191 |
|
|
cyg_handle_t* handle
|
2192 |
|
|
cyg_counter* counter
|
2193 |
|
|
|
2194 |
|
|
|
2195 |
|
|
void cyg_counter_delete
|
2196 |
|
|
cyg_handle_t counter
|
2197 |
|
|
|
2198 |
|
|
|
2199 |
|
|
cyg_tick_count_t cyg_counter_current_value
|
2200 |
|
|
cyg_handle_t counter
|
2201 |
|
|
|
2202 |
|
|
|
2203 |
|
|
void cyg_counter_set_value
|
2204 |
|
|
cyg_handle_t counter
|
2205 |
|
|
cyg_tick_count_t new_value
|
2206 |
|
|
|
2207 |
|
|
|
2208 |
|
|
void cyg_counter_tick
|
2209 |
|
|
cyg_handle_t counter
|
2210 |
|
|
|
2211 |
|
|
|
2212 |
|
|
|
2213 |
|
|
|
2214 |
|
|
Description
|
2215 |
|
|
|
2216 |
|
|
Kernel counters can be used to keep track of how many times a
|
2217 |
|
|
particular event has occurred. Usually this event is an external
|
2218 |
|
|
signal of some sort. The most common use of counters is in the
|
2219 |
|
|
implementation of clocks, but they can be useful with other event
|
2220 |
|
|
sources as well. Application code can attach
|
2221 |
|
|
linkend="kernel-alarms">alarms to counters, causing a function
|
2222 |
|
|
to be called when some number of events have occurred.
|
2223 |
|
|
|
2224 |
|
|
|
2225 |
|
|
A new counter is initialized by a call to
|
2226 |
|
|
cyg_counter_create. The first argument is used to
|
2227 |
|
|
return a handle to the new counter which can be used for subsequent
|
2228 |
|
|
operations. The second argument allows the application to provide the
|
2229 |
|
|
memory needed for the object, thus eliminating any need for dynamic
|
2230 |
|
|
memory allocation within the kernel. If a counter is no longer
|
2231 |
|
|
required and does not have any alarms attached then
|
2232 |
|
|
cyg_counter_delete can be used to release the
|
2233 |
|
|
resources, allowing the cyg_counter data
|
2234 |
|
|
structure to be re-used.
|
2235 |
|
|
|
2236 |
|
|
|
2237 |
|
|
Initializing a counter does not automatically attach it to any source
|
2238 |
|
|
of events. Instead some other code needs to call
|
2239 |
|
|
cyg_counter_tick whenever a suitable event
|
2240 |
|
|
occurs, which will cause the counter to be incremented and may cause
|
2241 |
|
|
alarms to trigger. The current value associated with the counter can
|
2242 |
|
|
be retrieved using cyg_counter_current_value and
|
2243 |
|
|
modified with cyg_counter_set_value. Typically
|
2244 |
|
|
the latter function is only used during initialization, for example to
|
2245 |
|
|
set a clock to wallclock time, but it can be used to reset a counter
|
2246 |
|
|
if necessary. However cyg_counter_set_value will
|
2247 |
|
|
never trigger any alarms. A newly initialized counter has a starting
|
2248 |
|
|
value of 0.
|
2249 |
|
|
|
2250 |
|
|
|
2251 |
|
|
The kernel provides two different implementations of counters. The
|
2252 |
|
|
default is CYGIMP_KERNEL_COUNTERS_SINGLE_LIST which
|
2253 |
|
|
stores all alarms attached to the counter on a single list. This is
|
2254 |
|
|
simple and usually efficient. However when a tick occurs the kernel
|
2255 |
|
|
code has to traverse this list, typically at DSR level, so if there
|
2256 |
|
|
are a significant number of alarms attached to a single counter this
|
2257 |
|
|
will affect the system's dispatch latency. The alternative
|
2258 |
|
|
implementation, CYGIMP_KERNEL_COUNTERS_MULTI_LIST,
|
2259 |
|
|
stores each alarm in one of an array of lists such that at most one of
|
2260 |
|
|
the lists needs to be searched per clock tick. This involves extra
|
2261 |
|
|
code and data, but can improve real-time responsiveness in some
|
2262 |
|
|
circumstances. Another configuration option that is relevant here
|
2263 |
|
|
is CYGIMP_KERNEL_COUNTERS_SORT_LIST, which is
|
2264 |
|
|
disabled by default. This provides a trade off between doing work
|
2265 |
|
|
whenever a new alarm is added to a counter and doing work whenever a
|
2266 |
|
|
tick occurs. It is application-dependent which of these is more
|
2267 |
|
|
appropriate.
|
2268 |
|
|
|
2269 |
|
|
|
2270 |
|
|
|
2271 |
|
|
Valid contexts
|
2272 |
|
|
|
2273 |
|
|
cyg_counter_create is typically called during
|
2274 |
|
|
system initialization but may also be called in thread context.
|
2275 |
|
|
Similarly cyg_counter_delete may be called during
|
2276 |
|
|
initialization or in thread context.
|
2277 |
|
|
cyg_counter_current_value,
|
2278 |
|
|
cyg_counter_set_value and
|
2279 |
|
|
cyg_counter_tick may be called during
|
2280 |
|
|
initialization or from thread or DSR context. In fact,
|
2281 |
|
|
cyg_counter_tick is usually called from inside a
|
2282 |
|
|
DSR in response to an external event of some sort.
|
2283 |
|
|
|
2284 |
|
|
|
2285 |
|
|
|
2286 |
|
|
|
2287 |
|
|
|
2288 |
|
|
|
2289 |
|
|
|
2290 |
|
|
|
2291 |
|
|
|
2292 |
|
|
|
2293 |
|
|
|
2294 |
|
|
Clocks
|
2295 |
|
|
|
2296 |
|
|
|
2297 |
|
|
|
2298 |
|
|
cyg_clock_create
|
2299 |
|
|
cyg_clock_delete
|
2300 |
|
|
cyg_clock_to_counter
|
2301 |
|
|
cyg_clock_set_resolution
|
2302 |
|
|
cyg_clock_get_resolution
|
2303 |
|
|
cyg_real_time_clock
|
2304 |
|
|
cyg_current_time
|
2305 |
|
|
Provide system clocks
|
2306 |
|
|
|
2307 |
|
|
|
2308 |
|
|
|
2309 |
|
|
|
2310 |
|
|
|
2311 |
|
|
#include <cyg/kernel/kapi.h>
|
2312 |
|
|
|
2313 |
|
|
|
2314 |
|
|
void cyg_clock_create
|
2315 |
|
|
cyg_resolution_t resolution
|
2316 |
|
|
cyg_handle_t* handle
|
2317 |
|
|
cyg_clock* clock
|
2318 |
|
|
|
2319 |
|
|
|
2320 |
|
|
void cyg_clock_delete
|
2321 |
|
|
cyg_handle_t clock
|
2322 |
|
|
|
2323 |
|
|
|
2324 |
|
|
void cyg_clock_to_counter
|
2325 |
|
|
cyg_handle_t clock
|
2326 |
|
|
cyg_handle_t* counter
|
2327 |
|
|
|
2328 |
|
|
|
2329 |
|
|
void cyg_clock_set_resolution
|
2330 |
|
|
cyg_handle_t clock
|
2331 |
|
|
cyg_resolution_t resolution
|
2332 |
|
|
|
2333 |
|
|
|
2334 |
|
|
cyg_resolution_t cyg_clock_get_resolution
|
2335 |
|
|
cyg_handle_t clock
|
2336 |
|
|
|
2337 |
|
|
|
2338 |
|
|
cyg_handle_t cyg_real_time_clock
|
2339 |
|
|
|
2340 |
|
|
|
2341 |
|
|
|
2342 |
|
|
cyg_tick_count_t cyg_current_time
|
2343 |
|
|
|
2344 |
|
|
|
2345 |
|
|
|
2346 |
|
|
|
2347 |
|
|
|
2348 |
|
|
Description
|
2349 |
|
|
|
2350 |
|
|
In the eCos kernel clock objects are a special form of
|
2351 |
|
|
linkend="kernel-counters">counter objects. They are attached to
|
2352 |
|
|
a specific type of hardware, clocks that generate ticks at very
|
2353 |
|
|
specific time intervals, whereas counters can be used with any event
|
2354 |
|
|
source.
|
2355 |
|
|
|
2356 |
|
|
|
2357 |
|
|
In a default configuration the kernel provides a single clock
|
2358 |
|
|
instance, the real-time clock. This gets used for timeslicing and for
|
2359 |
|
|
operations that involve a timeout, for example
|
2360 |
|
|
cyg_semaphore_timed_wait. If this functionality
|
2361 |
|
|
is not required it can be removed from the system using the
|
2362 |
|
|
configuration option CYGVAR_KERNEL_COUNTERS_CLOCK.
|
2363 |
|
|
Otherwise the real-time clock can be accessed by a call to
|
2364 |
|
|
cyg_real_time_clock, allowing applications to
|
2365 |
|
|
attach alarms, and the current counter value can be obtained using
|
2366 |
|
|
cyg_current_time.
|
2367 |
|
|
|
2368 |
|
|
|
2369 |
|
|
Applications can create and destroy additional clocks if desired,
|
2370 |
|
|
using cyg_clock_create and
|
2371 |
|
|
cyg_clock_delete. The first argument to
|
2372 |
|
|
cyg_clock_create specifies the
|
2373 |
|
|
resolution this clock
|
2374 |
|
|
will run at. The second argument is used to return a handle for this
|
2375 |
|
|
clock object, and the third argument provides the kernel with the
|
2376 |
|
|
memory needed to hold this object. This clock will not actually tick
|
2377 |
|
|
by itself. Instead it is the responsibility of application code to
|
2378 |
|
|
initialize a suitable hardware timer to generate interrupts at the
|
2379 |
|
|
appropriate frequency, install an interrupt handler for this, and
|
2380 |
|
|
call cyg_counter_tick from inside the DSR.
|
2381 |
|
|
Associated with each clock is a kernel counter, a handle for which can
|
2382 |
|
|
be obtained using cyg_clock_to_counter.
|
2383 |
|
|
|
2384 |
|
|
|
2385 |
|
|
|
2386 |
|
|
Clock Resolutions and Ticks
|
2387 |
|
|
|
2388 |
|
|
At the kernel level all clock-related operations including delays,
|
2389 |
|
|
timeouts and alarms work in units of clock ticks, rather than in units
|
2390 |
|
|
of seconds or milliseconds. If the calling code, whether the
|
2391 |
|
|
application or some other package, needs to operate using units such
|
2392 |
|
|
as milliseconds then it has to convert from these units to clock
|
2393 |
|
|
ticks.
|
2394 |
|
|
|
2395 |
|
|
|
2396 |
|
|
The main reason for this is that it accurately reflects the
|
2397 |
|
|
hardware: calling something like nanosleep with a
|
2398 |
|
|
delay of ten nanoseconds will not work as intended on any real
|
2399 |
|
|
hardware because timer interrupts simply will not happen that
|
2400 |
|
|
frequently; instead calling cyg_thread_delay with
|
2401 |
|
|
the equivalent delay of 0 ticks gives a much clearer indication that
|
2402 |
|
|
the application is attempting something inappropriate for the target
|
2403 |
|
|
hardware. Similarly, passing a delay of five ticks to
|
2404 |
|
|
cyg_thread_delay makes it fairly obvious that
|
2405 |
|
|
the current thread will be suspended for somewhere between four and
|
2406 |
|
|
five clock periods, as opposed to passing 50000000 to
|
2407 |
|
|
nanosleep which suggests a granularity that is
|
2408 |
|
|
not actually provided.
|
2409 |
|
|
|
2410 |
|
|
|
2411 |
|
|
A secondary reason is that conversion between clock ticks and units
|
2412 |
|
|
such as milliseconds can be somewhat expensive, and whenever possible
|
2413 |
|
|
should be done at compile-time or by the application developer rather
|
2414 |
|
|
than at run-time. This saves code size and cpu cycles.
|
2415 |
|
|
|
2416 |
|
|
|
2417 |
|
|
The information needed to perform these conversions is the clock
|
2418 |
|
|
resolution. This is a structure with two fields, a dividend and a
|
2419 |
|
|
divisor, and specifies the number of nanoseconds between clock ticks.
|
2420 |
|
|
For example a clock that runs at 100Hz will have 10 milliseconds
|
2421 |
|
|
between clock ticks, or 10000000 nanoseconds. The ratio between the
|
2422 |
|
|
resolution's dividend and divisor will therefore be 10000000 to 1, and
|
2423 |
|
|
typical values for these might be 1000000000 and 100. If the clock
|
2424 |
|
|
runs at a different frequency, say 60Hz, the numbers could be
|
2425 |
|
|
1000000000 and 60 respectively. Given a delay in nanoseconds, this can
|
2426 |
|
|
be converted to clock ticks by multiplying with the the divisor and
|
2427 |
|
|
then dividing by the dividend. For example a delay of 50 milliseconds
|
2428 |
|
|
corresponds to 50000000 nanoseconds, and with a clock frequency of
|
2429 |
|
|
100Hz this can be converted to
|
2430 |
|
|
((50000000 * 100) / 1000000000) = 5
|
2431 |
|
|
clock ticks. Given the large numbers involved this arithmetic normally
|
2432 |
|
|
has to be done using 64-bit precision and the
|
2433 |
|
|
long long data type, but allows code to run on
|
2434 |
|
|
hardware with unusual clock frequencies.
|
2435 |
|
|
|
2436 |
|
|
|
2437 |
|
|
The default frequency for the real-time clock on any platform is
|
2438 |
|
|
usually about 100Hz, but platform-specific documentation should be
|
2439 |
|
|
consulted for this information. Usually it is possible to override
|
2440 |
|
|
this default by configuration options, but again this depends on the
|
2441 |
|
|
capabilities of the underlying hardware. The resolution for any clock
|
2442 |
|
|
can be obtained using cyg_clock_get_resolution.
|
2443 |
|
|
For clocks created by application code, there is also a function
|
2444 |
|
|
cyg_clock_set_resolution. This does not affect
|
2445 |
|
|
the underlying hardware timer in any way, it merely updates the
|
2446 |
|
|
information that will be returned in subsequent calls to
|
2447 |
|
|
cyg_clock_get_resolution: changing the actual
|
2448 |
|
|
underlying clock frequency will require appropriate manipulation of
|
2449 |
|
|
the timer hardware.
|
2450 |
|
|
|
2451 |
|
|
|
2452 |
|
|
|
2453 |
|
|
Valid contexts
|
2454 |
|
|
|
2455 |
|
|
cyg_clock_create is usually only called during
|
2456 |
|
|
system initialization (if at all), but may also be called from thread
|
2457 |
|
|
context. The same applies to cyg_clock_delete.
|
2458 |
|
|
The remaining functions may be called during initialization, from
|
2459 |
|
|
thread context, or from DSR context, although it should be noted that
|
2460 |
|
|
there is no locking between
|
2461 |
|
|
cyg_clock_get_resolution and
|
2462 |
|
|
cyg_clock_set_resolution so theoretically it is
|
2463 |
|
|
possible that the former returns an inconsistent data structure.
|
2464 |
|
|
|
2465 |
|
|
|
2466 |
|
|
|
2467 |
|
|
|
2468 |
|
|
|
2469 |
|
|
|
2470 |
|
|
|
2471 |
|
|
|
2472 |
|
|
|
2473 |
|
|
|
2474 |
|
|
|
2475 |
|
|
Alarms
|
2476 |
|
|
|
2477 |
|
|
|
2478 |
|
|
|
2479 |
|
|
cyg_alarm_create
|
2480 |
|
|
cyg_alarm_delete
|
2481 |
|
|
cyg_alarm_initialize
|
2482 |
|
|
cyg_alarm_enable
|
2483 |
|
|
cyg_alarm_disable
|
2484 |
|
|
Run an alarm function when a number of events have occurred
|
2485 |
|
|
|
2486 |
|
|
|
2487 |
|
|
|
2488 |
|
|
|
2489 |
|
|
|
2490 |
|
|
#include <cyg/kernel/kapi.h>
|
2491 |
|
|
|
2492 |
|
|
|
2493 |
|
|
void cyg_alarm_create
|
2494 |
|
|
cyg_handle_t counter
|
2495 |
|
|
cyg_alarm_t* alarmfn
|
2496 |
|
|
cyg_addrword_t data
|
2497 |
|
|
cyg_handle_t* handle
|
2498 |
|
|
cyg_alarm* alarm
|
2499 |
|
|
|
2500 |
|
|
|
2501 |
|
|
void cyg_alarm_delete
|
2502 |
|
|
cyg_handle_t alarm
|
2503 |
|
|
|
2504 |
|
|
|
2505 |
|
|
void cyg_alarm_initialize
|
2506 |
|
|
cyg_handle_t alarm
|
2507 |
|
|
cyg_tick_count_t trigger
|
2508 |
|
|
cyg_tick_count_t interval
|
2509 |
|
|
|
2510 |
|
|
|
2511 |
|
|
void cyg_alarm_enable
|
2512 |
|
|
cyg_handle_t alarm
|
2513 |
|
|
|
2514 |
|
|
|
2515 |
|
|
void cyg_alarm_disable
|
2516 |
|
|
cyg_handle_t alarm
|
2517 |
|
|
|
2518 |
|
|
|
2519 |
|
|
|
2520 |
|
|
|
2521 |
|
|
Description
|
2522 |
|
|
|
2523 |
|
|
Kernel alarms are used together with counters and allow for action to
|
2524 |
|
|
be taken when a certain number of events have occurred. If the counter
|
2525 |
|
|
is associated with a clock then the alarm action happens when the
|
2526 |
|
|
appropriate number of clock ticks have occurred, in other words after
|
2527 |
|
|
a certain period of time.
|
2528 |
|
|
|
2529 |
|
|
|
2530 |
|
|
Setting up an alarm involves a two-step process. First the alarm must
|
2531 |
|
|
be created with a call to cyg_alarm_create. This
|
2532 |
|
|
takes five arguments. The first identifies the counter to which the
|
2533 |
|
|
alarm should be attached. If the alarm should be attached to the
|
2534 |
|
|
system's real-time clock then cyg_real_time_clock
|
2535 |
|
|
and cyg_clock_to_counter can be used to get hold
|
2536 |
|
|
of the appropriate handle. The next two arguments specify the action
|
2537 |
|
|
to be taken when the alarm is triggered, in the form of a function
|
2538 |
|
|
pointer and some data. This function should take the form:
|
2539 |
|
|
|
2540 |
|
|
|
2541 |
|
|
void
|
2542 |
|
|
alarm_handler(cyg_handle_t alarm, cyg_addrword_t data)
|
2543 |
|
|
{
|
2544 |
|
|
…
|
2545 |
|
|
}
|
2546 |
|
|
|
2547 |
|
|
|
2548 |
|
|
The data argument passed to the alarm function corresponds to the
|
2549 |
|
|
third argument passed to cyg_alarm_create.
|
2550 |
|
|
The fourth argument to cyg_alarm_create is used
|
2551 |
|
|
to return a handle to the newly-created alarm object, and the final
|
2552 |
|
|
argument provides the memory needed for the alarm object and thus
|
2553 |
|
|
avoids any need for dynamic memory allocation within the kernel.
|
2554 |
|
|
|
2555 |
|
|
|
2556 |
|
|
Once an alarm has been created a further call to
|
2557 |
|
|
cyg_alarm_initialize is needed to activate it.
|
2558 |
|
|
The first argument specifies the alarm. The second argument indicates
|
2559 |
|
|
the number of events, for example clock ticks, that need to occur
|
2560 |
|
|
before the alarm triggers. If the third argument is 0 then the alarm
|
2561 |
|
|
will only trigger once. A non-zero value specifies that the alarm
|
2562 |
|
|
should trigger repeatedly, with an interval of the specified number of
|
2563 |
|
|
events.
|
2564 |
|
|
|
2565 |
|
|
|
2566 |
|
|
Alarms can be temporarily disabled and reenabled using
|
2567 |
|
|
cyg_alarm_disable and
|
2568 |
|
|
cyg_alarm_enable. Alternatively another call to
|
2569 |
|
|
cyg_alarm_initialize can be used to modify the
|
2570 |
|
|
behaviour of an existing alarm. If an alarm is no longer required then
|
2571 |
|
|
the associated resources can be released using
|
2572 |
|
|
cyg_alarm_delete.
|
2573 |
|
|
|
2574 |
|
|
|
2575 |
|
|
The alarm function is invoked when a counter tick occurs, in other
|
2576 |
|
|
words when there is a call to cyg_counter_tick,
|
2577 |
|
|
and will happen in the same context. If the alarm is associated with
|
2578 |
|
|
the system's real-time clock then this will be DSR context, following
|
2579 |
|
|
a clock interrupt. If the alarm is associated with some other
|
2580 |
|
|
application-specific counter then the details will depend on how that
|
2581 |
|
|
counter is updated.
|
2582 |
|
|
|
2583 |
|
|
|
2584 |
|
|
If two or more alarms are registered for precisely the same counter tick,
|
2585 |
|
|
the order of execution of the alarm functions is unspecified.
|
2586 |
|
|
|
2587 |
|
|
|
2588 |
|
|
|
2589 |
|
|
Valid contexts
|
2590 |
|
|
|
2591 |
|
|
cyg_alarm_create
|
2592 |
|
|
cyg_alarm_initialize is typically called during
|
2593 |
|
|
system initialization but may also be called in thread context. The
|
2594 |
|
|
same applies to cyg_alarm_delete.
|
2595 |
|
|
cyg_alarm_initialize,
|
2596 |
|
|
cyg_alarm_disable and
|
2597 |
|
|
cyg_alarm_enable may be called during
|
2598 |
|
|
initialization or from thread or DSR context, but
|
2599 |
|
|
cyg_alarm_enable and
|
2600 |
|
|
cyg_alarm_initialize may be expensive operations
|
2601 |
|
|
and should only be called when necessary.
|
2602 |
|
|
|
2603 |
|
|
|
2604 |
|
|
|
2605 |
|
|
|
2606 |
|
|
|
2607 |
|
|
|
2608 |
|
|
|
2609 |
|
|
|
2610 |
|
|
|
2611 |
|
|
|
2612 |
|
|
|
2613 |
|
|
Mutexes
|
2614 |
|
|
|
2615 |
|
|
|
2616 |
|
|
|
2617 |
|
|
cyg_mutex_init
|
2618 |
|
|
cyg_mutex_destroy
|
2619 |
|
|
cyg_mutex_lock
|
2620 |
|
|
cyg_mutex_trylock
|
2621 |
|
|
cyg_mutex_unlock
|
2622 |
|
|
cyg_mutex_release
|
2623 |
|
|
cyg_mutex_set_ceiling
|
2624 |
|
|
cyg_mutex_set_protocol
|
2625 |
|
|
Synchronization primitive
|
2626 |
|
|
|
2627 |
|
|
|
2628 |
|
|
|
2629 |
|
|
|
2630 |
|
|
|
2631 |
|
|
#include <cyg/kernel/kapi.h>
|
2632 |
|
|
|
2633 |
|
|
|
2634 |
|
|
void cyg_mutex_init
|
2635 |
|
|
cyg_mutex_t* mutex
|
2636 |
|
|
|
2637 |
|
|
|
2638 |
|
|
void cyg_mutex_destroy
|
2639 |
|
|
cyg_mutex_t* mutex
|
2640 |
|
|
|
2641 |
|
|
|
2642 |
|
|
cyg_bool_t cyg_mutex_lock
|
2643 |
|
|
cyg_mutex_t* mutex
|
2644 |
|
|
|
2645 |
|
|
|
2646 |
|
|
cyg_bool_t cyg_mutex_trylock
|
2647 |
|
|
cyg_mutex_t* mutex
|
2648 |
|
|
|
2649 |
|
|
|
2650 |
|
|
void cyg_mutex_unlock
|
2651 |
|
|
cyg_mutex_t* mutex
|
2652 |
|
|
|
2653 |
|
|
|
2654 |
|
|
void cyg_mutex_release
|
2655 |
|
|
cyg_mutex_t* mutex
|
2656 |
|
|
|
2657 |
|
|
|
2658 |
|
|
void cyg_mutex_set_ceiling
|
2659 |
|
|
cyg_mutex_t* mutex
|
2660 |
|
|
cyg_priority_t priority
|
2661 |
|
|
|
2662 |
|
|
|
2663 |
|
|
void cyg_mutex_set_protocol
|
2664 |
|
|
cyg_mutex_t* mutex
|
2665 |
|
|
enum cyg_mutex_protocol protocol/
|
2666 |
|
|
|
2667 |
|
|
|
2668 |
|
|
|
2669 |
|
|
|
2670 |
|
|
Description
|
2671 |
|
|
|
2672 |
|
|
The purpose of mutexes is to let threads share resources safely. If
|
2673 |
|
|
two or more threads attempt to manipulate a data structure with no
|
2674 |
|
|
locking between them then the system may run for quite some time
|
2675 |
|
|
without apparent problems, but sooner or later the data structure will
|
2676 |
|
|
become inconsistent and the application will start behaving strangely
|
2677 |
|
|
and is quite likely to crash. The same can apply even when
|
2678 |
|
|
manipulating a single variable or some other resource. For example,
|
2679 |
|
|
consider:
|
2680 |
|
|
|
2681 |
|
|
|
2682 |
|
|
static volatile int counter = 0;
|
2683 |
|
|
|
2684 |
|
|
void
|
2685 |
|
|
process_event(void)
|
2686 |
|
|
{
|
2687 |
|
|
…
|
2688 |
|
|
|
2689 |
|
|
counter++;
|
2690 |
|
|
}
|
2691 |
|
|
|
2692 |
|
|
|
2693 |
|
|
Assume that after a certain period of time counter
|
2694 |
|
|
has a value of 42, and two threads A and B running at the same
|
2695 |
|
|
priority call process_event. Typically thread A
|
2696 |
|
|
will read the value of counter into a register,
|
2697 |
|
|
increment this register to 43, and write this updated value back to
|
2698 |
|
|
memory. Thread B will do the same, so usually
|
2699 |
|
|
counter will end up with a value of 44. However if
|
2700 |
|
|
thread A is timesliced after reading the old value 42 but before
|
2701 |
|
|
writing back 43, thread B will still read back the old value and will
|
2702 |
|
|
also write back 43. The net result is that the counter only gets
|
2703 |
|
|
incremented once, not twice, which depending on the application may
|
2704 |
|
|
prove disastrous.
|
2705 |
|
|
|
2706 |
|
|
|
2707 |
|
|
Sections of code like the above which involve manipulating shared data
|
2708 |
|
|
are generally known as critical regions. Code should claim a lock
|
2709 |
|
|
before entering a critical region and release the lock when leaving.
|
2710 |
|
|
Mutexes provide an appropriate synchronization primitive for this.
|
2711 |
|
|
|
2712 |
|
|
|
2713 |
|
|
static volatile int counter = 0;
|
2714 |
|
|
static cyg_mutex_t lock;
|
2715 |
|
|
|
2716 |
|
|
void
|
2717 |
|
|
process_event(void)
|
2718 |
|
|
{
|
2719 |
|
|
…
|
2720 |
|
|
|
2721 |
|
|
cyg_mutex_lock(&lock);
|
2722 |
|
|
counter++;
|
2723 |
|
|
cyg_mutex_unlock(&lock);
|
2724 |
|
|
}
|
2725 |
|
|
|
2726 |
|
|
|
2727 |
|
|
A mutex must be initialized before it can be used, by calling
|
2728 |
|
|
cyg_mutex_init. This takes a pointer to a
|
2729 |
|
|
cyg_mutex_t data structure which is typically
|
2730 |
|
|
statically allocated, and may be part of a larger data structure. If a
|
2731 |
|
|
mutex is no longer required and there are no threads waiting on it
|
2732 |
|
|
then cyg_mutex_destroy can be used.
|
2733 |
|
|
|
2734 |
|
|
|
2735 |
|
|
The main functions for using a mutex are
|
2736 |
|
|
cyg_mutex_lock and
|
2737 |
|
|
cyg_mutex_unlock. In normal operation
|
2738 |
|
|
cyg_mutex_lock will return success after claiming
|
2739 |
|
|
the mutex lock, blocking if another thread currently owns the mutex.
|
2740 |
|
|
However the lock operation may fail if other code calls
|
2741 |
|
|
cyg_mutex_release or
|
2742 |
|
|
cyg_thread_release, so if these functions may get
|
2743 |
|
|
used then it is important to check the return value. The current owner
|
2744 |
|
|
of a mutex should call cyg_mutex_unlock when a
|
2745 |
|
|
lock is no longer required. This operation must be performed by the
|
2746 |
|
|
owner, not by another thread.
|
2747 |
|
|
|
2748 |
|
|
|
2749 |
|
|
cyg_mutex_trylock is a variant of
|
2750 |
|
|
cyg_mutex_lock that will always return
|
2751 |
|
|
immediately, returning success or failure as appropriate. This
|
2752 |
|
|
function is rarely useful. Typical code locks a mutex just before
|
2753 |
|
|
entering a critical region, so if the lock cannot be claimed then
|
2754 |
|
|
there may be nothing else for the current thread to do. Use of this
|
2755 |
|
|
function may also cause a form of priority inversion if the owner
|
2756 |
|
|
owner runs at a lower priority, because the priority inheritance code
|
2757 |
|
|
will not be triggered. Instead the current thread continues running,
|
2758 |
|
|
preventing the owner from getting any cpu time, completing the
|
2759 |
|
|
critical region, and releasing the mutex.
|
2760 |
|
|
|
2761 |
|
|
|
2762 |
|
|
cyg_mutex_release can be used to wake up all
|
2763 |
|
|
threads that are currently blocked inside a call to
|
2764 |
|
|
cyg_mutex_lock for a specific mutex. These lock
|
2765 |
|
|
calls will return failure. The current mutex owner is not affected.
|
2766 |
|
|
|
2767 |
|
|
|
2768 |
|
|
|
2769 |
|
|
Priority Inversion
|
2770 |
|
|
|
2771 |
|
|
The use of mutexes gives rise to a problem known as priority
|
2772 |
|
|
inversion. In a typical scenario this requires three threads A, B, and
|
2773 |
|
|
C, running at high, medium and low priority respectively. Thread A and
|
2774 |
|
|
thread B are temporarily blocked waiting for some event, so thread C
|
2775 |
|
|
gets a chance to run, needs to enter a critical region, and locks
|
2776 |
|
|
a mutex. At this point threads A and B are woken up - the exact order
|
2777 |
|
|
does not matter. Thread A needs to claim the same mutex but has to
|
2778 |
|
|
wait until C has left the critical region and can release the mutex.
|
2779 |
|
|
Meanwhile thread B works on something completely different and can
|
2780 |
|
|
continue running without problems. Because thread C is running a lower
|
2781 |
|
|
priority than B it will not get a chance to run until B blocks for
|
2782 |
|
|
some reason, and hence thread A cannot run either. The overall effect
|
2783 |
|
|
is that a high-priority thread A cannot proceed because of a lower
|
2784 |
|
|
priority thread B, and priority inversion has occurred.
|
2785 |
|
|
|
2786 |
|
|
|
2787 |
|
|
In simple applications it may be possible to arrange the code such
|
2788 |
|
|
that priority inversion cannot occur, for example by ensuring that a
|
2789 |
|
|
given mutex is never shared by threads running at different priority
|
2790 |
|
|
levels. However this may not always be possible even at the
|
2791 |
|
|
application level. In addition mutexes may be used internally by
|
2792 |
|
|
underlying code, for example the memory allocation package, so careful
|
2793 |
|
|
analysis of the whole system would be needed to be sure that priority
|
2794 |
|
|
inversion cannot occur. Instead it is common practice to use one of
|
2795 |
|
|
two techniques: priority ceilings and priority inheritance.
|
2796 |
|
|
|
2797 |
|
|
|
2798 |
|
|
Priority ceilings involve associating a priority with each mutex.
|
2799 |
|
|
Usually this will match the highest priority thread that will ever
|
2800 |
|
|
lock the mutex. When a thread running at a lower priority makes a
|
2801 |
|
|
successful call to cyg_mutex_lock or
|
2802 |
|
|
cyg_mutex_trylock its priority will be boosted to
|
2803 |
|
|
that of the mutex. For example, given the previous example the
|
2804 |
|
|
priority associated with the mutex would be that of thread A, so for
|
2805 |
|
|
as long as it owns the mutex thread C will run in preference to thread
|
2806 |
|
|
B. When C releases the mutex its priority drops to the normal value
|
2807 |
|
|
again, allowing A to run and claim the mutex. Setting the
|
2808 |
|
|
priority for a mutex involves a call to
|
2809 |
|
|
cyg_mutex_set_ceiling, which is typically called
|
2810 |
|
|
during initialization. It is possible to change the ceiling
|
2811 |
|
|
dynamically but this will only affect subsequent lock operations, not
|
2812 |
|
|
the current owner of the mutex.
|
2813 |
|
|
|
2814 |
|
|
|
2815 |
|
|
Priority ceilings are very suitable for simple applications, where for
|
2816 |
|
|
every thread in the system it is possible to work out which mutexes
|
2817 |
|
|
will be accessed. For more complicated applications this may prove
|
2818 |
|
|
difficult, especially if thread priorities change at run-time. An
|
2819 |
|
|
additional problem occurs for any mutexes outside the application, for
|
2820 |
|
|
example used internally within eCos packages. A typical eCos package
|
2821 |
|
|
will be unaware of the details of the various threads in the system,
|
2822 |
|
|
so it will have no way of setting suitable ceilings for its internal
|
2823 |
|
|
mutexes. If those mutexes are not exported to application code then
|
2824 |
|
|
using priority ceilings may not be viable. The kernel does provide a
|
2825 |
|
|
configuration option
|
2826 |
|
|
CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT_PRIORITY
|
2827 |
|
|
that can be used to set the default priority ceiling for all mutexes,
|
2828 |
|
|
which may prove sufficient.
|
2829 |
|
|
|
2830 |
|
|
|
2831 |
|
|
The alternative approach is to use priority inheritance: if a thread
|
2832 |
|
|
calls cyg_mutex_lock for a mutex that it
|
2833 |
|
|
currently owned by a lower-priority thread, then the owner will have
|
2834 |
|
|
its priority raised to that of the current thread. Often this is more
|
2835 |
|
|
efficient than priority ceilings because priority boosting only
|
2836 |
|
|
happens when necessary, not for every lock operation, and the required
|
2837 |
|
|
priority is determined at run-time rather than by static analysis.
|
2838 |
|
|
However there are complications when multiple threads running at
|
2839 |
|
|
different priorities try to lock a single mutex, or when the current
|
2840 |
|
|
owner of a mutex then tries to lock additional mutexes, and this makes
|
2841 |
|
|
the implementation significantly more complicated than priority
|
2842 |
|
|
ceilings.
|
2843 |
|
|
|
2844 |
|
|
|
2845 |
|
|
There are a number of configuration options associated with priority
|
2846 |
|
|
inversion. First, if after careful analysis it is known that priority
|
2847 |
|
|
inversion cannot arise then the component
|
2848 |
|
|
CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
|
2849 |
|
|
can be disabled. More commonly this component will be enabled, and one
|
2850 |
|
|
of either
|
2851 |
|
|
CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT
|
2852 |
|
|
or
|
2853 |
|
|
CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING
|
2854 |
|
|
will be selected, so that one of the two protocols is available for
|
2855 |
|
|
all mutexes. It is possible to select multiple protocols, so that some
|
2856 |
|
|
mutexes can have priority ceilings while others use priority
|
2857 |
|
|
inheritance or no priority inversion protection at all. Obviously this
|
2858 |
|
|
flexibility will add to the code size and to the cost of mutex
|
2859 |
|
|
operations. The default for all mutexes will be controlled by
|
2860 |
|
|
CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DEFAULT,
|
2861 |
|
|
and can be changed at run-time using
|
2862 |
|
|
cyg_mutex_set_protocol.
|
2863 |
|
|
|
2864 |
|
|
|
2865 |
|
|
Priority inversion problems can also occur with other synchronization
|
2866 |
|
|
primitives such as semaphores. For example there could be a situation
|
2867 |
|
|
where a high-priority thread A is waiting on a semaphore, a
|
2868 |
|
|
low-priority thread C needs to do just a little bit more work before
|
2869 |
|
|
posting the semaphore, but a medium priority thread B is running and
|
2870 |
|
|
preventing C from making progress. However a semaphore does not have
|
2871 |
|
|
the concept of an owner, so there is no way for the system to know
|
2872 |
|
|
that it is thread C which would next post to the semaphore. Hence
|
2873 |
|
|
there is no way for the system to boost the priority of C
|
2874 |
|
|
automatically and prevent the priority inversion. Instead situations
|
2875 |
|
|
like this have to be detected by application developers and
|
2876 |
|
|
appropriate precautions have to be taken, for example making sure that
|
2877 |
|
|
all the threads run at suitable priorities at all times.
|
2878 |
|
|
|
2879 |
|
|
|
2880 |
|
|
The current implementation of priority inheritance within the eCos
|
2881 |
|
|
kernel does not handle certain exceptional circumstances completely
|
2882 |
|
|
correctly. Problems will only arise if a thread owns one mutex,
|
2883 |
|
|
then attempts to claim another mutex, and there are other threads
|
2884 |
|
|
attempting to lock these same mutexes. Although the system will
|
2885 |
|
|
continue running, the current owners of the various mutexes involved
|
2886 |
|
|
may not run at the priority they should. This situation never arises
|
2887 |
|
|
in typical code because a mutex will only be locked for a small
|
2888 |
|
|
critical region, and there is no need to manipulate other shared resources
|
2889 |
|
|
inside this region. A more complicated implementation of priority
|
2890 |
|
|
inheritance is possible but would add significant overhead and certain
|
2891 |
|
|
operations would no longer be deterministic.
|
2892 |
|
|
|
2893 |
|
|
|
2894 |
|
|
Support for priority ceilings and priority inheritance is not
|
2895 |
|
|
implemented for all schedulers. In particular neither priority
|
2896 |
|
|
ceilings nor priority inheritance are currently available for the
|
2897 |
|
|
bitmap scheduler.
|
2898 |
|
|
|
2899 |
|
|
|
2900 |
|
|
|
2901 |
|
|
Alternatives
|
2902 |
|
|
|
2903 |
|
|
In nearly all circumstances, if two or more threads need to share some
|
2904 |
|
|
data then protecting this data with a mutex is the correct thing to
|
2905 |
|
|
do. Mutexes are the only primitive that combine a locking mechanism
|
2906 |
|
|
and protection against priority inversion problems. However this
|
2907 |
|
|
functionality is achieved at a cost, and in exceptional circumstances
|
2908 |
|
|
such as an application's most critical inner loop it may be desirable
|
2909 |
|
|
to use some other means of locking.
|
2910 |
|
|
|
2911 |
|
|
|
2912 |
|
|
When a critical region is very very small it is possible to lock the
|
2913 |
|
|
scheduler, thus ensuring that no other thread can run until the
|
2914 |
|
|
scheduler is unlocked again. This is achieved with calls to
|
2915 |
|
|
linkend="kernel-schedcontrol">cyg_scheduler_lock
|
2916 |
|
|
and cyg_scheduler_unlock. If the critical region
|
2917 |
|
|
is sufficiently small then this can actually improve both performance
|
2918 |
|
|
and dispatch latency because cyg_mutex_lock also
|
2919 |
|
|
locks the scheduler for a brief period of time. This approach will not
|
2920 |
|
|
work on SMP systems because another thread may already be running on a
|
2921 |
|
|
different processor and accessing the critical region.
|
2922 |
|
|
|
2923 |
|
|
|
2924 |
|
|
Another way of avoiding the use of mutexes is to make sure that all
|
2925 |
|
|
threads that access a particular critical region run at the same
|
2926 |
|
|
priority and configure the system with timeslicing disabled
|
2927 |
|
|
(CYGSEM_KERNEL_SCHED_TIMESLICE). Without
|
2928 |
|
|
timeslicing a thread can only be preempted by a higher-priority one,
|
2929 |
|
|
or if it performs some operation that can block. This approach
|
2930 |
|
|
requires that none of the operations in the critical region can block,
|
2931 |
|
|
so for example it is not legal to call
|
2932 |
|
|
cyg_semaphore_wait. It is also vulnerable to
|
2933 |
|
|
any changes in the configuration or to the various thread priorities:
|
2934 |
|
|
any such changes may now have unexpected side effects. It will not
|
2935 |
|
|
work on SMP systems.
|
2936 |
|
|
|
2937 |
|
|
|
2938 |
|
|
|
2939 |
|
|
Recursive Mutexes
|
2940 |
|
|
|
2941 |
|
|
The implementation of mutexes within the eCos kernel does not support
|
2942 |
|
|
recursive locks. If a thread has locked a mutex and then attempts to
|
2943 |
|
|
lock the mutex again, typically as a result of some recursive call in
|
2944 |
|
|
a complicated call graph, then either an assertion failure will be
|
2945 |
|
|
reported or the thread will deadlock. This behaviour is deliberate.
|
2946 |
|
|
When a thread has just locked a mutex associated with some data
|
2947 |
|
|
structure, it can assume that that data structure is in a consistent
|
2948 |
|
|
state. Before unlocking the mutex again it must ensure that the data
|
2949 |
|
|
structure is again in a consistent state. Recursive mutexes allow a
|
2950 |
|
|
thread to make arbitrary changes to a data structure, then in a
|
2951 |
|
|
recursive call lock the mutex again while the data structure is still
|
2952 |
|
|
inconsistent. The net result is that code can no longer make any
|
2953 |
|
|
assumptions about data structure consistency, which defeats the
|
2954 |
|
|
purpose of using mutexes.
|
2955 |
|
|
|
2956 |
|
|
|
2957 |
|
|
|
2958 |
|
|
Valid contexts
|
2959 |
|
|
|
2960 |
|
|
cyg_mutex_init,
|
2961 |
|
|
cyg_mutex_set_ceiling and
|
2962 |
|
|
cyg_mutex_set_protocol are normally called during
|
2963 |
|
|
initialization but may also be called from thread context. The
|
2964 |
|
|
remaining functions should only be called from thread context. Mutexes
|
2965 |
|
|
serve as a mutual exclusion mechanism between threads, and cannot be
|
2966 |
|
|
used to synchronize between threads and the interrupt handling
|
2967 |
|
|
subsystem. If a critical region is shared between a thread and a DSR
|
2968 |
|
|
then it must be protected using
|
2969 |
|
|
linkend="kernel-schedcontrol">cyg_scheduler_lock
|
2970 |
|
|
and cyg_scheduler_unlock. If a critical region is
|
2971 |
|
|
shared between a thread and an ISR, it must be protected by disabling
|
2972 |
|
|
or masking interrupts. Obviously these operations must be used with
|
2973 |
|
|
care because they can affect dispatch and interrupt latencies.
|
2974 |
|
|
|
2975 |
|
|
|
2976 |
|
|
|
2977 |
|
|
|
2978 |
|
|
|
2979 |
|
|
|
2980 |
|
|
|
2981 |
|
|
|
2982 |
|
|
|
2983 |
|
|
|
2984 |
|
|
|
2985 |
|
|
Condition Variables
|
2986 |
|
|
|
2987 |
|
|
|
2988 |
|
|
|
2989 |
|
|
cyg_cond_init
|
2990 |
|
|
cyg_cond_destroy
|
2991 |
|
|
cyg_cond_wait
|
2992 |
|
|
cyg_cond_timed_wait
|
2993 |
|
|
cyg_cond_signal
|
2994 |
|
|
cyg_cond_broadcast
|
2995 |
|
|
Synchronization primitive
|
2996 |
|
|
|
2997 |
|
|
|
2998 |
|
|
|
2999 |
|
|
|
3000 |
|
|
|
3001 |
|
|
#include <cyg/kernel/kapi.h>
|
3002 |
|
|
|
3003 |
|
|
|
3004 |
|
|
void cyg_cond_init
|
3005 |
|
|
cyg_cond_t* cond
|
3006 |
|
|
cyg_mutex_t* mutex
|
3007 |
|
|
|
3008 |
|
|
|
3009 |
|
|
void cyg_cond_destroy
|
3010 |
|
|
cyg_cond_t* cond
|
3011 |
|
|
|
3012 |
|
|
|
3013 |
|
|
cyg_bool_t cyg_cond_wait
|
3014 |
|
|
cyg_cond_t* cond
|
3015 |
|
|
|
3016 |
|
|
|
3017 |
|
|
cyg_bool_t cyg_cond_timed_wait
|
3018 |
|
|
cyg_cond_t* cond
|
3019 |
|
|
cyg_tick_count_t abstime
|
3020 |
|
|
|
3021 |
|
|
|
3022 |
|
|
void cyg_cond_signal
|
3023 |
|
|
cyg_cond_t* cond
|
3024 |
|
|
|
3025 |
|
|
|
3026 |
|
|
void cyg_cond_broadcast
|
3027 |
|
|
cyg_cond_t* cond
|
3028 |
|
|
|
3029 |
|
|
|
3030 |
|
|
|
3031 |
|
|
|
3032 |
|
|
Description
|
3033 |
|
|
|
3034 |
|
|
|
3035 |
|
|
Condition variables are used in conjunction with mutexes to implement
|
3036 |
|
|
long-term waits for some condition to become true. For example
|
3037 |
|
|
consider a set of functions that control access to a pool of
|
3038 |
|
|
resources:
|
3039 |
|
|
|
3040 |
|
|
|
3041 |
|
|
|
3042 |
|
|
|
3043 |
|
|
cyg_mutex_t res_lock;
|
3044 |
|
|
res_t res_pool[RES_MAX];
|
3045 |
|
|
int res_count = RES_MAX;
|
3046 |
|
|
|
3047 |
|
|
void res_init(void)
|
3048 |
|
|
{
|
3049 |
|
|
cyg_mutex_init(&res_lock);
|
3050 |
|
|
<fill pool with resources>
|
3051 |
|
|
}
|
3052 |
|
|
|
3053 |
|
|
res_t res_allocate(void)
|
3054 |
|
|
{
|
3055 |
|
|
res_t res;
|
3056 |
|
|
|
3057 |
|
|
cyg_mutex_lock(&res_lock); // lock the mutex
|
3058 |
|
|
|
3059 |
|
|
if( res_count == 0 ) // check for free resource
|
3060 |
|
|
res = RES_NONE; // return RES_NONE if none
|
3061 |
|
|
else
|
3062 |
|
|
{
|
3063 |
|
|
res_count--; // allocate a resources
|
3064 |
|
|
res = res_pool[res_count];
|
3065 |
|
|
}
|
3066 |
|
|
|
3067 |
|
|
cyg_mutex_unlock(&res_lock); // unlock the mutex
|
3068 |
|
|
|
3069 |
|
|
return res;
|
3070 |
|
|
}
|
3071 |
|
|
|
3072 |
|
|
void res_free(res_t res)
|
3073 |
|
|
{
|
3074 |
|
|
cyg_mutex_lock(&res_lock); // lock the mutex
|
3075 |
|
|
|
3076 |
|
|
res_pool[res_count] = res; // free the resource
|
3077 |
|
|
res_count++;
|
3078 |
|
|
|
3079 |
|
|
cyg_mutex_unlock(&res_lock); // unlock the mutex
|
3080 |
|
|
}
|
3081 |
|
|
|
3082 |
|
|
|
3083 |
|
|
|
3084 |
|
|
These routines use the variable res_count to keep
|
3085 |
|
|
track of the resources available. If there are none then
|
3086 |
|
|
res_allocate returns RES_NONE,
|
3087 |
|
|
which the caller must check for and take appropriate error handling
|
3088 |
|
|
actions.
|
3089 |
|
|
|
3090 |
|
|
|
3091 |
|
|
|
3092 |
|
|
Now suppose that we do not want to return
|
3093 |
|
|
RES_NONE when there are no resources, but want to
|
3094 |
|
|
wait for one to become available. This is where a condition variable
|
3095 |
|
|
can be used:
|
3096 |
|
|
|
3097 |
|
|
|
3098 |
|
|
|
3099 |
|
|
|
3100 |
|
|
cyg_mutex_t res_lock;
|
3101 |
|
|
cyg_cond_t res_wait;
|
3102 |
|
|
res_t res_pool[RES_MAX];
|
3103 |
|
|
int res_count = RES_MAX;
|
3104 |
|
|
|
3105 |
|
|
void res_init(void)
|
3106 |
|
|
{
|
3107 |
|
|
cyg_mutex_init(&res_lock);
|
3108 |
|
|
cyg_cond_init(&res_wait, &res_lock);
|
3109 |
|
|
<fill pool with resources>
|
3110 |
|
|
}
|
3111 |
|
|
|
3112 |
|
|
res_t res_allocate(void)
|
3113 |
|
|
{
|
3114 |
|
|
res_t res;
|
3115 |
|
|
|
3116 |
|
|
cyg_mutex_lock(&res_lock); // lock the mutex
|
3117 |
|
|
|
3118 |
|
|
while( res_count == 0 ) // wait for a resources
|
3119 |
|
|
cyg_cond_wait(&res_wait);
|
3120 |
|
|
|
3121 |
|
|
res_count--; // allocate a resource
|
3122 |
|
|
res = res_pool[res_count];
|
3123 |
|
|
|
3124 |
|
|
cyg_mutex_unlock(&res_lock); // unlock the mutex
|
3125 |
|
|
|
3126 |
|
|
return res;
|
3127 |
|
|
}
|
3128 |
|
|
|
3129 |
|
|
void res_free(res_t res)
|
3130 |
|
|
{
|
3131 |
|
|
cyg_mutex_lock(&res_lock); // lock the mutex
|
3132 |
|
|
|
3133 |
|
|
res_pool[res_count] = res; // free the resource
|
3134 |
|
|
res_count++;
|
3135 |
|
|
|
3136 |
|
|
cyg_cond_signal(&res_wait); // wake up any waiting allocators
|
3137 |
|
|
|
3138 |
|
|
cyg_mutex_unlock(&res_lock); // unlock the mutex
|
3139 |
|
|
}
|
3140 |
|
|
|
3141 |
|
|
|
3142 |
|
|
|
3143 |
|
|
In this version of the code, when res_allocate
|
3144 |
|
|
detects that there are no resources it calls
|
3145 |
|
|
cyg_cond_wait. This does two things: it unlocks
|
3146 |
|
|
the mutex, and puts the calling thread to sleep on the condition
|
3147 |
|
|
variable. When res_free is eventually called, it
|
3148 |
|
|
puts a resource back into the pool and calls
|
3149 |
|
|
cyg_cond_signal to wake up any thread waiting on
|
3150 |
|
|
the condition variable. When the waiting thread eventually gets to run again,
|
3151 |
|
|
it will re-lock the mutex before returning from
|
3152 |
|
|
cyg_cond_wait.
|
3153 |
|
|
|
3154 |
|
|
|
3155 |
|
|
|
3156 |
|
|
There are two important things to note about the way in which this
|
3157 |
|
|
code works. The first is that the mutex unlock and wait in
|
3158 |
|
|
cyg_cond_wait are atomic: no other thread can run
|
3159 |
|
|
between the unlock and the wait. If this were not the case then a call
|
3160 |
|
|
to res_free by that thread would release the
|
3161 |
|
|
resource but the call to cyg_cond_signal would be
|
3162 |
|
|
lost, and the first thread would end up waiting when there were
|
3163 |
|
|
resources available.
|
3164 |
|
|
|
3165 |
|
|
|
3166 |
|
|
|
3167 |
|
|
The second feature is that the call to
|
3168 |
|
|
cyg_cond_wait is in a while
|
3169 |
|
|
loop and not a simple if statement. This is because
|
3170 |
|
|
of the need to re-lock the mutex in cyg_cond_wait
|
3171 |
|
|
when the signalled thread reawakens. If there are other threads
|
3172 |
|
|
already queued to claim the lock then this thread must wait. Depending
|
3173 |
|
|
on the scheduler and the queue order, many other threads may have
|
3174 |
|
|
entered the critical section before this one gets to run. So the
|
3175 |
|
|
condition that it was waiting for may have been rendered false. Using
|
3176 |
|
|
a loop around all condition variable wait operations is the only way
|
3177 |
|
|
to guarantee that the condition being waited for is still true after
|
3178 |
|
|
waiting.
|
3179 |
|
|
|
3180 |
|
|
|
3181 |
|
|
|
3182 |
|
|
Before a condition variable can be used it must be initialized with a
|
3183 |
|
|
call to cyg_cond_init. This requires two
|
3184 |
|
|
arguments, memory for the data structure and a pointer to an existing
|
3185 |
|
|
mutex. This mutex will not be initialized by
|
3186 |
|
|
cyg_cond_init, instead a separate call to
|
3187 |
|
|
cyg_mutex_init is required. If a condition
|
3188 |
|
|
variable is no longer required and there are no threads waiting on it
|
3189 |
|
|
then cyg_cond_destroy can be used.
|
3190 |
|
|
|
3191 |
|
|
|
3192 |
|
|
When a thread needs to wait for a condition to be satisfied it can
|
3193 |
|
|
call cyg_cond_wait. The thread must have already
|
3194 |
|
|
locked the mutex that was specified in the
|
3195 |
|
|
cyg_cond_init call. This mutex will be unlocked
|
3196 |
|
|
and the current thread will be suspended in an atomic operation. When
|
3197 |
|
|
some other thread performs a signal or broadcast operation the current
|
3198 |
|
|
thread will be woken up and automatically reclaim ownership of the mutex
|
3199 |
|
|
again, allowing it to examine global state and determine whether or
|
3200 |
|
|
not the condition is now satisfied. The kernel supplies a variant of
|
3201 |
|
|
this function, cyg_cond_timed_wait, which can be
|
3202 |
|
|
used to wait on the condition variable or until some number of clock
|
3203 |
|
|
ticks have occurred. The mutex will always be reclaimed before
|
3204 |
|
|
cyg_cond_timed_wait returns, regardless of
|
3205 |
|
|
whether it was a result of a signal operation or a timeout.
|
3206 |
|
|
|
3207 |
|
|
|
3208 |
|
|
There is no cyg_cond_trywait function because
|
3209 |
|
|
this would not serve any purpose. If a thread has locked the mutex and
|
3210 |
|
|
determined that the condition is satisfied, it can just release the
|
3211 |
|
|
mutex and return. There is no need to perform any operation on the
|
3212 |
|
|
condition variable.
|
3213 |
|
|
|
3214 |
|
|
|
3215 |
|
|
When a thread changes shared state that may affect some other thread
|
3216 |
|
|
blocked on a condition variable, it should call either
|
3217 |
|
|
cyg_cond_signal or
|
3218 |
|
|
cyg_cond_broadcast. These calls do not require
|
3219 |
|
|
ownership of the mutex, but usually the mutex will have been claimed
|
3220 |
|
|
before updating the shared state. A signal operation only wakes up the
|
3221 |
|
|
first thread that is waiting on the condition variable, while a
|
3222 |
|
|
broadcast wakes up all the threads. If there are no threads waiting on
|
3223 |
|
|
the condition variable at the time, then the signal or broadcast will
|
3224 |
|
|
have no effect: past signals are not counted up or remembered in any
|
3225 |
|
|
way. Typically a signal should be used when all threads will check the
|
3226 |
|
|
same condition and at most one thread can continue running. A
|
3227 |
|
|
broadcast should be used if threads check slightly different
|
3228 |
|
|
conditions, or if the change to the global state might allow multiple
|
3229 |
|
|
threads to proceed.
|
3230 |
|
|
|
3231 |
|
|
|
3232 |
|
|
|
3233 |
|
|
Valid contexts
|
3234 |
|
|
|
3235 |
|
|
cyg_cond_init is typically called during system
|
3236 |
|
|
initialization but may also be called in thread context. The same
|
3237 |
|
|
applies to cyg_cond_delete.
|
3238 |
|
|
cyg_cond_wait and
|
3239 |
|
|
cyg_cond_timedwait may only be called from thread
|
3240 |
|
|
context since they may block. cyg_cond_signal and
|
3241 |
|
|
cyg_cond_broadcast may be called from thread or
|
3242 |
|
|
DSR context.
|
3243 |
|
|
|
3244 |
|
|
|
3245 |
|
|
|
3246 |
|
|
|
3247 |
|
|
|
3248 |
|
|
|
3249 |
|
|
|
3250 |
|
|
|
3251 |
|
|
|
3252 |
|
|
|
3253 |
|
|
|
3254 |
|
|
Semaphores
|
3255 |
|
|
|
3256 |
|
|
|
3257 |
|
|
|
3258 |
|
|
cyg_semaphore_init
|
3259 |
|
|
cyg_semaphore_destroy
|
3260 |
|
|
cyg_semaphore_wait
|
3261 |
|
|
cyg_semaphore_timed_wait
|
3262 |
|
|
cyg_semaphore_post
|
3263 |
|
|
cyg_semaphore_peek
|
3264 |
|
|
Synchronization primitive
|
3265 |
|
|
|
3266 |
|
|
|
3267 |
|
|
|
3268 |
|
|
|
3269 |
|
|
|
3270 |
|
|
#include <cyg/kernel/kapi.h>
|
3271 |
|
|
|
3272 |
|
|
|
3273 |
|
|
void cyg_semaphore_init
|
3274 |
|
|
cyg_sem_t* sem
|
3275 |
|
|
cyg_count32 val
|
3276 |
|
|
|
3277 |
|
|
|
3278 |
|
|
void cyg_semaphore_destroy
|
3279 |
|
|
cyg_sem_t* sem
|
3280 |
|
|
|
3281 |
|
|
|
3282 |
|
|
cyg_bool_t cyg_semaphore_wait
|
3283 |
|
|
cyg_sem_t* sem
|
3284 |
|
|
|
3285 |
|
|
|
3286 |
|
|
cyg_bool_t cyg_semaphore_timed_wait
|
3287 |
|
|
cyg_sem_t* sem
|
3288 |
|
|
cyg_tick_count_t abstime
|
3289 |
|
|
|
3290 |
|
|
|
3291 |
|
|
cyg_bool_t cyg_semaphore_trywait
|
3292 |
|
|
cyg_sem_t* sem
|
3293 |
|
|
|
3294 |
|
|
|
3295 |
|
|
void cyg_semaphore_post
|
3296 |
|
|
cyg_sem_t* sem
|
3297 |
|
|
|
3298 |
|
|
|
3299 |
|
|
void cyg_semaphore_peek
|
3300 |
|
|
cyg_sem_t* sem
|
3301 |
|
|
cyg_count32* val
|
3302 |
|
|
|
3303 |
|
|
|
3304 |
|
|
|
3305 |
|
|
|
3306 |
|
|
Description
|
3307 |
|
|
|
3308 |
|
|
Counting semaphores are a
|
3309 |
|
|
linkend="kernel-overview-synch-primitives">synchronization
|
3310 |
|
|
primitive that allow threads to wait until an event has
|
3311 |
|
|
occurred. The event may be generated by a producer thread, or by a DSR
|
3312 |
|
|
in response to a hardware interrupt. Associated with each semaphore is
|
3313 |
|
|
an integer counter that keeps track of the number of events that have
|
3314 |
|
|
not yet been processed. If this counter is zero, an attempt by a
|
3315 |
|
|
consumer thread to wait on the semaphore will block until some other
|
3316 |
|
|
thread or a DSR posts a new event to the semaphore. If the counter is
|
3317 |
|
|
greater than zero then an attempt to wait on the semaphore will
|
3318 |
|
|
consume one event, in other words decrement the counter, and return
|
3319 |
|
|
immediately. Posting to a semaphore will wake up the first thread that
|
3320 |
|
|
is currently waiting, which will then resume inside the semaphore wait
|
3321 |
|
|
operation and decrement the counter again.
|
3322 |
|
|
|
3323 |
|
|
|
3324 |
|
|
Another use of semaphores is for certain forms of resource management.
|
3325 |
|
|
The counter would correspond to how many of a certain type of resource
|
3326 |
|
|
are currently available, with threads waiting on the semaphore to
|
3327 |
|
|
claim a resource and posting to release the resource again. In
|
3328 |
|
|
practice condition
|
3329 |
|
|
variables are usually much better suited for operations like
|
3330 |
|
|
this.
|
3331 |
|
|
|
3332 |
|
|
|
3333 |
|
|
cyg_semaphore_init is used to initialize a
|
3334 |
|
|
semaphore. It takes two arguments, a pointer to a
|
3335 |
|
|
cyg_sem_t structure and an initial value for
|
3336 |
|
|
the counter. Note that semaphore operations, unlike some other parts
|
3337 |
|
|
of the kernel API, use pointers to data structures rather than
|
3338 |
|
|
handles. This makes it easier to embed semaphores in a larger data
|
3339 |
|
|
structure. The initial counter value can be any number, zero, positive
|
3340 |
|
|
or negative, but typically a value of zero is used to indicate that no
|
3341 |
|
|
events have occurred yet.
|
3342 |
|
|
|
3343 |
|
|
|
3344 |
|
|
cyg_semaphore_wait is used by a consumer thread
|
3345 |
|
|
to wait for an event. If the current counter is greater than 0, in
|
3346 |
|
|
other words if the event has already occurred in the past, then the
|
3347 |
|
|
counter will be decremented and the call will return immediately.
|
3348 |
|
|
Otherwise the current thread will be blocked until there is a
|
3349 |
|
|
cyg_semaphore_post call.
|
3350 |
|
|
|
3351 |
|
|
|
3352 |
|
|
cyg_semaphore_post is called when an event has
|
3353 |
|
|
occurs. This increments the counter and wakes up the first thread
|
3354 |
|
|
waiting on the semaphore (if any). Usually that thread will then
|
3355 |
|
|
continue running inside cyg_semaphore_wait and
|
3356 |
|
|
decrement the counter again. However other scenarioes are possible.
|
3357 |
|
|
For example the thread calling cyg_semaphore_post
|
3358 |
|
|
may be running at high priority, some other thread running at medium
|
3359 |
|
|
priority may be about to call cyg_semaphore_wait
|
3360 |
|
|
when it next gets a chance to run, and a low priority thread may be
|
3361 |
|
|
waiting on the semaphore. What will happen is that the current high
|
3362 |
|
|
priority thread continues running until it is descheduled for some
|
3363 |
|
|
reason, then the medium priority thread runs and its call to
|
3364 |
|
|
cyg_semaphore_wait succeeds immediately, and
|
3365 |
|
|
later on the low priority thread runs again, discovers a counter value
|
3366 |
|
|
of 0, and blocks until another event is posted. If there are multiple
|
3367 |
|
|
threads blocked on a semaphore then the configuration option
|
3368 |
|
|
CYGIMP_KERNEL_SCHED_SORTED_QUEUES determines which
|
3369 |
|
|
one will be woken up by a post operation.
|
3370 |
|
|
|
3371 |
|
|
|
3372 |
|
|
cyg_semaphore_wait returns a boolean. Normally it
|
3373 |
|
|
will block until it has successfully decremented the counter, retrying
|
3374 |
|
|
as necessary, and return success. However the wait operation may be
|
3375 |
|
|
aborted by a call to
|
3376 |
|
|
linkend="kernel-thread-control">cyg_thread_release,
|
3377 |
|
|
and cyg_semaphore_wait will then return false.
|
3378 |
|
|
|
3379 |
|
|
|
3380 |
|
|
cyg_semaphore_timed_wait is a variant of
|
3381 |
|
|
cyg_semaphore_wait. It can be used to wait until
|
3382 |
|
|
either an event has occurred or a number of clock ticks have happened.
|
3383 |
|
|
The function returns success if the semaphore wait operation
|
3384 |
|
|
succeeded, or false if the operation timed out or was aborted by
|
3385 |
|
|
cyg_thread_release. If support for the real-time
|
3386 |
|
|
clock has been removed from the current configuration then this
|
3387 |
|
|
function will not be available.
|
3388 |
|
|
cyg_semaphore_trywait is another variant which
|
3389 |
|
|
will always return immediately rather than block, again returning
|
3390 |
|
|
success or failure.
|
3391 |
|
|
|
3392 |
|
|
|
3393 |
|
|
cyg_semaphore_peek can be used to get hold of the
|
3394 |
|
|
current counter value. This function is rarely useful except for
|
3395 |
|
|
debugging purposes since the counter value may change at any time if
|
3396 |
|
|
some other thread or a DSR performs a semaphore operation.
|
3397 |
|
|
|
3398 |
|
|
|
3399 |
|
|
|
3400 |
|
|
Valid contexts
|
3401 |
|
|
|
3402 |
|
|
cyg_semaphore_init is normally called during
|
3403 |
|
|
initialization but may also be called from thread context.
|
3404 |
|
|
cyg_semaphore_wait and
|
3405 |
|
|
cyg_semaphore_timed_wait may only be called from
|
3406 |
|
|
thread context because these operations may block.
|
3407 |
|
|
cyg_semaphore_trywait,
|
3408 |
|
|
cyg_semaphore_post and
|
3409 |
|
|
cyg_semaphore_peek may be called from thread or
|
3410 |
|
|
DSR context.
|
3411 |
|
|
|
3412 |
|
|
|
3413 |
|
|
|
3414 |
|
|
|
3415 |
|
|
|
3416 |
|
|
|
3417 |
|
|
|
3418 |
|
|
|
3419 |
|
|
|
3420 |
|
|
|
3421 |
|
|
|
3422 |
|
|
Mail boxes
|
3423 |
|
|
|
3424 |
|
|
|
3425 |
|
|
|
3426 |
|
|
cyg_mbox_create
|
3427 |
|
|
cyg_mbox_delete
|
3428 |
|
|
cyg_mbox_get
|
3429 |
|
|
cyg_mbox_timed_get
|
3430 |
|
|
cyg_mbox_tryget
|
3431 |
|
|
cyg_mbox_peek_item
|
3432 |
|
|
cyg_mbox_put
|
3433 |
|
|
cyg_mbox_timed_put
|
3434 |
|
|
cyg_mbox_tryput
|
3435 |
|
|
cyg_mbox_peek
|
3436 |
|
|
cyg_mbox_waiting_to_get
|
3437 |
|
|
cyg_mbox_waiting_to_put
|
3438 |
|
|
Synchronization primitive
|
3439 |
|
|
|
3440 |
|
|
|
3441 |
|
|
|
3442 |
|
|
|
3443 |
|
|
|
3444 |
|
|
#include <cyg/kernel/kapi.h>
|
3445 |
|
|
|
3446 |
|
|
|
3447 |
|
|
void cyg_mbox_create
|
3448 |
|
|
cyg_handle_t* handle
|
3449 |
|
|
cyg_mbox* mbox
|
3450 |
|
|
|
3451 |
|
|
|
3452 |
|
|
void cyg_mbox_delete
|
3453 |
|
|
cyg_handle_t mbox
|
3454 |
|
|
|
3455 |
|
|
|
3456 |
|
|
void* cyg_mbox_get
|
3457 |
|
|
cyg_handle_t mbox
|
3458 |
|
|
|
3459 |
|
|
|
3460 |
|
|
void* cyg_mbox_timed_get
|
3461 |
|
|
cyg_handle_t mbox
|
3462 |
|
|
cyg_tick_count_t abstime
|
3463 |
|
|
|
3464 |
|
|
|
3465 |
|
|
void* cyg_mbox_tryget
|
3466 |
|
|
cyg_handle_t mbox
|
3467 |
|
|
|
3468 |
|
|
|
3469 |
|
|
cyg_count32 cyg_mbox_peek
|
3470 |
|
|
cyg_handle_t mbox
|
3471 |
|
|
|
3472 |
|
|
|
3473 |
|
|
void* cyg_mbox_peek_item
|
3474 |
|
|
cyg_handle_t mbox
|
3475 |
|
|
|
3476 |
|
|
|
3477 |
|
|
cyg_bool_t cyg_mbox_put
|
3478 |
|
|
cyg_handle_t mbox
|
3479 |
|
|
void* item
|
3480 |
|
|
|
3481 |
|
|
|
3482 |
|
|
cyg_bool_t cyg_mbox_timed_put
|
3483 |
|
|
cyg_handle_t mbox
|
3484 |
|
|
void* item
|
3485 |
|
|
cyg_tick_count_t abstime
|
3486 |
|
|
|
3487 |
|
|
|
3488 |
|
|
cyg_bool_t cyg_mbox_tryput
|
3489 |
|
|
cyg_handle_t mbox
|
3490 |
|
|
void* item
|
3491 |
|
|
|
3492 |
|
|
|
3493 |
|
|
cyg_bool_t cyg_mbox_waiting_to_get
|
3494 |
|
|
cyg_handle_t mbox
|
3495 |
|
|
|
3496 |
|
|
|
3497 |
|
|
cyg_bool_t cyg_mbox_waiting_to_put
|
3498 |
|
|
cyg_handle_t mbox
|
3499 |
|
|
|
3500 |
|
|
|
3501 |
|
|
|
3502 |
|
|
|
3503 |
|
|
Description
|
3504 |
|
|
|
3505 |
|
|
Mail boxes are a synchronization primitive. Like semaphores they
|
3506 |
|
|
can be used by a consumer thread to wait until a certain event has
|
3507 |
|
|
occurred, but the producer also has the ability to transmit some data
|
3508 |
|
|
along with each event. This data, the message, is normally a pointer
|
3509 |
|
|
to some data structure. It is stored in the mail box itself, so the
|
3510 |
|
|
producer thread that generates the event and provides the data usually
|
3511 |
|
|
does not have to block until some consumer thread is ready to receive
|
3512 |
|
|
the event. However a mail box will only have a finite capacity,
|
3513 |
|
|
typically ten slots. Even if the system is balanced and events are
|
3514 |
|
|
typically consumed at least as fast as they are generated, a burst of
|
3515 |
|
|
events can cause the mail box to fill up and the generating thread
|
3516 |
|
|
will block until space is available again. This behaviour is very
|
3517 |
|
|
different from semaphores, where it is only necessary to maintain a
|
3518 |
|
|
counter and hence an overflow is unlikely.
|
3519 |
|
|
|
3520 |
|
|
|
3521 |
|
|
Before a mail box can be used it must be created with a call to
|
3522 |
|
|
cyg_mbox_create. Each mail box has a unique
|
3523 |
|
|
handle which will be returned via the first argument and which should
|
3524 |
|
|
be used for subsequent operations.
|
3525 |
|
|
cyg_mbox_create also requires an area of memory
|
3526 |
|
|
for the kernel structure, which is provided by the
|
3527 |
|
|
cyg_mbox second argument. If a mail box is
|
3528 |
|
|
no longer required then cyg_mbox_delete can be
|
3529 |
|
|
used. This will simply discard any messages that remain posted.
|
3530 |
|
|
|
3531 |
|
|
|
3532 |
|
|
The main function for waiting on a mail box is
|
3533 |
|
|
cyg_mbox_get. If there is a pending message
|
3534 |
|
|
because of a call to cyg_mbox_put then
|
3535 |
|
|
cyg_mbox_get will return immediately with the
|
3536 |
|
|
message that was put into the mail box. Otherwise this function
|
3537 |
|
|
will block until there is a put operation. Exceptionally the thread
|
3538 |
|
|
can instead be unblocked by a call to
|
3539 |
|
|
cyg_thread_release, in which case
|
3540 |
|
|
cyg_mbox_get will return a null pointer. It is
|
3541 |
|
|
assumed that there will never be a call to
|
3542 |
|
|
cyg_mbox_put with a null pointer, because it
|
3543 |
|
|
would not be possible to distinguish between that and a release
|
3544 |
|
|
operation. Messages are always retrieved in the order in which they
|
3545 |
|
|
were put into the mail box, and there is no support for messages
|
3546 |
|
|
with different priorities.
|
3547 |
|
|
|
3548 |
|
|
|
3549 |
|
|
There are two variants of cyg_mbox_get. The
|
3550 |
|
|
first, cyg_mbox_timed_get will wait until either
|
3551 |
|
|
a message is available or until a number of clock ticks have occurred.
|
3552 |
|
|
If no message is posted within the timeout then a null pointer will be
|
3553 |
|
|
returned. cyg_mbox_tryget is a non-blocking
|
3554 |
|
|
operation which will either return a message if one is available or a
|
3555 |
|
|
null pointer.
|
3556 |
|
|
|
3557 |
|
|
|
3558 |
|
|
New messages are placed in the mail box by calling
|
3559 |
|
|
cyg_mbox_put or one of its variants. The main put
|
3560 |
|
|
function takes two arguments, a handle to the mail box and a
|
3561 |
|
|
pointer for the message itself. If there is a spare slot in the
|
3562 |
|
|
mail box then the new message can be placed there immediately, and
|
3563 |
|
|
if there is a waiting thread it will be woken up so that it can
|
3564 |
|
|
receive the message. If the mail box is currently full then
|
3565 |
|
|
cyg_mbox_put will block until there has been a
|
3566 |
|
|
get operation and a slot is available. The
|
3567 |
|
|
cyg_mbox_timed_put variant imposes a time limit
|
3568 |
|
|
on the put operation, returning false if the operation cannot be
|
3569 |
|
|
completed within the specified number of clock ticks. The
|
3570 |
|
|
cyg_mbox_tryput variant is non-blocking,
|
3571 |
|
|
returning false if there are no free slots available and the message
|
3572 |
|
|
cannot be posted without blocking.
|
3573 |
|
|
|
3574 |
|
|
|
3575 |
|
|
There are a further four functions available for examining the current
|
3576 |
|
|
state of a mailbox. The results of these functions must be used with
|
3577 |
|
|
care because usually the state can change at any time as a result of
|
3578 |
|
|
activity within other threads, but they may prove occasionally useful
|
3579 |
|
|
during debugging or in special situations.
|
3580 |
|
|
cyg_mbox_peek returns a count of the number of
|
3581 |
|
|
messages currently stored in the mail box.
|
3582 |
|
|
cyg_mbox_peek_item retrieves the first message,
|
3583 |
|
|
but it remains in the mail box until a get operation is performed.
|
3584 |
|
|
cyg_mbox_waiting_to_get and
|
3585 |
|
|
cyg_mbox_waiting_to_put indicate whether or not
|
3586 |
|
|
there are currently threads blocked in a get or a put operation on a
|
3587 |
|
|
given mail box.
|
3588 |
|
|
|
3589 |
|
|
|
3590 |
|
|
The number of slots in each mail box is controlled by a
|
3591 |
|
|
configuration option
|
3592 |
|
|
CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE, with a default
|
3593 |
|
|
value of 10. All mail boxes are the same size.
|
3594 |
|
|
|
3595 |
|
|
|
3596 |
|
|
|
3597 |
|
|
Valid contexts
|
3598 |
|
|
|
3599 |
|
|
cyg_mbox_create is typically called during
|
3600 |
|
|
system initialization but may also be called in thread context.
|
3601 |
|
|
The remaining functions are normally called only during thread
|
3602 |
|
|
context. Of special note is cyg_mbox_put which
|
3603 |
|
|
can be a blocking operation when the mail box is full, and which
|
3604 |
|
|
therefore must never be called from DSR context. It is permitted to
|
3605 |
|
|
call cyg_mbox_tryput,
|
3606 |
|
|
cyg_mbox_tryget, and the information functions
|
3607 |
|
|
from DSR context but this is rarely useful.
|
3608 |
|
|
|
3609 |
|
|
|
3610 |
|
|
|
3611 |
|
|
|
3612 |
|
|
|
3613 |
|
|
|
3614 |
|
|
|
3615 |
|
|
|
3616 |
|
|
|
3617 |
|
|
|
3618 |
|
|
|
3619 |
|
|
Event Flags
|
3620 |
|
|
|
3621 |
|
|
|
3622 |
|
|
|
3623 |
|
|
cyg_flag_init
|
3624 |
|
|
cyg_flag_destroy
|
3625 |
|
|
cyg_flag_setbits
|
3626 |
|
|
cyg_flag_maskbits
|
3627 |
|
|
cyg_flag_wait
|
3628 |
|
|
cyg_flag_timed_wait
|
3629 |
|
|
cyg_flag_poll
|
3630 |
|
|
cyg_flag_peek
|
3631 |
|
|
cyg_flag_waiting
|
3632 |
|
|
Synchronization primitive
|
3633 |
|
|
|
3634 |
|
|
|
3635 |
|
|
|
3636 |
|
|
|
3637 |
|
|
|
3638 |
|
|
#include <cyg/kernel/kapi.h>
|
3639 |
|
|
|
3640 |
|
|
|
3641 |
|
|
void cyg_flag_init
|
3642 |
|
|
cyg_flag_t* flag
|
3643 |
|
|
|
3644 |
|
|
|
3645 |
|
|
void cyg_flag_destroy
|
3646 |
|
|
cyg_flag_t* flag
|
3647 |
|
|
|
3648 |
|
|
|
3649 |
|
|
void cyg_flag_setbits
|
3650 |
|
|
cyg_flag_t* flag
|
3651 |
|
|
cyg_flag_value_t value
|
3652 |
|
|
|
3653 |
|
|
|
3654 |
|
|
void cyg_flag_maskbits
|
3655 |
|
|
cyg_flag_t* flag
|
3656 |
|
|
cyg_flag_value_t value
|
3657 |
|
|
|
3658 |
|
|
|
3659 |
|
|
cyg_flag_value_t cyg_flag_wait
|
3660 |
|
|
cyg_flag_t* flag
|
3661 |
|
|
cyg_flag_value_t pattern
|
3662 |
|
|
cyg_flag_mode_t mode
|
3663 |
|
|
|
3664 |
|
|
|
3665 |
|
|
cyg_flag_value_t cyg_flag_timed_wait
|
3666 |
|
|
cyg_flag_t* flag
|
3667 |
|
|
cyg_flag_value_t pattern
|
3668 |
|
|
cyg_flag_mode_t mode
|
3669 |
|
|
cyg_tick_count_t abstime
|
3670 |
|
|
|
3671 |
|
|
|
3672 |
|
|
cyg_flag_value_t cyg_flag_poll
|
3673 |
|
|
cyg_flag_t* flag
|
3674 |
|
|
cyg_flag_value_t pattern
|
3675 |
|
|
cyg_flag_mode_t mode
|
3676 |
|
|
|
3677 |
|
|
|
3678 |
|
|
cyg_flag_value_t cyg_flag_peek
|
3679 |
|
|
cyg_flag_t* flag
|
3680 |
|
|
|
3681 |
|
|
|
3682 |
|
|
cyg_bool_t cyg_flag_waiting
|
3683 |
|
|
cyg_flag_t* flag
|
3684 |
|
|
|
3685 |
|
|
|
3686 |
|
|
|
3687 |
|
|
|
3688 |
|
|
Description
|
3689 |
|
|
|
3690 |
|
|
Event flags allow a consumer thread to wait for one of several
|
3691 |
|
|
different types of event to occur. Alternatively it is possible to
|
3692 |
|
|
wait for some combination of events. The implementation is relatively
|
3693 |
|
|
straightforward. Each event flag contains a 32-bit integer.
|
3694 |
|
|
Application code associates these bits with specific events, so for
|
3695 |
|
|
example bit 0 could indicate that an I/O operation has completed and
|
3696 |
|
|
data is available, while bit 1 could indicate that the user has
|
3697 |
|
|
pressed a start button. A producer thread or a DSR can cause one or
|
3698 |
|
|
more of the bits to be set, and a consumer thread currently waiting
|
3699 |
|
|
for these bits will be woken up.
|
3700 |
|
|
|
3701 |
|
|
|
3702 |
|
|
Unlike semaphores no attempt is made to keep track of event counts. It
|
3703 |
|
|
does not matter whether a given event occurs once or multiple times
|
3704 |
|
|
before being consumed, the corresponding bit in the event flag will
|
3705 |
|
|
change only once. However semaphores cannot easily be used to handle
|
3706 |
|
|
multiple event sources. Event flags can often be used as an
|
3707 |
|
|
alternative to condition variables, although they cannot be used for
|
3708 |
|
|
completely arbitrary conditions and they only support the equivalent
|
3709 |
|
|
of condition variable broadcasts, not signals.
|
3710 |
|
|
|
3711 |
|
|
|
3712 |
|
|
Before an event flag can be used it must be initialized by a call to
|
3713 |
|
|
cyg_flag_init. This takes a pointer to a
|
3714 |
|
|
cyg_flag_t data structure, which can be part of a
|
3715 |
|
|
larger structure. All 32 bits in the event flag will be set to 0,
|
3716 |
|
|
indicating that no events have yet occurred. If an event flag is no
|
3717 |
|
|
longer required it can be cleaned up with a call to
|
3718 |
|
|
cyg_flag_destroy, allowing the memory for the
|
3719 |
|
|
cyg_flag_t structure to be re-used.
|
3720 |
|
|
|
3721 |
|
|
|
3722 |
|
|
A consumer thread can wait for one or more events by calling
|
3723 |
|
|
cyg_flag_wait. This takes three arguments. The
|
3724 |
|
|
first identifies a particular event flag. The second is some
|
3725 |
|
|
combination of bits, indicating which events are of interest. The
|
3726 |
|
|
final argument should be one of the following:
|
3727 |
|
|
|
3728 |
|
|
|
3729 |
|
|
|
3730 |
|
|
CYG_FLAG_WAITMODE_AND
|
3731 |
|
|
|
3732 |
|
|
The call to cyg_flag_wait will block until all
|
3733 |
|
|
the specified event bits are set. The event flag is not cleared when
|
3734 |
|
|
the wait succeeds, in other words all the bits remain set.
|
3735 |
|
|
|
3736 |
|
|
|
3737 |
|
|
|
3738 |
|
|
CYG_FLAG_WAITMODE_OR
|
3739 |
|
|
|
3740 |
|
|
The call will block until at least one of the specified event bits is
|
3741 |
|
|
set. The event flag is not cleared on return.
|
3742 |
|
|
|
3743 |
|
|
|
3744 |
|
|
|
3745 |
|
|
CYG_FLAG_WAITMODE_AND | CYG_FLAG_WAITMODE_CLR
|
3746 |
|
|
|
3747 |
|
|
The call will block until all the specified event bits are set, and
|
3748 |
|
|
the entire event flag is cleared when the call succeeds. Note that
|
3749 |
|
|
if this mode of operation is used then a single event flag cannot be
|
3750 |
|
|
used to store disjoint sets of events, even though enough bits might
|
3751 |
|
|
be available. Instead each disjoint set of events requires its own
|
3752 |
|
|
event flag.
|
3753 |
|
|
|
3754 |
|
|
|
3755 |
|
|
|
3756 |
|
|
CYG_FLAG_WAITMODE_OR | CYG_FLAG_WAITMODE_CLR
|
3757 |
|
|
|
3758 |
|
|
The call will block until at least one of the specified event bits is
|
3759 |
|
|
set, and the entire flag is cleared when the call succeeds.
|
3760 |
|
|
|
3761 |
|
|
|
3762 |
|
|
|
3763 |
|
|
|
3764 |
|
|
A call to cyg_flag_wait normally blocks until the
|
3765 |
|
|
required condition is satisfied. It will return the value of the event
|
3766 |
|
|
flag at the point that the operation succeeded, which may be a
|
3767 |
|
|
superset of the requested events. If
|
3768 |
|
|
cyg_thread_release is used to unblock a thread
|
3769 |
|
|
that is currently in a wait operation, the
|
3770 |
|
|
cyg_flag_wait call will instead return 0.
|
3771 |
|
|
|
3772 |
|
|
|
3773 |
|
|
cyg_flag_timed_wait is a variant of
|
3774 |
|
|
cyg_flag_wait which adds a timeout: the wait
|
3775 |
|
|
operation must succeed within the specified number of ticks, or it
|
3776 |
|
|
will fail with a return value of 0. cyg_flag_poll
|
3777 |
|
|
is a non-blocking variant: if the wait operation can succeed
|
3778 |
|
|
immediately it acts like cyg_flag_wait, otherwise
|
3779 |
|
|
it returns immediately with a value of 0.
|
3780 |
|
|
|
3781 |
|
|
|
3782 |
|
|
cyg_flag_setbits is called by a producer thread
|
3783 |
|
|
or from inside a DSR when an event occurs. The specified bits are or'd
|
3784 |
|
|
into the current event flag value. This may cause a waiting thread to
|
3785 |
|
|
be woken up, if its condition is now satisfied.
|
3786 |
|
|
|
3787 |
|
|
|
3788 |
|
|
cyg_flag_maskbits can be used to clear one or
|
3789 |
|
|
more bits in the event flag. This can be called from a producer when a
|
3790 |
|
|
particular condition is no longer satisfied, for example when the user
|
3791 |
|
|
is no longer pressing a particular button. It can also be used by a
|
3792 |
|
|
consumer thread if CYG_FLAG_WAITMODE_CLR was not
|
3793 |
|
|
used as part of the wait operation, to indicate that some but not all
|
3794 |
|
|
of the active events have been consumed. If there are multiple
|
3795 |
|
|
consumer threads performing wait operations without using
|
3796 |
|
|
CYG_FLAG_WAITMODE_CLR then typically some
|
3797 |
|
|
additional synchronization such as a mutex is needed to prevent
|
3798 |
|
|
multiple threads consuming the same event.
|
3799 |
|
|
|
3800 |
|
|
|
3801 |
|
|
Two additional functions are provided to query the current state of an
|
3802 |
|
|
event flag. cyg_flag_peek returns the current
|
3803 |
|
|
value of the event flag, and cyg_flag_waiting can
|
3804 |
|
|
be used to find out whether or not there are any threads currently
|
3805 |
|
|
blocked on the event flag. Both of these functions must be used with
|
3806 |
|
|
care because other threads may be operating on the event flag.
|
3807 |
|
|
|
3808 |
|
|
|
3809 |
|
|
|
3810 |
|
|
Valid contexts
|
3811 |
|
|
|
3812 |
|
|
cyg_flag_init is typically called during system
|
3813 |
|
|
initialization but may also be called in thread context. The same
|
3814 |
|
|
applies to cyg_flag_destroy.
|
3815 |
|
|
cyg_flag_wait and
|
3816 |
|
|
cyg_flag_timed_wait may only be called from
|
3817 |
|
|
thread context. The remaining functions may be called from thread or
|
3818 |
|
|
DSR context.
|
3819 |
|
|
|
3820 |
|
|
|
3821 |
|
|
|
3822 |
|
|
|
3823 |
|
|
|
3824 |
|
|
|
3825 |
|
|
|
3826 |
|
|
|
3827 |
|
|
|
3828 |
|
|
|
3829 |
|
|
|
3830 |
|
|
Spinlocks
|
3831 |
|
|
|
3832 |
|
|
|
3833 |
|
|
|
3834 |
|
|
cyg_spinlock_create
|
3835 |
|
|
cyg_spinlock_destroy
|
3836 |
|
|
cyg_spinlock_spin
|
3837 |
|
|
cyg_spinlock_clear
|
3838 |
|
|
cyg_spinlock_test
|
3839 |
|
|
cyg_spinlock_spin_intsave
|
3840 |
|
|
cyg_spinlock_clear_intsave
|
3841 |
|
|
Low-level Synchronization Primitive
|
3842 |
|
|
|
3843 |
|
|
|
3844 |
|
|
|
3845 |
|
|
|
3846 |
|
|
|
3847 |
|
|
#include <cyg/kernel/kapi.h>
|
3848 |
|
|
|
3849 |
|
|
|
3850 |
|
|
void cyg_spinlock_init
|
3851 |
|
|
cyg_spinlock_t* lock
|
3852 |
|
|
cyg_bool_t locked
|
3853 |
|
|
|
3854 |
|
|
|
3855 |
|
|
void cyg_spinlock_destroy
|
3856 |
|
|
cyg_spinlock_t* lock
|
3857 |
|
|
|
3858 |
|
|
|
3859 |
|
|
void cyg_spinlock_spin
|
3860 |
|
|
cyg_spinlock_t* lock
|
3861 |
|
|
|
3862 |
|
|
|
3863 |
|
|
void cyg_spinlock_clear
|
3864 |
|
|
cyg_spinlock_t* lock
|
3865 |
|
|
|
3866 |
|
|
|
3867 |
|
|
cyg_bool_t cyg_spinlock_try
|
3868 |
|
|
cyg_spinlock_t* lock
|
3869 |
|
|
|
3870 |
|
|
|
3871 |
|
|
cyg_bool_t cyg_spinlock_test
|
3872 |
|
|
cyg_spinlock_t* lock
|
3873 |
|
|
|
3874 |
|
|
|
3875 |
|
|
void cyg_spinlock_spin_intsave
|
3876 |
|
|
cyg_spinlock_t* lock
|
3877 |
|
|
cyg_addrword_t* istate
|
3878 |
|
|
|
3879 |
|
|
|
3880 |
|
|
void cyg_spinlock_clear_intsave
|
3881 |
|
|
cyg_spinlock_t* lock
|
3882 |
|
|
cyg_addrword_t istate
|
3883 |
|
|
|
3884 |
|
|
|
3885 |
|
|
|
3886 |
|
|
|
3887 |
|
|
Description
|
3888 |
|
|
|
3889 |
|
|
Spinlocks provide an additional synchronization primitive for
|
3890 |
|
|
applications running on SMP systems. They operate at a lower level
|
3891 |
|
|
than the other primitives such as mutexes, and for most purposes the
|
3892 |
|
|
higher-level primitives should be preferred. However there are some
|
3893 |
|
|
circumstances where a spinlock is appropriate, especially when
|
3894 |
|
|
interrupt handlers and threads need to share access to hardware, and
|
3895 |
|
|
on SMP systems the kernel implementation itself depends on spinlocks.
|
3896 |
|
|
|
3897 |
|
|
|
3898 |
|
|
Essentially a spinlock is just a simple flag. When code tries to claim
|
3899 |
|
|
a spinlock it checks whether or not the flag is already set. If not
|
3900 |
|
|
then the flag is set and the operation succeeds immediately. The exact
|
3901 |
|
|
implementation of this is hardware-specific, for example it may use a
|
3902 |
|
|
test-and-set instruction to guarantee the desired behaviour even if
|
3903 |
|
|
several processors try to access the spinlock at the exact same time.
|
3904 |
|
|
If it is not possible to claim a spinlock then the current thead spins
|
3905 |
|
|
in a tight loop, repeatedly checking the flag until it is clear. This
|
3906 |
|
|
behaviour is very different from other synchronization primitives such
|
3907 |
|
|
as mutexes, where contention would cause a thread to be suspended. The
|
3908 |
|
|
assumption is that a spinlock will only be held for a very short time.
|
3909 |
|
|
If claiming a spinlock could cause the current thread to be suspended
|
3910 |
|
|
then spinlocks could not be used inside interrupt handlers, which is
|
3911 |
|
|
not acceptable.
|
3912 |
|
|
|
3913 |
|
|
|
3914 |
|
|
This does impose a constraint on any code which uses spinlocks.
|
3915 |
|
|
Specifically it is important that spinlocks are held only for a short
|
3916 |
|
|
period of time, typically just some dozens of instructions. Otherwise
|
3917 |
|
|
another processor could be blocked on the spinlock for a long time,
|
3918 |
|
|
unable to do any useful work. It is also important that a thread which
|
3919 |
|
|
owns a spinlock does not get preempted because that might cause
|
3920 |
|
|
another processor to spin for a whole timeslice period, or longer. One
|
3921 |
|
|
way of achieving this is to disable interrupts on the current
|
3922 |
|
|
processor, and the function
|
3923 |
|
|
cyg_spinlock_spin_intsave is provided to
|
3924 |
|
|
facilitate this.
|
3925 |
|
|
|
3926 |
|
|
|
3927 |
|
|
Spinlocks should not be used on single-processor systems. Consider a
|
3928 |
|
|
high priority thread which attempts to claim a spinlock already held
|
3929 |
|
|
by a lower priority thread: it will just loop forever and the lower
|
3930 |
|
|
priority thread will never get another chance to run and release the
|
3931 |
|
|
spinlock. Even if the two threads were running at the same priority,
|
3932 |
|
|
the one attempting to claim the spinlock would spin until it was
|
3933 |
|
|
timesliced and a lot of cpu time would be wasted. If an interrupt
|
3934 |
|
|
handler tried to claim a spinlock owned by a thread, the interrupt
|
3935 |
|
|
handler would loop forever. Therefore spinlocks are only appropriate
|
3936 |
|
|
for SMP systems where the current owner of a spinlock can continue
|
3937 |
|
|
running on a different processor.
|
3938 |
|
|
|
3939 |
|
|
|
3940 |
|
|
Before a spinlock can be used it must be initialized by a call to
|
3941 |
|
|
cyg_spinlock_init. This takes two arguments, a
|
3942 |
|
|
pointer to a cyg_spinlock_t data structure, and
|
3943 |
|
|
a flag to specify whether the spinlock starts off locked or unlocked.
|
3944 |
|
|
If a spinlock is no longer required then it can be destroyed by a call
|
3945 |
|
|
to cyg_spinlock_destroy.
|
3946 |
|
|
|
3947 |
|
|
|
3948 |
|
|
There are two routines for claiming a spinlock:
|
3949 |
|
|
cyg_spinlock_spin and
|
3950 |
|
|
cyg_spinlock_spin_intsave. The former can be used
|
3951 |
|
|
when it is known the current code will not be preempted, for example
|
3952 |
|
|
because it is running in an interrupt handler or because interrupts
|
3953 |
|
|
are disabled. The latter will disable interrupts in addition to
|
3954 |
|
|
claiming the spinlock, so is safe to use in all circumstances. The
|
3955 |
|
|
previous interrupt state is returned via the second argument, and
|
3956 |
|
|
should be used in a subsequent call to
|
3957 |
|
|
cyg_spinlock_clear_intsave.
|
3958 |
|
|
|
3959 |
|
|
|
3960 |
|
|
Similarly there are two routines for releasing a spinlock:
|
3961 |
|
|
cyg_spinlock_clear and
|
3962 |
|
|
cyg_spinlock_clear_intsave. Typically
|
3963 |
|
|
the former will be used if the spinlock was claimed by a call to
|
3964 |
|
|
cyg_spinlock_spin, and the latter when
|
3965 |
|
|
cyg_spinlock_intsave was used.
|
3966 |
|
|
|
3967 |
|
|
|
3968 |
|
|
There are two additional routines.
|
3969 |
|
|
cyg_spinlock_try is a non-blocking version of
|
3970 |
|
|
cyg_spinlock_spin: if possible the lock will be
|
3971 |
|
|
claimed and the function will return true; otherwise the function
|
3972 |
|
|
will return immediately with failure.
|
3973 |
|
|
cyg_spinlock_test can be used to find out whether
|
3974 |
|
|
or not the spinlock is currently locked. This function must be used
|
3975 |
|
|
with care because, especially on a multiprocessor system, the state of
|
3976 |
|
|
the spinlock can change at any time.
|
3977 |
|
|
|
3978 |
|
|
|
3979 |
|
|
Spinlocks should only be held for a short period of time, and
|
3980 |
|
|
attempting to claim a spinlock will never cause a thread to be
|
3981 |
|
|
suspended. This means that there is no need to worry about priority
|
3982 |
|
|
inversion problems, and concepts such as priority ceilings and
|
3983 |
|
|
inheritance do not apply.
|
3984 |
|
|
|
3985 |
|
|
|
3986 |
|
|
|
3987 |
|
|
Valid contexts
|
3988 |
|
|
|
3989 |
|
|
All of the spinlock functions can be called from any context,
|
3990 |
|
|
including ISR and DSR context. Typically
|
3991 |
|
|
cyg_spinlock_init is only called during system
|
3992 |
|
|
initialization.
|
3993 |
|
|
|
3994 |
|
|
|
3995 |
|
|
|
3996 |
|
|
|
3997 |
|
|
|
3998 |
|
|
|
3999 |
|
|
|
4000 |
|
|
|
4001 |
|
|
|
4002 |
|
|
|
4003 |
|
|
|
4004 |
|
|
Scheduler Control
|
4005 |
|
|
|
4006 |
|
|
|
4007 |
|
|
|
4008 |
|
|
cyg_scheduler_start
|
4009 |
|
|
cyg_scheduler_lock
|
4010 |
|
|
cyg_scheduler_unlock
|
4011 |
|
|
cyg_scheduler_safe_lock
|
4012 |
|
|
cyg_scheduler_read_lock
|
4013 |
|
|
Control the state of the scheduler
|
4014 |
|
|
|
4015 |
|
|
|
4016 |
|
|
|
4017 |
|
|
|
4018 |
|
|
|
4019 |
|
|
#include <cyg/kernel/kapi.h>
|
4020 |
|
|
|
4021 |
|
|
|
4022 |
|
|
void cyg_scheduler_start
|
4023 |
|
|
|
4024 |
|
|
|
4025 |
|
|
|
4026 |
|
|
void cyg_scheduler_lock
|
4027 |
|
|
|
4028 |
|
|
|
4029 |
|
|
|
4030 |
|
|
void cyg_scheduler_unlock
|
4031 |
|
|
|
4032 |
|
|
|
4033 |
|
|
|
4034 |
|
|
cyg_ucount32 cyg_scheduler_read_lock
|
4035 |
|
|
|
4036 |
|
|
|
4037 |
|
|
|
4038 |
|
|
|
4039 |
|
|
|
4040 |
|
|
Description
|
4041 |
|
|
|
4042 |
|
|
cyg_scheduler_start should only be called once,
|
4043 |
|
|
to mark the end of system initialization. In typical configurations it
|
4044 |
|
|
is called automatically by the system startup, but some applications
|
4045 |
|
|
may bypass the standard startup in which case
|
4046 |
|
|
cyg_scheduler_start will have to be called
|
4047 |
|
|
explicitly. The call will enable system interrupts, allowing I/O
|
4048 |
|
|
operations to commence. Then the scheduler will be invoked and control
|
4049 |
|
|
will be transferred to the highest priority runnable thread. The call
|
4050 |
|
|
will never return.
|
4051 |
|
|
|
4052 |
|
|
|
4053 |
|
|
The various data structures inside the eCos kernel must be protected
|
4054 |
|
|
against concurrent updates. Consider a call to
|
4055 |
|
|
cyg_semaphore_post which causes a thread to be
|
4056 |
|
|
woken up: the semaphore data structure must be updated to remove the
|
4057 |
|
|
thread from its queue; the scheduler data structure must also be
|
4058 |
|
|
updated to mark the thread as runnable; it is possible that the newly
|
4059 |
|
|
runnable thread has a higher priority than the current one, in which
|
4060 |
|
|
case preemption is required. If in the middle of the semaphore post
|
4061 |
|
|
call an interrupt occurred and the interrupt handler tried to
|
4062 |
|
|
manipulate the same data structures, for example by making another
|
4063 |
|
|
thread runnable, then it is likely that the structures will be left in
|
4064 |
|
|
an inconsistent state and the system will fail.
|
4065 |
|
|
|
4066 |
|
|
|
4067 |
|
|
To prevent such problems the kernel contains a special lock known as
|
4068 |
|
|
the scheduler lock. A typical kernel function such as
|
4069 |
|
|
cyg_semaphore_post will claim the scheduler lock,
|
4070 |
|
|
do all its manipulation of kernel data structures, and then release
|
4071 |
|
|
the scheduler lock. The current thread cannot be preempted while it
|
4072 |
|
|
holds the scheduler lock. If an interrupt occurs and a DSR is supposed
|
4073 |
|
|
to run to signal that some event has occurred, that DSR is postponed
|
4074 |
|
|
until the scheduler unlock operation. This prevents concurrent updates
|
4075 |
|
|
of kernel data structures.
|
4076 |
|
|
|
4077 |
|
|
|
4078 |
|
|
The kernel exports three routines for manipulating the scheduler lock.
|
4079 |
|
|
cyg_scheduler_lock can be called to claim the
|
4080 |
|
|
lock. On return it is guaranteed that the current thread will not be
|
4081 |
|
|
preempted, and that no other code is manipulating any kernel data
|
4082 |
|
|
structures. cyg_scheduler_unlock can be used to
|
4083 |
|
|
release the lock, which may cause the current thread to be preempted.
|
4084 |
|
|
cyg_scheduler_read_lock can be used to query the
|
4085 |
|
|
current state of the scheduler lock. This function should never be
|
4086 |
|
|
needed because well-written code should always know whether or not the
|
4087 |
|
|
scheduler is currently locked, but may prove useful during debugging.
|
4088 |
|
|
|
4089 |
|
|
|
4090 |
|
|
The implementation of the scheduler lock involves a simple counter.
|
4091 |
|
|
Code can call cyg_scheduler_lock multiple times,
|
4092 |
|
|
causing the counter to be incremented each time, as long as
|
4093 |
|
|
cyg_scheduler_unlock is called the same number of
|
4094 |
|
|
times. This behaviour is different from mutexes where an attempt by a
|
4095 |
|
|
thread to lock a mutex multiple times will result in deadlock or an
|
4096 |
|
|
assertion failure.
|
4097 |
|
|
|
4098 |
|
|
|
4099 |
|
|
Typical application code should not use the scheduler lock. Instead
|
4100 |
|
|
other synchronization primitives such as mutexes and semaphores should
|
4101 |
|
|
be used. While the scheduler is locked the current thread cannot be
|
4102 |
|
|
preempted, so any higher priority threads will not be able to run.
|
4103 |
|
|
Also no DSRs can run, so device drivers may not be able to service
|
4104 |
|
|
I/O requests. However there is one situation where locking the
|
4105 |
|
|
scheduler is appropriate: if some data structure needs to be shared
|
4106 |
|
|
between an application thread and a DSR associated with some interrupt
|
4107 |
|
|
source, the thread can use the scheduler lock to prevent concurrent
|
4108 |
|
|
invocations of the DSR and then safely manipulate the structure. It is
|
4109 |
|
|
desirable that the scheduler lock is held for only a short period of
|
4110 |
|
|
time, typically some tens of instructions. In exceptional cases there
|
4111 |
|
|
may also be some performance-critical code where it is more
|
4112 |
|
|
appropriate to use the scheduler lock rather than a mutex, because the
|
4113 |
|
|
former is more efficient.
|
4114 |
|
|
|
4115 |
|
|
|
4116 |
|
|
|
4117 |
|
|
Valid contexts
|
4118 |
|
|
|
4119 |
|
|
cyg_scheduler_start can only be called during
|
4120 |
|
|
system initialization, since it marks the end of that phase. The
|
4121 |
|
|
remaining functions may be called from thread or DSR context. Locking
|
4122 |
|
|
the scheduler from inside the DSR has no practical effect because the
|
4123 |
|
|
lock is claimed automatically by the interrupt subsystem before
|
4124 |
|
|
running DSRs, but allows functions to be shared between normal thread
|
4125 |
|
|
code and DSRs.
|
4126 |
|
|
|
4127 |
|
|
|
4128 |
|
|
|
4129 |
|
|
|
4130 |
|
|
|
4131 |
|
|
|
4132 |
|
|
|
4133 |
|
|
|
4134 |
|
|
|
4135 |
|
|
|
4136 |
|
|
|
4137 |
|
|
Interrupt Handling
|
4138 |
|
|
|
4139 |
|
|
|
4140 |
|
|
|
4141 |
|
|
cyg_interrupt_create
|
4142 |
|
|
cyg_interrupt_delete
|
4143 |
|
|
cyg_interrupt_attach
|
4144 |
|
|
cyg_interrupt_detach
|
4145 |
|
|
cyg_interrupt_configure
|
4146 |
|
|
cyg_interrupt_acknowledge
|
4147 |
|
|
cyg_interrupt_enable
|
4148 |
|
|
cyg_interrupt_disable
|
4149 |
|
|
cyg_interrupt_mask
|
4150 |
|
|
cyg_interrupt_mask_intunsafe
|
4151 |
|
|
cyg_interrupt_unmask
|
4152 |
|
|
cyg_interrupt_unmask_intunsafe
|
4153 |
|
|
cyg_interrupt_set_cpu
|
4154 |
|
|
cyg_interrupt_get_cpu
|
4155 |
|
|
cyg_interrupt_get_vsr
|
4156 |
|
|
cyg_interrupt_set_vsr
|
4157 |
|
|
Manage interrupt handlers
|
4158 |
|
|
|
4159 |
|
|
|
4160 |
|
|
|
4161 |
|
|
|
4162 |
|
|
|
4163 |
|
|
#include <cyg/kernel/kapi.h>
|
4164 |
|
|
|
4165 |
|
|
|
4166 |
|
|
void cyg_interrupt_create
|
4167 |
|
|
cyg_vector_t vector
|
4168 |
|
|
cyg_priority_t priority
|
4169 |
|
|
cyg_addrword_t data
|
4170 |
|
|
cyg_ISR_t* isr
|
4171 |
|
|
cyg_DSR_t* dsr
|
4172 |
|
|
cyg_handle_t* handle
|
4173 |
|
|
cyg_interrupt* intr
|
4174 |
|
|
|
4175 |
|
|
|
4176 |
|
|
void cyg_interrupt_delete
|
4177 |
|
|
cyg_handle_t interrupt
|
4178 |
|
|
|
4179 |
|
|
|
4180 |
|
|
void cyg_interrupt_attach
|
4181 |
|
|
cyg_handle_t interrupt
|
4182 |
|
|
|
4183 |
|
|
|
4184 |
|
|
void cyg_interrupt_detach
|
4185 |
|
|
cyg_handle_t interrupt
|
4186 |
|
|
|
4187 |
|
|
|
4188 |
|
|
void cyg_interrupt_configure
|
4189 |
|
|
cyg_vector_t vector
|
4190 |
|
|
cyg_bool_t level
|
4191 |
|
|
cyg_bool_t up
|
4192 |
|
|
|
4193 |
|
|
|
4194 |
|
|
void cyg_interrupt_acknowledge
|
4195 |
|
|
cyg_vector_t vector
|
4196 |
|
|
|
4197 |
|
|
|
4198 |
|
|
void cyg_interrupt_disable
|
4199 |
|
|
|
4200 |
|
|
|
4201 |
|
|
|
4202 |
|
|
void cyg_interrupt_enable
|
4203 |
|
|
|
4204 |
|
|
|
4205 |
|
|
|
4206 |
|
|
void cyg_interrupt_mask
|
4207 |
|
|
cyg_vector_t vector
|
4208 |
|
|
|
4209 |
|
|
|
4210 |
|
|
void cyg_interrupt_mask_intunsafe
|
4211 |
|
|
cyg_vector_t vector
|
4212 |
|
|
|
4213 |
|
|
|
4214 |
|
|
void cyg_interrupt_unmask
|
4215 |
|
|
cyg_vector_t vector
|
4216 |
|
|
|
4217 |
|
|
|
4218 |
|
|
void cyg_interrupt_unmask_intunsafe
|
4219 |
|
|
cyg_vector_t vector
|
4220 |
|
|
|
4221 |
|
|
|
4222 |
|
|
void cyg_interrupt_set_cpu
|
4223 |
|
|
cyg_vector_t vector
|
4224 |
|
|
cyg_cpu_t cpu
|
4225 |
|
|
|
4226 |
|
|
|
4227 |
|
|
cyg_cpu_t cyg_interrupt_get_cpu
|
4228 |
|
|
cyg_vector_t vector
|
4229 |
|
|
|
4230 |
|
|
|
4231 |
|
|
void cyg_interrupt_get_vsr
|
4232 |
|
|
cyg_vector_t vector
|
4233 |
|
|
cyg_VSR_t** vsr
|
4234 |
|
|
|
4235 |
|
|
|
4236 |
|
|
void cyg_interrupt_set_vsr
|
4237 |
|
|
cyg_vector_t vector
|
4238 |
|
|
cyg_VSR_t* vsr
|
4239 |
|
|
|
4240 |
|
|
|
4241 |
|
|
|
4242 |
|
|
|
4243 |
|
|
Description
|
4244 |
|
|
|
4245 |
|
|
The kernel provides an interface for installing interrupt handlers and
|
4246 |
|
|
controlling when interrupts occur. This functionality is used
|
4247 |
|
|
primarily by eCos device drivers and by any application code that
|
4248 |
|
|
interacts directly with hardware. However in most cases it is better
|
4249 |
|
|
to avoid using this kernel functionality directly, and instead the
|
4250 |
|
|
device driver API provided by the common HAL package should be used.
|
4251 |
|
|
Use of the kernel package is optional, and some applications such as
|
4252 |
|
|
RedBoot work with no need for multiple threads or synchronization
|
4253 |
|
|
primitives. Any code which calls the kernel directly rather than the
|
4254 |
|
|
device driver API will not function in such a configuration. When the
|
4255 |
|
|
kernel package is present the device driver API is implemented as
|
4256 |
|
|
#define's to the equivalent kernel calls, otherwise
|
4257 |
|
|
it is implemented inside the common HAL package. The latter
|
4258 |
|
|
implementation can be simpler than the kernel one because there is no
|
4259 |
|
|
need to consider thread preemption and similar issues.
|
4260 |
|
|
|
4261 |
|
|
|
4262 |
|
|
The exact details of interrupt handling vary widely between
|
4263 |
|
|
architectures. The functionality provided by the kernel abstracts away
|
4264 |
|
|
from many of the details of the underlying hardware, thus simplifying
|
4265 |
|
|
application development. However this is not always successful. For
|
4266 |
|
|
example, if some hardware does not provide any support at all for
|
4267 |
|
|
masking specific interrupts then calling
|
4268 |
|
|
cyg_interrupt_mask may not behave as intended:
|
4269 |
|
|
instead of masking just the one interrupt source it might disable all
|
4270 |
|
|
interrupts, because that is as close to the desired behaviour as is
|
4271 |
|
|
possible given the hardware restrictions. Another possibility is that
|
4272 |
|
|
masking a given interrupt source also affects all lower-priority
|
4273 |
|
|
interrupts, but still allows higher-priority ones. The documentation
|
4274 |
|
|
for the appropriate HAL packages should be consulted for more
|
4275 |
|
|
information about exactly how interrupts are handled on any given
|
4276 |
|
|
hardware. The HAL header files will also contain useful information.
|
4277 |
|
|
|
4278 |
|
|
|
4279 |
|
|
|
4280 |
|
|
Interrupt Handlers
|
4281 |
|
|
|
4282 |
|
|
Interrupt handlers are created by a call to
|
4283 |
|
|
cyg_interrupt_create. This takes the following
|
4284 |
|
|
arguments:
|
4285 |
|
|
|
4286 |
|
|
|
4287 |
|
|
|
4288 |
|
|
cyg_vector_t vector
|
4289 |
|
|
|
4290 |
|
|
The interrupt vector, a small integer, identifies the specific
|
4291 |
|
|
interrupt source. The appropriate hardware documentation or HAL header
|
4292 |
|
|
files should be consulted for details of which vector corresponds to
|
4293 |
|
|
which device.
|
4294 |
|
|
|
4295 |
|
|
|
4296 |
|
|
|
4297 |
|
|
cyg_priority_t priority
|
4298 |
|
|
|
4299 |
|
|
Some hardware may support interrupt priorities, where a low priority
|
4300 |
|
|
interrupt handler can in turn be interrupted by a higher priority one.
|
4301 |
|
|
Again hardware-specific documentation should be consulted for details
|
4302 |
|
|
about what the valid interrupt priority levels are.
|
4303 |
|
|
|
4304 |
|
|
|
4305 |
|
|
|
4306 |
|
|
cyg_addrword_t data
|
4307 |
|
|
|
4308 |
|
|
When an interrupt occurs eCos will first call the associated
|
4309 |
|
|
interrupt service routine or ISR, then optionally a deferred service
|
4310 |
|
|
routine or DSR. The data argument to
|
4311 |
|
|
cyg_interrupt_create will be passed to both these
|
4312 |
|
|
functions. Typically it will be a pointer to some data structure.
|
4313 |
|
|
|
4314 |
|
|
|
4315 |
|
|
|
4316 |
|
|
cyg_ISR_t isr
|
4317 |
|
|
|
4318 |
|
|
When an interrupt occurs the hardware will transfer control to the
|
4319 |
|
|
appropriate vector service routine or VSR, which is usually provided
|
4320 |
|
|
by eCos. This performs any appropriate processing, for example to work
|
4321 |
|
|
out exactly which interrupt occurred, and then as quickly as possible
|
4322 |
|
|
transfers control the installed ISR. An ISR is a C function which
|
4323 |
|
|
takes the following form:
|
4324 |
|
|
|
4325 |
|
|
|
4326 |
|
|
cyg_uint32
|
4327 |
|
|
isr_function(cyg_vector_t vector, cyg_addrword_t data)
|
4328 |
|
|
{
|
4329 |
|
|
cyg_bool_t dsr_required = 0;
|
4330 |
|
|
|
4331 |
|
|
…
|
4332 |
|
|
|
4333 |
|
|
return dsr_required ? CYG_ISR_CALL_DSR : CYG_ISR_HANDLED;
|
4334 |
|
|
}
|
4335 |
|
|
|
4336 |
|
|
|
4337 |
|
|
The first argument identifies the particular interrupt source,
|
4338 |
|
|
especially useful if there multiple instances of a given device and a
|
4339 |
|
|
single ISR can be used for several different interrupt vectors. The
|
4340 |
|
|
second argument is the data field passed to
|
4341 |
|
|
cyg_interrupt_create, usually a pointer to some
|
4342 |
|
|
data structure. The exact conditions under which an ISR runs will
|
4343 |
|
|
depend partly on the hardware and partly on configuration options.
|
4344 |
|
|
Interrupts may currently be disabled globally, especially if the
|
4345 |
|
|
hardware does not support interrupt priorities. Alternatively
|
4346 |
|
|
interrupts may be enabled such that higher priority interrupts are
|
4347 |
|
|
allowed through. The ISR may be running on a separate interrupt stack,
|
4348 |
|
|
or on the stack of whichever thread was running at the time the
|
4349 |
|
|
interrupt happened.
|
4350 |
|
|
|
4351 |
|
|
|
4352 |
|
|
A typical ISR will do as little work as possible, just enough to meet
|
4353 |
|
|
the needs of the hardware and then acknowledge the interrupt by
|
4354 |
|
|
calling cyg_interrupt_acknowledge. This ensures
|
4355 |
|
|
that interrupts will be quickly reenabled, so higher priority devices
|
4356 |
|
|
can be serviced. For some applications there may be one device which
|
4357 |
|
|
is especially important and whose ISR can take much longer than
|
4358 |
|
|
normal. However eCos device drivers usually will not assume that they
|
4359 |
|
|
are especially important, so their ISRs will be as short as possible.
|
4360 |
|
|
|
4361 |
|
|
|
4362 |
|
|
The return value of an ISR is normally one of
|
4363 |
|
|
CYG_ISR_CALL_DSR or
|
4364 |
|
|
CYG_ISR_HANDLED. The former indicates that further
|
4365 |
|
|
processing is required at DSR level, and the interrupt handler's DSR
|
4366 |
|
|
will be run as soon as possible. The latter indicates that the
|
4367 |
|
|
interrupt has been fully handled and no further effort is required.
|
4368 |
|
|
|
4369 |
|
|
|
4370 |
|
|
An ISR is allowed to make very few kernel calls. It can manipulate the
|
4371 |
|
|
interrupt mask, and on SMP systems it can use spinlocks. However an
|
4372 |
|
|
ISR must not make higher-level kernel calls such as posting to a
|
4373 |
|
|
semaphore, instead any such calls must be made from the DSR. This
|
4374 |
|
|
avoids having to disable interrupts throughout the kernel and thus
|
4375 |
|
|
improves interrupt latency.
|
4376 |
|
|
|
4377 |
|
|
|
4378 |
|
|
|
4379 |
|
|
cyg_DSR_t dsr
|
4380 |
|
|
|
4381 |
|
|
If an interrupt has occurred and the ISR has returned a value
|
4382 |
|
|
CYG_ISR_CALL_DSR, the system will call the
|
4383 |
|
|
deferred service routine or DSR associated with this interrupt
|
4384 |
|
|
handler. If the scheduler is not currently locked then the DSR will
|
4385 |
|
|
run immediately. However if the interrupted thread was in the middle
|
4386 |
|
|
of a kernel call and had locked the scheduler, then the DSR will be
|
4387 |
|
|
deferred until the scheduler is again unlocked. This allows the
|
4388 |
|
|
DSR to make certain kernel calls safely, for example posting to a
|
4389 |
|
|
semaphore or signalling a condition variable. A DSR is a C function
|
4390 |
|
|
which takes the following form:
|
4391 |
|
|
|
4392 |
|
|
|
4393 |
|
|
void
|
4394 |
|
|
dsr_function(cyg_vector_t vector,
|
4395 |
|
|
cyg_ucount32 count,
|
4396 |
|
|
cyg_addrword_t data)
|
4397 |
|
|
{
|
4398 |
|
|
}
|
4399 |
|
|
|
4400 |
|
|
|
4401 |
|
|
The first argument identifies the specific interrupt that has caused
|
4402 |
|
|
the DSR to run. The second argument indicates the number of these
|
4403 |
|
|
interrupts that have occurred and for which the ISR requested a DSR.
|
4404 |
|
|
Usually this will be 1, unless the system is
|
4405 |
|
|
suffering from a very heavy load. The third argument is the
|
4406 |
|
|
data field passed to
|
4407 |
|
|
cyg_interrupt_create.
|
4408 |
|
|
|
4409 |
|
|
|
4410 |
|
|
|
4411 |
|
|
cyg_handle_t* handle
|
4412 |
|
|
|
4413 |
|
|
The kernel will return a handle to the newly created interrupt handler
|
4414 |
|
|
via this argument. Subsequent operations on the interrupt handler such
|
4415 |
|
|
as attaching it to the interrupt source will use this handle.
|
4416 |
|
|
|
4417 |
|
|
|
4418 |
|
|
|
4419 |
|
|
cyg_interrupt* intr
|
4420 |
|
|
|
4421 |
|
|
This provides the kernel with an area of memory for holding this
|
4422 |
|
|
interrupt handler and associated data.
|
4423 |
|
|
|
4424 |
|
|
|
4425 |
|
|
|
4426 |
|
|
|
4427 |
|
|
The call to cyg_interrupt_create simply fills in
|
4428 |
|
|
a kernel data structure. A typical next step is to call
|
4429 |
|
|
cyg_interrupt_attach using the handle returned by
|
4430 |
|
|
the create operation. This makes it possible to have several different
|
4431 |
|
|
interrupt handlers for a given vector, attaching whichever one is
|
4432 |
|
|
currently appropriate. Replacing an interrupt handler requires a call
|
4433 |
|
|
to cyg_interrupt_detach, followed by another call
|
4434 |
|
|
to cyg_interrupt_attach for the replacement
|
4435 |
|
|
handler. cyg_interrupt_delete can be used if an
|
4436 |
|
|
interrupt handler is no longer required.
|
4437 |
|
|
|
4438 |
|
|
|
4439 |
|
|
Some hardware may allow for further control over specific interrupts,
|
4440 |
|
|
for example whether an interrupt is level or edge triggered. Any such
|
4441 |
|
|
hardware functionality can be accessed using
|
4442 |
|
|
cyg_interrupt_configure: the
|
4443 |
|
|
level argument selects between level versus
|
4444 |
|
|
edge triggered; the up argument selects between
|
4445 |
|
|
high and low level, or between rising and falling edges.
|
4446 |
|
|
|
4447 |
|
|
|
4448 |
|
|
Usually interrupt handlers are created, attached and configured during
|
4449 |
|
|
system initialization, while global interrupts are still disabled. On
|
4450 |
|
|
most hardware it will also be necessary to call
|
4451 |
|
|
cyg_interrupt_unmask, since the sensible default
|
4452 |
|
|
for interrupt masking is to ignore any interrupts for which no handler
|
4453 |
|
|
is installed.
|
4454 |
|
|
|
4455 |
|
|
|
4456 |
|
|
|
4457 |
|
|
Controlling Interrupts
|
4458 |
|
|
|
4459 |
|
|
eCos provides two ways of controlling whether or not interrupts
|
4460 |
|
|
happen. It is possible to disable and reenable all interrupts
|
4461 |
|
|
globally, using cyg_interrupt_disable and
|
4462 |
|
|
cyg_interrupt_enable. Typically this works by
|
4463 |
|
|
manipulating state inside the cpu itself, for example setting a flag
|
4464 |
|
|
in a status register or executing special instructions. Alternatively
|
4465 |
|
|
it may be possible to mask a specific interrupt source by writing to
|
4466 |
|
|
one or to several interrupt mask registers. Hardware-specific
|
4467 |
|
|
documentation should be consulted for the exact details of how
|
4468 |
|
|
interrupt masking works, because a full implementation is not possible
|
4469 |
|
|
on all hardware.
|
4470 |
|
|
|
4471 |
|
|
|
4472 |
|
|
The primary use for these functions is to allow data to be shared
|
4473 |
|
|
between ISRs and other code such as DSRs or threads. If both a thread
|
4474 |
|
|
and an ISR need to manipulate either a data structure or the hardware
|
4475 |
|
|
itself, there is a possible conflict if an interrupt happens just when
|
4476 |
|
|
the thread is doing such manipulation. Problems can be avoided by the
|
4477 |
|
|
thread either disabling or masking interrupts during the critical
|
4478 |
|
|
region. If this critical region requires only a few instructions then
|
4479 |
|
|
usually it is more efficient to disable interrupts. For larger
|
4480 |
|
|
critical regions it may be more appropriate to use interrupt masking,
|
4481 |
|
|
allowing other interrupts to occur. There are other uses for interrupt
|
4482 |
|
|
masking. For example if a device is not currently being used by the
|
4483 |
|
|
application then it may be desirable to mask all interrupts generated
|
4484 |
|
|
by that device.
|
4485 |
|
|
|
4486 |
|
|
|
4487 |
|
|
There are two functions for masking a specific interrupt source,
|
4488 |
|
|
cyg_interrupt_mask and
|
4489 |
|
|
cyg_interrupt_mask_intunsafe. On typical hardware
|
4490 |
|
|
masking an interrupt is not an atomic operation, so if two threads
|
4491 |
|
|
were to perform interrupt masking operations at the same time there
|
4492 |
|
|
could be problems. cyg_interrupt_mask disables
|
4493 |
|
|
all interrupts while it manipulates the interrupt mask. In situations
|
4494 |
|
|
where interrupts are already know to be disabled,
|
4495 |
|
|
cyg_interrupt_mask_intunsafe can be used
|
4496 |
|
|
instead. There are matching functions
|
4497 |
|
|
cyg_interrupt_unmask and
|
4498 |
|
|
cyg_interrupt_unmask_intsafe.
|
4499 |
|
|
|
4500 |
|
|
|
4501 |
|
|
|
4502 |
|
|
SMP Support
|
4503 |
|
|
|
4504 |
|
|
On SMP systems the kernel provides an additional two functions related
|
4505 |
|
|
to interrupt handling. cyg_interrupt_set_cpu
|
4506 |
|
|
specifies that a particular hardware interrupt should always be
|
4507 |
|
|
handled on one specific processor in the system. In other words when
|
4508 |
|
|
the interrupt triggers it is only that processor which detects it, and
|
4509 |
|
|
it is only on that processor that the VSR and ISR will run. If a DSR
|
4510 |
|
|
is requested then it will also run on the same CPU. The
|
4511 |
|
|
function cyg_interrupt_get_cpu can be used to
|
4512 |
|
|
find out which interrupts are handled on which processor.
|
4513 |
|
|
|
4514 |
|
|
|
4515 |
|
|
|
4516 |
|
|
VSR Support
|
4517 |
|
|
|
4518 |
|
|
When an interrupt occurs the hardware will transfer control to a piece
|
4519 |
|
|
of code known as the VSR, or Vector Service Routine. By default this
|
4520 |
|
|
code is provided by eCos. Usually it is written in assembler, but on
|
4521 |
|
|
some architectures it may be possible to implement VSRs in C by
|
4522 |
|
|
specifying an interrupt attribute. Compiler documentation should be
|
4523 |
|
|
consulted for more information on this. The default eCos VSR will work
|
4524 |
|
|
out which ISR function should process the interrupt, and set up a C
|
4525 |
|
|
environment suitable for this ISR.
|
4526 |
|
|
|
4527 |
|
|
|
4528 |
|
|
For some applications it may be desirable to replace the default eCos
|
4529 |
|
|
VSR and handle some interrupts directly. This minimizes interrupt
|
4530 |
|
|
latency, but it requires application developers to program at a lower
|
4531 |
|
|
level. Usually the best way to write a custom VSR is to copy the
|
4532 |
|
|
existing one supplied by eCos and then make appropriate modifications.
|
4533 |
|
|
The function cyg_interrupt_get_vsr can be used to
|
4534 |
|
|
get hold of the current VSR for a given interrupt vector, allowing it
|
4535 |
|
|
to be restored if the custom VSR is no longer required.
|
4536 |
|
|
cyg_interrupt_set_vsr can be used to install a
|
4537 |
|
|
replacement VSR. Usually the vsr argument will
|
4538 |
|
|
correspond to an exported label in an assembler source file.
|
4539 |
|
|
|
4540 |
|
|
|
4541 |
|
|
|
4542 |
|
|
Valid contexts
|
4543 |
|
|
|
4544 |
|
|
In a typical configuration interrupt handlers are created and attached
|
4545 |
|
|
during system initialization, and never detached or deleted. However
|
4546 |
|
|
it is possible to perform these operations at thread level, if
|
4547 |
|
|
desired. Similarly cyg_interrupt_configure,
|
4548 |
|
|
cyg_interrupt_set_vsr, and
|
4549 |
|
|
cyg_interrupt_set_cpu are usually called only
|
4550 |
|
|
during system initialization, but on typical hardware may be called at
|
4551 |
|
|
any time. cyg_interrupt_get_vsr and
|
4552 |
|
|
cyg_interrupt_get_cpu may be called at any time.
|
4553 |
|
|
|
4554 |
|
|
|
4555 |
|
|
The functions for enabling, disabling, masking and unmasking
|
4556 |
|
|
interrupts can be called in any context, when appropriate. It is the
|
4557 |
|
|
responsibility of application developers to determine when the use of
|
4558 |
|
|
these functions is appropriate.
|
4559 |
|
|
|
4560 |
|
|
|
4561 |
|
|
|
4562 |
|
|
|
4563 |
|
|
|
4564 |
|
|
|
4565 |
|
|
|
4566 |
|
|
|
4567 |
|
|
|
4568 |
|
|
|
4569 |
|
|
|
4570 |
|
|
Kernel Real-time Characterization
|
4571 |
|
|
|
4572 |
|
|
|
4573 |
|
|
tm_basic
|
4574 |
|
|
Measure the performance of the eCos kernel
|
4575 |
|
|
|
4576 |
|
|
|
4577 |
|
|
|
4578 |
|
|
Description
|
4579 |
|
|
|
4580 |
|
|
When building a real-time system, care must be taken to ensure that
|
4581 |
|
|
the system will be able to perform properly within the constraints of
|
4582 |
|
|
that system. One of these constraints may be how fast certain
|
4583 |
|
|
operations can be performed. Another might be how deterministic the
|
4584 |
|
|
overall behavior of the system is. Lastly the memory footprint (size)
|
4585 |
|
|
and unit cost may be important.
|
4586 |
|
|
|
4587 |
|
|
|
4588 |
|
|
One of the major problems encountered while evaluating a system will
|
4589 |
|
|
be how to compare it with possible alternatives. Most manufacturers of
|
4590 |
|
|
real-time systems publish performance numbers, ostensibly so that
|
4591 |
|
|
users can compare the different offerings. However, what these numbers
|
4592 |
|
|
mean and how they were gathered is often not clear. The values are
|
4593 |
|
|
typically measured on a particular piece of hardware, so in order to
|
4594 |
|
|
truly compare, one must obtain measurements for exactly the same set
|
4595 |
|
|
of hardware that were gathered in a similar fashion.
|
4596 |
|
|
|
4597 |
|
|
|
4598 |
|
|
Two major items need to be present in any given set of measurements.
|
4599 |
|
|
First, the raw values for the various operations; these are typically
|
4600 |
|
|
quite easy to measure and will be available for most systems. Second,
|
4601 |
|
|
the determinacy of the numbers; in other words how much the value
|
4602 |
|
|
might change depending on other factors within the system. This value
|
4603 |
|
|
is affected by a number of factors: how long interrupts might be
|
4604 |
|
|
masked, whether or not the function can be interrupted, even very
|
4605 |
|
|
hardware-specific effects such as cache locality and pipeline usage.
|
4606 |
|
|
It is very difficult to measure the determinacy of any given
|
4607 |
|
|
operation, but that determinacy is fundamentally important to proper
|
4608 |
|
|
overall characterization of a system.
|
4609 |
|
|
|
4610 |
|
|
|
4611 |
|
|
In the discussion and numbers that follow, three key measurements are
|
4612 |
|
|
provided. The first measurement is an estimate of the interrupt
|
4613 |
|
|
latency: this is the length of time from when a hardware interrupt
|
4614 |
|
|
occurs until its Interrupt Service Routine (ISR) is called. The second
|
4615 |
|
|
measurement is an estimate of overall interrupt overhead: this is the
|
4616 |
|
|
length of time average interrupt processing takes, as measured by the
|
4617 |
|
|
real-time clock interrupt (other interrupt sources will certainly take
|
4618 |
|
|
a different amount of time, but this data cannot be easily gathered).
|
4619 |
|
|
The third measurement consists of the timings for the various kernel
|
4620 |
|
|
primitives.
|
4621 |
|
|
|
4622 |
|
|
|
4623 |
|
|
|
4624 |
|
|
Methodology
|
4625 |
|
|
|
4626 |
|
|
Key operations in the kernel were measured by using a simple test
|
4627 |
|
|
program which exercises the various kernel primitive operations. A
|
4628 |
|
|
hardware timer, normally the one used to drive the real-time clock,
|
4629 |
|
|
was used for these measurements. In most cases this timer can be read
|
4630 |
|
|
with quite high resolution, typically in the range of a few
|
4631 |
|
|
microseconds. For each measurement, the operation was repeated a
|
4632 |
|
|
number of times. Time stamps were obtained directly before and after
|
4633 |
|
|
the operation was performed. The data gathered for the entire set of
|
4634 |
|
|
operations was then analyzed, generating average (mean), maximum and
|
4635 |
|
|
minimum values. The sample variance (a measure of how close most
|
4636 |
|
|
samples are to the mean) was also calculated. The cost of obtaining
|
4637 |
|
|
the real-time clock timer values was also measured, and was subtracted
|
4638 |
|
|
from all other times.
|
4639 |
|
|
|
4640 |
|
|
|
4641 |
|
|
Most kernel functions can be measured separately. In each case, a
|
4642 |
|
|
reasonable number of iterations are performed. Where the test case
|
4643 |
|
|
involves a kernel object, for example creating a task, each iteration
|
4644 |
|
|
is performed on a different object. There is also a set of tests which
|
4645 |
|
|
measures the interactions between multiple tasks and certain kernel
|
4646 |
|
|
primitives. Most functions are tested in such a way as to determine
|
4647 |
|
|
the variations introduced by varying numbers of objects in the system.
|
4648 |
|
|
For example, the mailbox tests measure the cost of a 'peek' operation
|
4649 |
|
|
when the mailbox is empty, has a single item, and has multiple items
|
4650 |
|
|
present. In this way, any effects of the state of the object or how
|
4651 |
|
|
many items it contains can be determined.
|
4652 |
|
|
|
4653 |
|
|
|
4654 |
|
|
There are a few things to consider about these measurements. Firstly,
|
4655 |
|
|
they are quite micro in scale and only measure the operation in
|
4656 |
|
|
question. These measurements do not adequately describe how the
|
4657 |
|
|
timings would be perturbed in a real system with multiple interrupting
|
4658 |
|
|
sources. Secondly, the possible aberration incurred by the real-time
|
4659 |
|
|
clock (system heartbeat tick) is explicitly avoided. Virtually all
|
4660 |
|
|
kernel functions have been designed to be interruptible. Thus the
|
4661 |
|
|
times presented are typical, but best case, since any particular
|
4662 |
|
|
function may be interrupted by the clock tick processing. This number
|
4663 |
|
|
is explicitly calculated so that the value may be included in any
|
4664 |
|
|
deadline calculations required by the end user. Lastly, the reported
|
4665 |
|
|
measurements were obtained from a system built with all options at
|
4666 |
|
|
their default values. Kernel instrumentation and asserts are also
|
4667 |
|
|
disabled for these measurements. Any number of configuration options
|
4668 |
|
|
can change the measured results, sometimes quite dramatically. For
|
4669 |
|
|
example, mutexes are using priority inheritance in these measurements.
|
4670 |
|
|
The numbers will change if the system is built with priority
|
4671 |
|
|
inheritance on mutex variables turned off.
|
4672 |
|
|
|
4673 |
|
|
|
4674 |
|
|
The final value that is measured is an estimate of interrupt latency.
|
4675 |
|
|
This particular value is not explicitly calculated in the test program
|
4676 |
|
|
used, but rather by instrumenting the kernel itself. The raw number of
|
4677 |
|
|
timer ticks that elapse between the time the timer generates an
|
4678 |
|
|
interrupt and the start of the timer ISR is kept in the kernel. These
|
4679 |
|
|
values are printed by the test program after all other operations have
|
4680 |
|
|
been tested. Thus this should be a reasonable estimate of the
|
4681 |
|
|
interrupt latency over time.
|
4682 |
|
|
|
4683 |
|
|
|
4684 |
|
|
|
4685 |
|
|
|
4686 |
|
|
Using these Measurements
|
4687 |
|
|
|
4688 |
|
|
These measurements can be used in a number of ways. The most typical
|
4689 |
|
|
use will be to compare different real-time kernel offerings on similar
|
4690 |
|
|
hardware, another will be to estimate the cost of implementing a task
|
4691 |
|
|
using eCos (applications can be examined to see what effect the kernel
|
4692 |
|
|
operations will have on the total execution time). Another use would
|
4693 |
|
|
be to observe how the tuning of the kernel affects overall operation.
|
4694 |
|
|
|
4695 |
|
|
|
4696 |
|
|
|
4697 |
|
|
|
4698 |
|
|
Influences on Performance
|
4699 |
|
|
|
4700 |
|
|
A number of factors can affect real-time performance in a system. One
|
4701 |
|
|
of the most common factors, yet most difficult to characterize, is the
|
4702 |
|
|
effect of device drivers and interrupts on system timings. Different
|
4703 |
|
|
device drivers will have differing requirements as to how long
|
4704 |
|
|
interrupts are suppressed, for example. The eCos system has been
|
4705 |
|
|
designed with this in mind, by separating the management of interrupts
|
4706 |
|
|
(ISR handlers) and the processing required by the interrupt
|
4707 |
|
|
(DSR—Deferred Service Routine— handlers). However, since
|
4708 |
|
|
there is so much variability here, and indeed most device drivers will
|
4709 |
|
|
come from the end users themselves, these effects cannot be reliably
|
4710 |
|
|
measured. Attempts have been made to measure the overhead of the
|
4711 |
|
|
single interrupt that eCos relies on, the real-time clock timer. This
|
4712 |
|
|
should give you a reasonable idea of the cost of executing interrupt
|
4713 |
|
|
handling for devices.
|
4714 |
|
|
|
4715 |
|
|
|
4716 |
|
|
|
4717 |
|
|
|
4718 |
|
|
Measured Items
|
4719 |
|
|
|
4720 |
|
|
This section describes the various tests and the numbers presented.
|
4721 |
|
|
All tests use the C kernel API (available by way of
|
4722 |
|
|
cyg/kernel/kapi.h). There is a single main thread
|
4723 |
|
|
in the system that performs the various tests. Additional threads may
|
4724 |
|
|
be created as part of the testing, but these are short lived and are
|
4725 |
|
|
destroyed between tests unless otherwise noted. The terminology
|
4726 |
|
|
“lower priority” means a priority that is less important,
|
4727 |
|
|
not necessarily lower in numerical value. A higher priority thread
|
4728 |
|
|
will run in preference to a lower priority thread even though the
|
4729 |
|
|
priority value of the higher priority thread may be numerically less
|
4730 |
|
|
than that of the lower priority thread.
|
4731 |
|
|
|
4732 |
|
|
|
4733 |
|
|
|
4734 |
|
|
Thread Primitives
|
4735 |
|
|
|
4736 |
|
|
|
4737 |
|
|
Create thread
|
4738 |
|
|
|
4739 |
|
|
This test measures the cyg_thread_create() call.
|
4740 |
|
|
Each call creates a totally new thread. The set of threads created by
|
4741 |
|
|
this test will be reused in the subsequent thread primitive tests.
|
4742 |
|
|
|
4743 |
|
|
|
4744 |
|
|
|
4745 |
|
|
Yield thread
|
4746 |
|
|
|
4747 |
|
|
This test measures the cyg_thread_yield() call.
|
4748 |
|
|
For this test, there are no other runnable threads, thus the test
|
4749 |
|
|
should just measure the overhead of trying to give up the CPU.
|
4750 |
|
|
|
4751 |
|
|
|
4752 |
|
|
|
4753 |
|
|
Suspend [suspended] thread
|
4754 |
|
|
|
4755 |
|
|
This test measures the cyg_thread_suspend() call.
|
4756 |
|
|
A thread may be suspended multiple times; each thread is already
|
4757 |
|
|
suspended from its initial creation, and is suspended again.
|
4758 |
|
|
|
4759 |
|
|
|
4760 |
|
|
|
4761 |
|
|
Resume thread
|
4762 |
|
|
|
4763 |
|
|
This test measures the cyg_thread_resume() call.
|
4764 |
|
|
All of the threads have a suspend count of 2, thus this call does not
|
4765 |
|
|
make them runnable. This test just measures the overhead of resuming a
|
4766 |
|
|
thread.
|
4767 |
|
|
|
4768 |
|
|
|
4769 |
|
|
|
4770 |
|
|
Set priority
|
4771 |
|
|
|
4772 |
|
|
This test measures the cyg_thread_set_priority()
|
4773 |
|
|
call. Each thread, currently suspended, has its priority set to a new
|
4774 |
|
|
value.
|
4775 |
|
|
|
4776 |
|
|
|
4777 |
|
|
|
4778 |
|
|
Get priority
|
4779 |
|
|
|
4780 |
|
|
This test measures the cyg_thread_get_priority()
|
4781 |
|
|
call.
|
4782 |
|
|
|
4783 |
|
|
|
4784 |
|
|
|
4785 |
|
|
Kill [suspended] thread
|
4786 |
|
|
|
4787 |
|
|
This test measures the cyg_thread_kill() call.
|
4788 |
|
|
Each thread in the set is killed. All threads are known to be
|
4789 |
|
|
suspended before being killed.
|
4790 |
|
|
|
4791 |
|
|
|
4792 |
|
|
|
4793 |
|
|
Yield [no other] thread
|
4794 |
|
|
|
4795 |
|
|
This test measures the cyg_thread_yield() call
|
4796 |
|
|
again. This is to demonstrate that the
|
4797 |
|
|
cyg_thread_yield() call has a fixed overhead,
|
4798 |
|
|
regardless of whether there are other threads in the system.
|
4799 |
|
|
|
4800 |
|
|
|
4801 |
|
|
|
4802 |
|
|
Resume [suspended low priority] thread
|
4803 |
|
|
|
4804 |
|
|
This test measures the cyg_thread_resume() call
|
4805 |
|
|
again. In this case, the thread being resumed is lower priority than
|
4806 |
|
|
the main thread, thus it will simply become ready to run but not be
|
4807 |
|
|
granted the CPU. This test measures the cost of making a thread ready
|
4808 |
|
|
to run.
|
4809 |
|
|
|
4810 |
|
|
|
4811 |
|
|
|
4812 |
|
|
Resume [runnable low priority] thread
|
4813 |
|
|
|
4814 |
|
|
This test measures the cyg_thread_resume() call
|
4815 |
|
|
again. In this case, the thread being resumed is lower priority than
|
4816 |
|
|
the main thread and has already been made runnable, so in fact the
|
4817 |
|
|
resume call has no effect.
|
4818 |
|
|
|
4819 |
|
|
|
4820 |
|
|
|
4821 |
|
|
Suspend [runnable] thread
|
4822 |
|
|
|
4823 |
|
|
This test measures the cyg_thread_suspend() call
|
4824 |
|
|
again. In this case, each thread has already been made runnable (by
|
4825 |
|
|
previous tests).
|
4826 |
|
|
|
4827 |
|
|
|
4828 |
|
|
|
4829 |
|
|
Yield [only low priority] thread
|
4830 |
|
|
|
4831 |
|
|
This test measures the cyg_thread_yield() call.
|
4832 |
|
|
In this case, there are many other runnable threads, but they are all
|
4833 |
|
|
lower priority than the main thread, thus no thread switches will take
|
4834 |
|
|
place.
|
4835 |
|
|
|
4836 |
|
|
|
4837 |
|
|
|
4838 |
|
|
Suspend [runnable->not runnable] thread
|
4839 |
|
|
|
4840 |
|
|
This test measures the cyg_thread_suspend() call
|
4841 |
|
|
again. The thread being suspended will become non-runnable by this
|
4842 |
|
|
action.
|
4843 |
|
|
|
4844 |
|
|
|
4845 |
|
|
|
4846 |
|
|
Kill [runnable] thread
|
4847 |
|
|
|
4848 |
|
|
This test measures the cyg_thread_kill() call
|
4849 |
|
|
again. In this case, the thread being killed is currently runnable,
|
4850 |
|
|
but lower priority than the main thread.
|
4851 |
|
|
|
4852 |
|
|
|
4853 |
|
|
|
4854 |
|
|
Resume [high priority] thread
|
4855 |
|
|
|
4856 |
|
|
This test measures the cyg_thread_resume() call.
|
4857 |
|
|
The thread being resumed is higher priority than the main thread, thus
|
4858 |
|
|
a thread switch will take place on each call. In fact there will be
|
4859 |
|
|
two thread switches; one to the new higher priority thread and a
|
4860 |
|
|
second back to the test thread. The test thread exits immediately.
|
4861 |
|
|
|
4862 |
|
|
|
4863 |
|
|
|
4864 |
|
|
Thread switch
|
4865 |
|
|
|
4866 |
|
|
This test attempts to measure the cost of switching from one thread to
|
4867 |
|
|
another. Two equal priority threads are started and they will each
|
4868 |
|
|
yield to the other for a number of iterations. A time stamp is
|
4869 |
|
|
gathered in one thread before the
|
4870 |
|
|
cyg_thread_yield() call and after the call in the
|
4871 |
|
|
other thread.
|
4872 |
|
|
|
4873 |
|
|
|
4874 |
|
|
|
4875 |
|
|
|
4876 |
|
|
|
4877 |
|
|
|
4878 |
|
|
Scheduler Primitives
|
4879 |
|
|
|
4880 |
|
|
|
4881 |
|
|
Scheduler lock
|
4882 |
|
|
|
4883 |
|
|
This test measures the cyg_scheduler_lock() call.
|
4884 |
|
|
|
4885 |
|
|
|
4886 |
|
|
|
4887 |
|
|
Scheduler unlock [0 threads]
|
4888 |
|
|
|
4889 |
|
|
This test measures the cyg_scheduler_unlock()
|
4890 |
|
|
call. There are no other threads in the system and the unlock happens
|
4891 |
|
|
immediately after a lock so there will be no pending DSR’s to
|
4892 |
|
|
run.
|
4893 |
|
|
|
4894 |
|
|
|
4895 |
|
|
|
4896 |
|
|
Scheduler unlock [1 suspended thread]
|
4897 |
|
|
|
4898 |
|
|
This test measures the cyg_scheduler_unlock()
|
4899 |
|
|
call. There is one other thread in the system which is currently
|
4900 |
|
|
suspended.
|
4901 |
|
|
|
4902 |
|
|
|
4903 |
|
|
|
4904 |
|
|
Scheduler unlock [many suspended threads]
|
4905 |
|
|
|
4906 |
|
|
This test measures the cyg_scheduler_unlock()
|
4907 |
|
|
call. There are many other threads in the system which are currently
|
4908 |
|
|
suspended. The purpose of this test is to determine the cost of having
|
4909 |
|
|
additional threads in the system when the scheduler is activated by
|
4910 |
|
|
way of cyg_scheduler_unlock().
|
4911 |
|
|
|
4912 |
|
|
|
4913 |
|
|
|
4914 |
|
|
Scheduler unlock [many low priority threads]
|
4915 |
|
|
|
4916 |
|
|
This test measures the cyg_scheduler_unlock()
|
4917 |
|
|
call. There are many other threads in the system which are runnable
|
4918 |
|
|
but are lower priority than the main thread. The purpose of this test
|
4919 |
|
|
is to determine the cost of having additional threads in the system
|
4920 |
|
|
when the scheduler is activated by way of
|
4921 |
|
|
cyg_scheduler_unlock().
|
4922 |
|
|
|
4923 |
|
|
|
4924 |
|
|
|
4925 |
|
|
|
4926 |
|
|
|
4927 |
|
|
|
4928 |
|
|
Mutex Primitives
|
4929 |
|
|
|
4930 |
|
|
|
4931 |
|
|
Init mutex
|
4932 |
|
|
|
4933 |
|
|
This test measures the cyg_mutex_init() call. A
|
4934 |
|
|
number of separate mutex variables are created. The purpose of this
|
4935 |
|
|
test is to measure the cost of creating a new mutex and introducing it
|
4936 |
|
|
to the system.
|
4937 |
|
|
|
4938 |
|
|
|
4939 |
|
|
|
4940 |
|
|
Lock [unlocked] mutex
|
4941 |
|
|
|
4942 |
|
|
This test measures the cyg_mutex_lock() call. The
|
4943 |
|
|
purpose of this test is to measure the cost of locking a mutex which
|
4944 |
|
|
is currently unlocked. There are no other threads executing in the
|
4945 |
|
|
system while this test runs.
|
4946 |
|
|
|
4947 |
|
|
|
4948 |
|
|
|
4949 |
|
|
Unlock [locked] mutex
|
4950 |
|
|
|
4951 |
|
|
This test measures the cyg_mutex_unlock() call.
|
4952 |
|
|
The purpose of this test is to measure the cost of unlocking a mutex
|
4953 |
|
|
which is currently locked. There are no other threads executing in the
|
4954 |
|
|
system while this test runs.
|
4955 |
|
|
|
4956 |
|
|
|
4957 |
|
|
|
4958 |
|
|
Trylock [unlocked] mutex
|
4959 |
|
|
|
4960 |
|
|
This test measures the cyg_mutex_trylock() call.
|
4961 |
|
|
The purpose of this test is to measure the cost of locking a mutex
|
4962 |
|
|
which is currently unlocked. There are no other threads executing in
|
4963 |
|
|
the system while this test runs.
|
4964 |
|
|
|
4965 |
|
|
|
4966 |
|
|
|
4967 |
|
|
Trylock [locked] mutex
|
4968 |
|
|
|
4969 |
|
|
This test measures the cyg_mutex_trylock() call.
|
4970 |
|
|
The purpose of this test is to measure the cost of locking a mutex
|
4971 |
|
|
which is currently locked. There are no other threads executing in the
|
4972 |
|
|
system while this test runs.
|
4973 |
|
|
|
4974 |
|
|
|
4975 |
|
|
|
4976 |
|
|
Destroy mutex
|
4977 |
|
|
|
4978 |
|
|
This test measures the cyg_mutex_destroy() call.
|
4979 |
|
|
The purpose of this test is to measure the cost of deleting a mutex
|
4980 |
|
|
from the system. There are no other threads executing in the system
|
4981 |
|
|
while this test runs.
|
4982 |
|
|
|
4983 |
|
|
|
4984 |
|
|
|
4985 |
|
|
Unlock/Lock mutex
|
4986 |
|
|
|
4987 |
|
|
This test attempts to measure the cost of unlocking a mutex for which
|
4988 |
|
|
there is another higher priority thread waiting. When the mutex is
|
4989 |
|
|
unlocked, the higher priority waiting thread will immediately take the
|
4990 |
|
|
lock. The time from when the unlock is issued until after the lock
|
4991 |
|
|
succeeds in the second thread is measured, thus giving the round-trip
|
4992 |
|
|
or circuit time for this type of synchronizer.
|
4993 |
|
|
|
4994 |
|
|
|
4995 |
|
|
|
4996 |
|
|
|
4997 |
|
|
|
4998 |
|
|
|
4999 |
|
|
Mailbox Primitives
|
5000 |
|
|
|
5001 |
|
|
|
5002 |
|
|
Create mbox
|
5003 |
|
|
|
5004 |
|
|
This test measures the cyg_mbox_create() call. A
|
5005 |
|
|
number of separate mailboxes is created. The purpose of this test is
|
5006 |
|
|
to measure the cost of creating a new mailbox and introducing it to
|
5007 |
|
|
the system.
|
5008 |
|
|
|
5009 |
|
|
|
5010 |
|
|
|
5011 |
|
|
Peek [empty] mbox
|
5012 |
|
|
|
5013 |
|
|
This test measures the cyg_mbox_peek() call. An
|
5014 |
|
|
attempt is made to peek the value in each mailbox, which is currently
|
5015 |
|
|
empty. The purpose of this test is to measure the cost of checking a
|
5016 |
|
|
mailbox for a value without blocking.
|
5017 |
|
|
|
5018 |
|
|
|
5019 |
|
|
|
5020 |
|
|
Put [first] mbox
|
5021 |
|
|
|
5022 |
|
|
This test measures the cyg_mbox_put() call. One
|
5023 |
|
|
item is added to a currently empty mailbox. The purpose of this test
|
5024 |
|
|
is to measure the cost of adding an item to a mailbox. There are no
|
5025 |
|
|
other threads currently waiting for mailbox items to arrive.
|
5026 |
|
|
|
5027 |
|
|
|
5028 |
|
|
|
5029 |
|
|
Peek [1 msg] mbox
|
5030 |
|
|
|
5031 |
|
|
This test measures the cyg_mbox_peek() call. An
|
5032 |
|
|
attempt is made to peek the value in each mailbox, which contains a
|
5033 |
|
|
single item. The purpose of this test is to measure the cost of
|
5034 |
|
|
checking a mailbox which has data to deliver.
|
5035 |
|
|
|
5036 |
|
|
|
5037 |
|
|
|
5038 |
|
|
Put [second] mbox
|
5039 |
|
|
|
5040 |
|
|
This test measures the cyg_mbox_put() call. A
|
5041 |
|
|
second item is added to a mailbox. The purpose of this test is to
|
5042 |
|
|
measure the cost of adding an additional item to a mailbox. There are
|
5043 |
|
|
no other threads currently waiting for mailbox items to arrive.
|
5044 |
|
|
|
5045 |
|
|
|
5046 |
|
|
|
5047 |
|
|
Peek [2 msgs] mbox
|
5048 |
|
|
|
5049 |
|
|
This test measures the cyg_mbox_peek() call. An
|
5050 |
|
|
attempt is made to peek the value in each mailbox, which contains two
|
5051 |
|
|
items. The purpose of this test is to measure the cost of checking a
|
5052 |
|
|
mailbox which has data to deliver.
|
5053 |
|
|
|
5054 |
|
|
|
5055 |
|
|
|
5056 |
|
|
Get [first] mbox
|
5057 |
|
|
|
5058 |
|
|
This test measures the cyg_mbox_get() call. The
|
5059 |
|
|
first item is removed from a mailbox that currently contains two
|
5060 |
|
|
items. The purpose of this test is to measure the cost of obtaining an
|
5061 |
|
|
item from a mailbox without blocking.
|
5062 |
|
|
|
5063 |
|
|
|
5064 |
|
|
|
5065 |
|
|
Get [second] mbox
|
5066 |
|
|
|
5067 |
|
|
This test measures the cyg_mbox_get() call. The
|
5068 |
|
|
last item is removed from a mailbox that currently contains one item.
|
5069 |
|
|
The purpose of this test is to measure the cost of obtaining an item
|
5070 |
|
|
from a mailbox without blocking.
|
5071 |
|
|
|
5072 |
|
|
|
5073 |
|
|
|
5074 |
|
|
Tryput [first] mbox
|
5075 |
|
|
|
5076 |
|
|
This test measures the cyg_mbox_tryput() call. A
|
5077 |
|
|
single item is added to a currently empty mailbox. The purpose of this
|
5078 |
|
|
test is to measure the cost of adding an item to a mailbox.
|
5079 |
|
|
|
5080 |
|
|
|
5081 |
|
|
|
5082 |
|
|
Peek item [non-empty] mbox
|
5083 |
|
|
|
5084 |
|
|
This test measures the cyg_mbox_peek_item() call.
|
5085 |
|
|
A single item is fetched from a mailbox that contains a single item.
|
5086 |
|
|
The purpose of this test is to measure the cost of obtaining an item
|
5087 |
|
|
without disturbing the mailbox.
|
5088 |
|
|
|
5089 |
|
|
|
5090 |
|
|
|
5091 |
|
|
Tryget [non-empty] mbox
|
5092 |
|
|
|
5093 |
|
|
This test measures the cyg_mbox_tryget() call. A
|
5094 |
|
|
single item is removed from a mailbox that contains exactly one item.
|
5095 |
|
|
The purpose of this test is to measure the cost of obtaining one item
|
5096 |
|
|
from a non-empty mailbox.
|
5097 |
|
|
|
5098 |
|
|
|
5099 |
|
|
|
5100 |
|
|
Peek item [empty] mbox
|
5101 |
|
|
|
5102 |
|
|
This test measures the cyg_mbox_peek_item() call.
|
5103 |
|
|
An attempt is made to fetch an item from a mailbox that is empty. The
|
5104 |
|
|
purpose of this test is to measure the cost of trying to obtain an
|
5105 |
|
|
item when the mailbox is empty.
|
5106 |
|
|
|
5107 |
|
|
|
5108 |
|
|
|
5109 |
|
|
Tryget [empty] mbox
|
5110 |
|
|
|
5111 |
|
|
This test measures the cyg_mbox_tryget() call. An
|
5112 |
|
|
attempt is made to fetch an item from a mailbox that is empty. The
|
5113 |
|
|
purpose of this test is to measure the cost of trying to obtain an
|
5114 |
|
|
item when the mailbox is empty.
|
5115 |
|
|
|
5116 |
|
|
|
5117 |
|
|
|
5118 |
|
|
Waiting to get mbox
|
5119 |
|
|
|
5120 |
|
|
This test measures the cyg_mbox_waiting_to_get()
|
5121 |
|
|
call. The purpose of this test is to measure the cost of determining
|
5122 |
|
|
how many threads are waiting to obtain a message from this mailbox.
|
5123 |
|
|
|
5124 |
|
|
|
5125 |
|
|
|
5126 |
|
|
Waiting to put mbox
|
5127 |
|
|
|
5128 |
|
|
This test measures the cyg_mbox_waiting_to_put()
|
5129 |
|
|
call. The purpose of this test is to measure the cost of determining
|
5130 |
|
|
how many threads are waiting to put a message into this mailbox.
|
5131 |
|
|
|
5132 |
|
|
|
5133 |
|
|
|
5134 |
|
|
Delete mbox
|
5135 |
|
|
|
5136 |
|
|
This test measures the cyg_mbox_delete() call.
|
5137 |
|
|
The purpose of this test is to measure the cost of destroying a
|
5138 |
|
|
mailbox and removing it from the system.
|
5139 |
|
|
|
5140 |
|
|
|
5141 |
|
|
|
5142 |
|
|
Put/Get mbox
|
5143 |
|
|
|
5144 |
|
|
In this round-trip test, one thread is sending data to a mailbox that
|
5145 |
|
|
is being consumed by another thread. The time from when the data is
|
5146 |
|
|
put into the mailbox until it has been delivered to the waiting thread
|
5147 |
|
|
is measured. Note that this time will contain a thread switch.
|
5148 |
|
|
|
5149 |
|
|
|
5150 |
|
|
|
5151 |
|
|
|
5152 |
|
|
|
5153 |
|
|
|
5154 |
|
|
Semaphore Primitives
|
5155 |
|
|
|
5156 |
|
|
|
5157 |
|
|
Init semaphore
|
5158 |
|
|
|
5159 |
|
|
This test measures the cyg_semaphore_init() call.
|
5160 |
|
|
A number of separate semaphore objects are created and introduced to
|
5161 |
|
|
the system. The purpose of this test is to measure the cost of
|
5162 |
|
|
creating a new semaphore.
|
5163 |
|
|
|
5164 |
|
|
|
5165 |
|
|
|
5166 |
|
|
Post [0] semaphore
|
5167 |
|
|
|
5168 |
|
|
This test measures the cyg_semaphore_post() call.
|
5169 |
|
|
Each semaphore currently has a value of 0 and there are no other
|
5170 |
|
|
threads in the system. The purpose of this test is to measure the
|
5171 |
|
|
overhead cost of posting to a semaphore. This cost will differ if
|
5172 |
|
|
there is a thread waiting for the semaphore.
|
5173 |
|
|
|
5174 |
|
|
|
5175 |
|
|
|
5176 |
|
|
Wait [1] semaphore
|
5177 |
|
|
|
5178 |
|
|
This test measures the cyg_semaphore_wait() call.
|
5179 |
|
|
The semaphore has a current value of 1 so the call is non-blocking.
|
5180 |
|
|
The purpose of the test is to measure the overhead of
|
5181 |
|
|
“taking” a semaphore.
|
5182 |
|
|
|
5183 |
|
|
|
5184 |
|
|
|
5185 |
|
|
Trywait [0] semaphore
|
5186 |
|
|
|
5187 |
|
|
This test measures the cyg_semaphore_trywait()
|
5188 |
|
|
call. The semaphore has a value of 0 when the call is made. The
|
5189 |
|
|
purpose of this test is to measure the cost of seeing if a semaphore
|
5190 |
|
|
can be “taken” without blocking. In this case, the answer
|
5191 |
|
|
would be no.
|
5192 |
|
|
|
5193 |
|
|
|
5194 |
|
|
|
5195 |
|
|
Trywait [1] semaphore
|
5196 |
|
|
|
5197 |
|
|
This test measures the cyg_semaphore_trywait()
|
5198 |
|
|
call. The semaphore has a value of 1 when the call is made. The
|
5199 |
|
|
purpose of this test is to measure the cost of seeing if a semaphore
|
5200 |
|
|
can be “taken” without blocking. In this case, the answer
|
5201 |
|
|
would be yes.
|
5202 |
|
|
|
5203 |
|
|
|
5204 |
|
|
|
5205 |
|
|
Peek semaphore
|
5206 |
|
|
|
5207 |
|
|
This test measures the cyg_semaphore_peek() call.
|
5208 |
|
|
The purpose of this test is to measure the cost of obtaining the
|
5209 |
|
|
current semaphore count value.
|
5210 |
|
|
|
5211 |
|
|
|
5212 |
|
|
|
5213 |
|
|
Destroy semaphore
|
5214 |
|
|
|
5215 |
|
|
This test measures the cyg_semaphore_destroy()
|
5216 |
|
|
call. The purpose of this test is to measure the cost of deleting a
|
5217 |
|
|
semaphore from the system.
|
5218 |
|
|
|
5219 |
|
|
|
5220 |
|
|
|
5221 |
|
|
Post/Wait semaphore
|
5222 |
|
|
|
5223 |
|
|
In this round-trip test, two threads are passing control back and
|
5224 |
|
|
forth by using a semaphore. The time from when one thread calls
|
5225 |
|
|
cyg_semaphore_post() until the other thread
|
5226 |
|
|
completes its cyg_semaphore_wait() is measured.
|
5227 |
|
|
Note that each iteration of this test will involve a thread switch.
|
5228 |
|
|
|
5229 |
|
|
|
5230 |
|
|
|
5231 |
|
|
|
5232 |
|
|
|
5233 |
|
|
|
5234 |
|
|
Counters
|
5235 |
|
|
|
5236 |
|
|
|
5237 |
|
|
Create counter
|
5238 |
|
|
|
5239 |
|
|
This test measures the cyg_counter_create() call.
|
5240 |
|
|
A number of separate counters are created. The purpose of this test is
|
5241 |
|
|
to measure the cost of creating a new counter and introducing it to
|
5242 |
|
|
the system.
|
5243 |
|
|
|
5244 |
|
|
|
5245 |
|
|
|
5246 |
|
|
Get counter value
|
5247 |
|
|
|
5248 |
|
|
This test measures the
|
5249 |
|
|
cyg_counter_current_value() call. The current
|
5250 |
|
|
value of each counter is obtained.
|
5251 |
|
|
|
5252 |
|
|
|
5253 |
|
|
|
5254 |
|
|
Set counter value
|
5255 |
|
|
|
5256 |
|
|
This test measures the cyg_counter_set_value()
|
5257 |
|
|
call. Each counter is set to a new value.
|
5258 |
|
|
|
5259 |
|
|
|
5260 |
|
|
|
5261 |
|
|
Tick counter
|
5262 |
|
|
|
5263 |
|
|
This test measures the cyg_counter_tick() call.
|
5264 |
|
|
Each counter is “ticked” once.
|
5265 |
|
|
|
5266 |
|
|
|
5267 |
|
|
|
5268 |
|
|
Delete counter
|
5269 |
|
|
|
5270 |
|
|
This test measures the cyg_counter_delete() call.
|
5271 |
|
|
Each counter is deleted from the system. The purpose of this test is
|
5272 |
|
|
to measure the cost of deleting a counter object.
|
5273 |
|
|
|
5274 |
|
|
|
5275 |
|
|
|
5276 |
|
|
|
5277 |
|
|
|
5278 |
|
|
|
5279 |
|
|
Alarms
|
5280 |
|
|
|
5281 |
|
|
|
5282 |
|
|
Create alarm
|
5283 |
|
|
|
5284 |
|
|
This test measures the cyg_alarm_create() call. A
|
5285 |
|
|
number of separate alarms are created, all attached to the same
|
5286 |
|
|
counter object. The purpose of this test is to measure the cost of
|
5287 |
|
|
creating a new counter and introducing it to the system.
|
5288 |
|
|
|
5289 |
|
|
|
5290 |
|
|
|
5291 |
|
|
Initialize alarm
|
5292 |
|
|
|
5293 |
|
|
This test measures the cyg_alarm_initialize()
|
5294 |
|
|
call. Each alarm is initialized to a small value.
|
5295 |
|
|
|
5296 |
|
|
|
5297 |
|
|
|
5298 |
|
|
Disable alarm
|
5299 |
|
|
|
5300 |
|
|
This test measures the cyg_alarm_disable() call.
|
5301 |
|
|
Each alarm is explicitly disabled.
|
5302 |
|
|
|
5303 |
|
|
|
5304 |
|
|
|
5305 |
|
|
Enable alarm
|
5306 |
|
|
|
5307 |
|
|
This test measures the cyg_alarm_enable() call.
|
5308 |
|
|
Each alarm is explicitly enabled.
|
5309 |
|
|
|
5310 |
|
|
|
5311 |
|
|
|
5312 |
|
|
Delete alarm
|
5313 |
|
|
|
5314 |
|
|
This test measures the cyg_alarm_delete() call.
|
5315 |
|
|
Each alarm is destroyed. The purpose of this test is to measure the
|
5316 |
|
|
cost of deleting an alarm and removing it from the system.
|
5317 |
|
|
|
5318 |
|
|
|
5319 |
|
|
|
5320 |
|
|
Tick counter [1 alarm]
|
5321 |
|
|
|
5322 |
|
|
This test measures the cyg_counter_tick() call. A
|
5323 |
|
|
counter is created that has a single alarm attached to it. The purpose
|
5324 |
|
|
of this test is to measure the cost of “ticking” a counter
|
5325 |
|
|
when it has a single attached alarm. In this test, the alarm is not
|
5326 |
|
|
activated (fired).
|
5327 |
|
|
|
5328 |
|
|
|
5329 |
|
|
|
5330 |
|
|
Tick counter [many alarms]
|
5331 |
|
|
|
5332 |
|
|
This test measures the cyg_counter_tick() call. A
|
5333 |
|
|
counter is created that has multiple alarms attached to it. The
|
5334 |
|
|
purpose of this test is to measure the cost of “ticking” a
|
5335 |
|
|
counter when it has many attached alarms. In this test, the alarms are
|
5336 |
|
|
not activated (fired).
|
5337 |
|
|
|
5338 |
|
|
|
5339 |
|
|
|
5340 |
|
|
Tick & fire counter [1 alarm]
|
5341 |
|
|
|
5342 |
|
|
This test measures the cyg_counter_tick() call. A
|
5343 |
|
|
counter is created that has a single alarm attached to it. The purpose
|
5344 |
|
|
of this test is to measure the cost of “ticking” a counter
|
5345 |
|
|
when it has a single attached alarm. In this test, the alarm is
|
5346 |
|
|
activated (fired). Thus the measured time will include the overhead of
|
5347 |
|
|
calling the alarm callback function.
|
5348 |
|
|
|
5349 |
|
|
|
5350 |
|
|
|
5351 |
|
|
Tick & fire counter [many alarms]
|
5352 |
|
|
|
5353 |
|
|
This test measures the cyg_counter_tick() call. A
|
5354 |
|
|
counter is created that has multiple alarms attached to it. The
|
5355 |
|
|
purpose of this test is to measure the cost of “ticking” a
|
5356 |
|
|
counter when it has many attached alarms. In this test, the alarms are
|
5357 |
|
|
activated (fired). Thus the measured time will include the overhead of
|
5358 |
|
|
calling the alarm callback function.
|
5359 |
|
|
|
5360 |
|
|
|
5361 |
|
|
|
5362 |
|
|
Alarm latency [0 threads]
|
5363 |
|
|
|
5364 |
|
|
This test attempts to measure the latency in calling an alarm callback
|
5365 |
|
|
function. The time from the clock interrupt until the alarm function
|
5366 |
|
|
is called is measured. In this test, there are no threads that can be
|
5367 |
|
|
run, other than the system idle thread, when the clock interrupt
|
5368 |
|
|
occurs (all threads are suspended).
|
5369 |
|
|
|
5370 |
|
|
|
5371 |
|
|
|
5372 |
|
|
Alarm latency [2 threads]
|
5373 |
|
|
|
5374 |
|
|
This test attempts to measure the latency in calling an alarm callback
|
5375 |
|
|
function. The time from the clock interrupt until the alarm function
|
5376 |
|
|
is called is measured. In this test, there are exactly two threads
|
5377 |
|
|
which are running when the clock interrupt occurs. They are simply
|
5378 |
|
|
passing back and forth by way of the
|
5379 |
|
|
cyg_thread_yield() call. The purpose of this test
|
5380 |
|
|
is to measure the variations in the latency when there are executing
|
5381 |
|
|
threads.
|
5382 |
|
|
|
5383 |
|
|
|
5384 |
|
|
|
5385 |
|
|
Alarm latency [many threads]
|
5386 |
|
|
|
5387 |
|
|
This test attempts to measure the latency in calling an alarm callback
|
5388 |
|
|
function. The time from the clock interrupt until the alarm function
|
5389 |
|
|
is called is measured. In this test, there are a number of threads
|
5390 |
|
|
which are running when the clock interrupt occurs. They are simply
|
5391 |
|
|
passing back and forth by way of the
|
5392 |
|
|
cyg_thread_yield() call. The purpose of this test
|
5393 |
|
|
is to measure the variations in the latency when there are many
|
5394 |
|
|
executing threads.
|
5395 |
|
|
|
5396 |
|
|
|
5397 |
|
|
|
5398 |
|
|
|
5399 |
|
|
|
5400 |
|
|
|
5401 |
|
|
|
5402 |
|
|
|
5403 |
|
|
|
5404 |
|
|
|
5405 |
|
|
|
5406 |
|
|
|