source: rtems-docs/c-user/key_concepts.rst @ 92745a4

5
Last change on this file since 92745a4 was 92745a4, checked in by Sebastian Huber <sebastian.huber@…>, on 11/16/18 at 06:14:37

c-user: Remove 16-bit object identifiers

Close #3603.

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