source: rtems-docs/c-user/key_concepts.rst @ 7f89df8

5
Last change on this file since 7f89df8 was 39773ce, checked in by Sebastian Huber <sebastian.huber@…>, on 05/11/17 at 07:25:04

c-user: Replace pre-emption with preemption

  • Property mode set to 100644
File size: 24.3 KB
Line 
1.. comment SPDX-License-Identifier: CC-BY-SA-4.0
2
3.. COMMENT: COPYRIGHT (c) 1988-2008.
4.. COMMENT: On-Line Applications Research Corporation (OAR).
5.. COMMENT: All rights reserved.
6
7Key Concepts
8************
9
10Introduction
11============
12
13The facilities provided by RTEMS are built upon a foundation of very powerful
14concepts.  These concepts must be understood before the application developer
15can efficiently utilize RTEMS.  The purpose of this chapter is to familiarize
16one with these concepts.
17
18.. _objects:
19
20Objects
21=======
22
23.. index:: objects
24
25RTEMS provides directives which can be used to dynamically create, delete, and
26manipulate a set of predefined object types.  These types include tasks,
27message queues, semaphores, memory regions, memory partitions, timers, ports,
28and rate monotonic periods.  The object-oriented nature of RTEMS encourages the
29creation of modular applications built upon re-usable "building block"
30routines.
31
32All objects are created on the local node as required by the application and
33have an RTEMS assigned ID.  All objects have a user-assigned name.  Although a
34relationship exists between an object's name and its RTEMS assigned ID, the
35name and ID are not identical.  Object names are completely arbitrary and
36selected by the user as a meaningful "tag" which may commonly reflect the
37object's use in the application.  Conversely, object IDs are designed to
38facilitate efficient object manipulation by the executive.
39
40Object Names
41------------
42.. index:: object name
43.. index:: rtems_name
44
45An object name is an unsigned thirty-two bit entity associated with the object
46by the user.  The data type ``rtems_name`` is used to store object
47names... index:: rtems_build_name
48
49Although not required by RTEMS, object names are often composed of four ASCII
50characters which help identify that object.  For example, a task which causes a
51light to blink might be called "LITE".  The ``rtems_build_name`` routine is
52provided to build an object name from four ASCII characters.  The following
53example illustrates this:
54
55.. code-block:: c
56
57    rtems_name my_name;
58    my_name = rtems_build_name( 'L', 'I', 'T', 'E' );
59
60However, it is not required that the application use ASCII characters to build
61object names.  For example, if an application requires one-hundred tasks, it
62would be difficult to assign meaningful ASCII names to each task.  A more
63convenient approach would be to name them the binary values one through
64one-hundred, respectively.
65
66.. index:: rtems_object_get_name
67
68RTEMS provides a helper routine, ``rtems_object_get_name``, which can be used
69to obtain the name of any RTEMS object using just its ID.  This routine
70attempts to convert the name into a printable string.
71
72The following example illustrates the use of this method to print an object
73name:
74
75.. code-block:: c
76
77    #include <rtems.h>
78    #include <rtems/bspIo.h>
79    void print_name(rtems_id id)
80    {
81        char  buffer[10];   /* name assumed to be 10 characters or less */
82        char *result;
83        result = rtems_object_get_name( id, sizeof(buffer), buffer );
84        printk( "ID=0x%08x name=%s\n", id, ((result) ? result : "no name") );
85    }
86
87Object IDs
88----------
89.. index:: object ID
90.. index:: object ID composition
91.. index:: rtems_id
92
93An object ID is a unique unsigned integer value which uniquely identifies an
94object instance.  Object IDs are passed as arguments to many directives in
95RTEMS and RTEMS translates the ID to an internal object pointer. The efficient
96manipulation of object IDs is critical to the performance of RTEMS services.
97Because of this, there are two object Id formats defined.  Each target
98architecture specifies which format it will use.  There is a thirty-two bit
99format which is used for most of the supported architectures and supports
100multiprocessor configurations.  There is also a simpler sixteen bit format
101which is appropriate for smaller target architectures and does not support
102multiprocessor configurations.
103
104Thirty-Two Object ID Format
105~~~~~~~~~~~~~~~~~~~~~~~~~~~
106
107The thirty-two bit format for an object ID is composed of four parts: API,
108object class, node, and index.  The data type ``rtems_id`` is used to store
109object IDs.
110
111.. code-block:: c
112
113    31      27 26   24 23          16 15                             0
114    +---------+-------+--------------+-------------------------------+
115    |         |       |              |                               |
116    |  Class  |  API  |     Node     |             Index             |
117    |         |       |              |                               |
118    +---------+-------+--------------+-------------------------------+
119
120The most significant five bits are the object class.  The next three bits
121indicate the API to which the object class belongs.  The next eight bits
122(16-23) are the number of the node on which this object was created.  The node
123number is always one (1) in a single processor system.  The least significant
124sixteen bits form an identifier within a particular object type.  This
125identifier, called the object index, ranges in value from 1 to the maximum
126number of objects configured for this object type.
127
128Sixteen Bit Object ID Format
129~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130
131The sixteen bit format for an object ID is composed of three parts: API, object
132class, and index.  The data type ``rtems_id`` is used to store object IDs.
133
134.. code-block:: c
135
136    15      11 10    8 7            0
137    +---------+-------+--------------+
138    |         |       |              |
139    |  Class  |  API  |    Index     |
140    |         |       |              |
141    +---------+-------+--------------+
142
143The sixteen-bit format is designed to be as similar as possible to the
144thrity-two bit format.  The differences are limited to the eliminatation of the
145node field and reduction of the index field from sixteen-bits to 8-bits.  Thus
146the sixteen bit format only supports up to 255 object instances per API/Class
147combination and single processor systems.  As this format is typically utilized
148by sixteen-bit processors with limited address space, this is more than enough
149object instances.
150
151Object ID Description
152---------------------
153
154The components of an object ID make it possible to quickly locate any object in
155even the most complicated multiprocessor system.  Object ID's are associated
156with an object by RTEMS when the object is created and the corresponding ID is
157returned by the appropriate object create directive.  The object ID is required
158as input to all directives involving objects, except those which create an
159object or obtain the ID of an object.
160
161The object identification directives can be used to dynamically obtain a
162particular object's ID given its name.  This mapping is accomplished by
163searching the name table associated with this object type.  If the name is
164non-unique, then the ID associated with the first occurrence of the name will
165be returned to the application.  Since object IDs are returned when the object
166is created, the object identification directives are not necessary in a
167properly designed single processor application.
168
169In addition, services are provided to portably examine the subcomponents of an
170RTEMS ID.  These services are described in detail later in this manual but are
171prototyped as follows:
172
173.. index:: obtaining class from object ID
174.. index:: obtaining node from object ID
175.. index:: obtaining index from object ID
176.. index:: get class from object ID
177.. index:: get node from object ID
178.. index:: get index from object ID
179.. index:: rtems_object_id_get_api
180.. index:: rtems_object_id_get_class
181.. index:: rtems_object_id_get_node
182.. index:: rtems_object_id_get_index
183
184.. code-block:: c
185
186    uint32_t rtems_object_id_get_api( rtems_id );
187    uint32_t rtems_object_id_get_class( rtems_id );
188    uint32_t rtems_object_id_get_node( rtems_id );
189    uint32_t rtems_object_id_get_index( rtems_id );
190
191An object control block is a data structure defined by RTEMS which contains the
192information necessary to manage a particular object type.  For efficiency
193reasons, the format of each object type's control block is different.  However,
194many of the fields are similar in function.  The number of each type of control
195block is application dependent and determined by the values specified in the
196user's Configuration Table.  An object control block is allocated at object
197create time and freed when the object is deleted.  With the exception of user
198extension routines, object control blocks are not directly manipulated by user
199applications.
200
201Communication and Synchronization
202=================================
203.. index:: communication and synchronization
204
205In real-time multitasking applications, the ability for cooperating execution
206threads to communicate and synchronize with each other is imperative.  A
207real-time executive should provide an application with the following
208capabilities:
209
210- Data transfer between cooperating tasks
211
212- Data transfer between tasks and ISRs
213
214- Synchronization of cooperating tasks
215
216- Synchronization of tasks and ISRs
217
218Most RTEMS managers can be used to provide some form of communication and/or
219synchronization.  However, managers dedicated specifically to communication and
220synchronization provide well established mechanisms which directly map to the
221application's varying needs.  This level of flexibility allows the application
222designer to match the features of a particular manager with the complexity of
223communication and synchronization required.  The following managers were
224specifically designed for communication and synchronization:
225
226- Semaphore
227
228- Message Queue
229
230- Event
231
232- Signal
233
234The semaphore manager supports mutual exclusion involving the synchronization
235of access to one or more shared user resources.  Binary semaphores may utilize
236the optional priority inheritance algorithm to avoid the problem of priority
237inversion.  The message manager supports both communication and
238synchronization, while the event manager primarily provides a high performance
239synchronization mechanism.  The signal manager supports only asynchronous
240communication and is typically used for exception handling.
241
242Locking Protocols
243=================
244.. index:: locking protocols
245
246RTEMS supports the four locking protocols
247
248* :ref:`PriorityCeiling`,
249
250* :ref:`PriorityInheritance`,
251
252* :ref:`MrsP`, and
253
254* :ref:`OMIP`
255
256for synchronization objects providing mutual-exclusion (mutex).  The OMIP is
257only available in SMP configurations and replaces the priority inheritance
258protocol in this case.  One aim of the locking protocols is to avoid priority
259inversion.
260
261Since RTEMS 4.12, priority updates due to the locking protocols take place
262immediately and are propagated recursively.  The mutex owner and wait for mutex
263relationships define a directed acyclic graph (DAG).  The run-time of the mutex
264obtain, release and timeout operations depend on the complexity of this
265resource dependency graph.
266
267.. _PriorityInversion:
268
269Priority Inversion
270------------------
271.. index:: priority inversion
272
273Priority inversion is a form of indefinite postponement which is common in
274multitasking, preemptive executives with shared resources.  Priority inversion
275occurs when a high priority tasks requests access to shared resource which is
276currently allocated to a low priority task.  The high priority task must block
277until the low priority task releases the resource.  This problem is exacerbated
278when the low priority task is prevented from executing by one or more medium
279priority tasks.  Because the low priority task is not executing, it cannot
280complete its interaction with the resource and release that resource.  The high
281priority task is effectively prevented from executing by lower priority tasks.
282
283.. _PriorityCeiling:
284
285Immediate Ceiling Priority Protocol (ICPP)
286------------------------------------------
287.. index:: priority ceiling protocol
288.. index:: immediate ceiling priority protocol
289
290Each mutex using the Immediate Ceiling Priority Protocol (ICPP) has a ceiling
291priority.  The priority of the mutex owner is immediately raised to the ceiling
292priority of the mutex.  In case the thread owning the mutex releases the mutex,
293then the normal priority of the thread is restored.  This locking protocol is
294beneficial for schedulability analysis, see also
295:cite:`Burns:2001:RealTimeSystems`.
296
297This protocol avoids the possibility of changing the priority of the mutex
298owner multiple times since the ceiling priority must be set to the one of
299highest priority thread which will ever attempt to acquire that mutex.  This
300requires an overall knowledge of the application as a whole.  The need to
301identify the highest priority thread which will attempt to obtain a particular
302mutex can be a difficult task in a large, complicated system.  Although the
303priority ceiling protocol is more efficient than the priority inheritance
304protocol with respect to the maximum number of thread priority changes which
305may occur while a thread owns a particular mutex, the priority inheritance
306protocol is more forgiving in that it does not require this apriori
307information.
308
309.. _PriorityInheritance:
310
311Priority Inheritance Protocol
312-----------------------------
313.. index:: priority inheritance protocol
314
315The priority of the mutex owner is raised to the highest priority of all
316threads that currently wait for ownership of this mutex :cite:`Sha:1990:PI`.
317Since RTEMS 4.12, priority updates due to the priority inheritance protocol
318take place immediately and are propagated recursively.
319
320.. _MrsP:
321
322Multiprocessor Resource Sharing Protocol (MrsP)
323-----------------------------------------------
324.. index:: Multiprocessor Resource Sharing Protocol (MrsP)
325
326The Multiprocessor Resource Sharing Protocol (MrsP) is a generalization of the
327priority ceiling protocol to clustered scheduling :cite:`Burns:2013:MrsP`.  One
328of the design goals of MrsP is to enable an effective schedulability analysis
329using the sporadic task model.  Each mutex using the MrsP has a ceiling
330priority for each scheduler instance.  The priority of the mutex owner is
331immediately raised to the ceiling priority of the mutex defined for its home
332scheduler instance.  In case the thread owning the mutex releases the mutex,
333then the normal priority of the thread is restored.  Threads that wait for
334mutex ownership are not blocked with respect to the scheduler and instead
335perform a busy wait.  The MrsP uses temporary thread migrations to foreign
336scheduler instances in case of a preemption of the mutex owner.  This locking
337protocol is available since RTEMS 4.11. It was re-implemented in RTEMS 4.12 to
338overcome some shortcomings of the original implementation
339:cite:`Catellani:2015:MrsP`.
340
341.. _OMIP:
342
343O(m) Independence-Preserving Protocol (OMIP)
344----------------------------------------------------
345.. index:: O(m) Independence-Preserving Protocol (OMIP)
346
347The :math:`O(m)` Independence-Preserving Protocol (OMIP) is a generalization of
348the priority inheritance protocol to clustered scheduling which avoids the
349non-preemptive sections present with priority boosting
350:cite:`Brandenburg:2013:OMIP`.  The :math:`m` denotes the number of processors
351in the system.  Similar to the uni-processor priority inheritance protocol, the
352OMIP mutexes do not need any external configuration data, e.g. a ceiling
353priority.  This makes them a good choice for general purpose libraries that
354need internal locking.  The complex part of the implementation is contained in
355the thread queues and shared with the MrsP support.  This locking protocol is
356available since RTEMS 4.12.
357
358Thread Queues
359=============
360.. index:: thread queues
361
362In case more than one :term:`thread` may wait on a synchronization object, e.g.
363a semaphore or a message queue, then the waiting threads are added to a data
364structure called the thread queue.  Thread queues are named task wait queues in
365the Classic API.  There are two thread queuing disciplines available which
366define the order of the threads on a particular thread queue.  Threads can wait
367in FIFO or priority order.
368
369In uni-processor configurations, the priority queuing discipline just orders
370the threads according to their current priority and in FIFO order in case of
371equal priorities.  However, in SMP configurations, the situation is a bit more
372difficult due to the support for clustered scheduling.  It makes no sense to
373compare the priority values of two different scheduler instances.  Thus, it is
374impossible to simply use one plain priority queue for threads of different
375clusters.  Two levels of queues can be used as one way to solve the problem.
376The top-level queue provides FIFO ordering and contains priority queues.  Each
377priority queue is associated with a scheduler instance and contains only
378threads of this scheduler instance.  Threads are enqueued in the priority
379queues corresponding to their scheduler instances.  To dequeue a thread, the
380highest priority thread of the first priority queue is selected.  Once this is
381done, the first priority queue is appended to the top-level FIFO queue.  This
382guarantees fairness with respect to the scheduler instances.
383
384Such a two-level queue needs a considerable amount of memory if fast enqueue
385and dequeue operations are desired.  Providing this storage per thread queue
386would waste a lot of memory in typical applications.  Instead, each thread has
387a queue attached which resides in a dedicated memory space independent of other
388memory used for the thread (this approach was borrowed from FreeBSD).  In case
389a thread needs to block, there are two options
390
391* the object already has a queue, then the thread enqueues itself to this
392  already present queue and the queue of the thread is added to a list of free
393  queues for this object, or
394
395* otherwise, the queue of the thread is given to the object and the thread
396  enqueues itself to this queue.
397
398In case the thread is dequeued, there are two options
399
400* the thread is the last thread in the queue, then it removes this queue
401  from the object and reclaims it for its own purpose, or
402
403* otherwise, the thread removes one queue from the free list of the object
404  and reclaims it for its own purpose.
405
406Since there are usually more objects than threads, this actually reduces the
407memory demands.  In addition the objects only contain a pointer to the queue
408structure.  This helps to hide implementation details.  Inter-cluster priority
409queues are available since RTEMS 4.12.
410
411A doubly-linked list (chain) is used to implement the FIFO queues yielding a
412:math:`O(1)` worst-case time complexity for enqueue and dequeue operations.
413
414A red-black tree is used to implement the priority queues yielding a
415:math:`O(log(n))` worst-case time complexity for enqueue and dequeue operations
416with :math:`n` being the count of threads already on the queue.
417
418Time
419====
420.. index:: time
421
422The development of responsive real-time applications requires an understanding
423of how RTEMS maintains and supports time-related operations.  The basic unit of
424time in RTEMS is known as a `clock tick` or simply `tick`.  The tick interval
425is defined by the application configuration option
426:ref:`CONFIGURE_MICROSECONDS_PER_TICK <CONFIGURE_MICROSECONDS_PER_TICK>`.  The
427tick interval defines the basic resolution of all interval and calendar time
428operations.  Obviously, the directives which use intervals or wall time cannot
429operate without some external mechanism which provides a periodic clock tick.
430This clock tick is provided by the clock driver.  The tick precision and
431stability depends on the clock driver and interrupt latency.  Most clock
432drivers provide a timecounter to measure the time with a higher resolution than
433the tick.
434
435.. index:: rtems_interval
436
437By tracking time in units of ticks, RTEMS is capable of supporting interval
438timing functions such as task delays, timeouts, timeslicing, the delayed
439execution of timer service routines, and the rate monotonic scheduling of
440tasks.  An interval is defined as a number of ticks relative to the current
441time.  For example, when a task delays for an interval of ten ticks, it is
442implied that the task will not execute until ten clock ticks have occurred.
443All intervals are specified using data type :c:type:`rtems_interval`.
444
445A characteristic of interval timing is that the actual interval period may be a
446fraction of a tick less than the interval requested.  This occurs because the
447time at which the delay timer is set up occurs at some time between two clock
448ticks.  Therefore, the first countdown tick occurs in less than the complete
449time interval for a tick.  This can be a problem if the tick resolution is
450large.
451
452The rate monotonic scheduling algorithm is a hard real-time scheduling
453methodology.  This methodology provides rules which allows one to guarantee
454that a set of independent periodic tasks will always meet their deadlines even
455under transient overload conditions.  The rate monotonic manager provides
456directives built upon the Clock Manager's interval timer support routines.
457
458Interval timing is not sufficient for the many applications which require that
459time be kept in wall time or true calendar form.  Consequently, RTEMS maintains
460the current date and time.  This allows selected time operations to be
461scheduled at an actual calendar date and time.  For example, a task could
462request to delay until midnight on New Year's Eve before lowering the ball at
463Times Square.  The data type :c:type:`rtems_time_of_day` is used to specify calendar
464time in RTEMS services.  See :ref:`Time and Date Data Structures`.
465
466.. index:: rtems_time_of_day
467
468Timer and Timeouts
469==================
470
471Timer and timeout services are a standard component of an operating system.
472The use cases fall roughly into two categories:
473
474* Timeouts -- used to detect if some operations need more time than expected.
475  Since the unexpected happens hopefully rarely, timeout timers are usually
476  removed before they expire. The critical operations are insert and removal.
477  For example, they are important for the performance of a network stack.
478
479* Timers -- used to carry out some work in the future. They usually expire
480  and need a high resolution. An example use case is a time driven scheduler,
481  e.g.  rate-monotonic or EDF.
482
483In RTEMS versions prior to 4.12 the timer and timeout support was implemented
484by means of delta chains.  This implementation was unfit for SMP systems due to
485several reasons.  The new implementation present since RTEMS 4.12 uses a
486red-black tree with the expiration time as the key.  This leads to
487:math:`O(log(n))` worst-case insert and removal operations for :math:`n` active
488timer or timeouts.  Each processor provides its own timer and timeout service
489point so that it scales well with the processor count of the system.  For each
490operation it is sufficient to acquire and release a dedicated SMP lock only
491once. The drawback is that a 64-bit integer type is required internally for the
492intervals to avoid a potential overflow of the key values.
493
494An alternative to the red-black tree based implementation would be the use of a
495timer wheel based algorithm :cite:`Varghese:1987:TimerWheel` which is used in
496Linux and FreeBSD :cite:`Varghese:1995:BSDCallout` for example.  A timer wheel
497based algorithm offers :math:`O(1)` worst-case time complexity for insert and
498removal operations.  The drawback is that the run-time of the clock tick
499procedure is unpredictable due to the use of a hash table or cascading.
500
501The red-black tree approach was selected for RTEMS, since it offers a more
502predictable run-time behaviour.  However, this sacrifices the constant insert
503and removal operations offered by the timer wheel algorithms.  See also
504:cite:`Gleixner:2006:Hrtimers`.  The implementation can re-use the red-black
505tree support already used in other areas, e.g. for the thread priority queues.
506Less code is a good thing for size, testing and verification.
507
508Memory Management
509=================
510.. index:: memory management
511
512RTEMS memory management facilities can be grouped into two classes: dynamic
513memory allocation and address translation.  Dynamic memory allocation is
514required by applications whose memory requirements vary through the
515application's course of execution.  Address translation is needed by
516applications which share memory with another CPU or an intelligent Input/Output
517processor.  The following RTEMS managers provide facilities to manage memory:
518
519- Region
520
521- Partition
522
523- Dual Ported Memory
524
525RTEMS memory management features allow an application to create simple memory
526pools of fixed size buffers and/or more complex memory pools of variable size
527segments.  The partition manager provides directives to manage and maintain
528pools of fixed size entities such as resource control blocks.  Alternatively,
529the region manager provides a more general purpose memory allocation scheme
530that supports variable size blocks of memory which are dynamically obtained and
531freed by the application.  The dual-ported memory manager provides executive
532support for address translation between internal and external dual-ported RAM
533address space.
Note: See TracBrowser for help on using the repository browser.