source: rtems/cpukit/include/rtems/score/object.h @ 52c7cb1

5
Last change on this file since 52c7cb1 was 59e7209f, checked in by Sebastian Huber <sebastian.huber@…>, on 11/16/18 at 06:06:12

score: Remove support for RTEMS_USE_16_BIT_OBJECT

The RTEMS_USE_16_BIT_OBJECT define is not set by an RTEMS port. Remove
support for 16-bit object identifiers. If someone really wants to use
RTEMS on a 16-bit target, then it is better to use self-contained
objects instead of playing around with object identifier optimizations.

Update #3603.

  • Property mode set to 100644
File size: 9.0 KB
Line 
1/**
2 * @file  rtems/score/object.h
3 *
4 * @brief Constants and Structures Associated with the Object Handler
5 *
6 * This include file contains all the constants and structures associated
7 * with the Object Handler.  This Handler provides mechanisms which
8 * can be used to initialize and manipulate all objects which have ids.
9 */
10
11/*
12 *  COPYRIGHT (c) 1989-2011.
13 *  On-Line Applications Research Corporation (OAR).
14 *
15 *  The license and distribution terms for this file may be
16 *  found in the file LICENSE in this distribution or at
17 *  http://www.rtems.org/license/LICENSE.
18 */
19
20#ifndef _RTEMS_SCORE_OBJECT_H
21#define _RTEMS_SCORE_OBJECT_H
22
23#include <rtems/score/basedefs.h>
24#include <rtems/score/cpu.h>
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/**
31 * @defgroup Score SuperCore
32 *
33 * @brief Provides services for all APIs.
34 */
35/**@{*/
36
37/**
38 * @defgroup ScoreCPU CPU Architecture Support
39 *
40 * @ingroup Score
41 *
42 * @brief Provides CPU architecture dependent services.
43 */
44/**@{*/
45
46/**
47 *  @defgroup ScoreObject Object Handler
48 *
49 *  @ingroup Score
50 */
51/**@{*/
52
53/**
54 *  The following type defines the control block used to manage
55 *  object names.
56 */
57typedef union {
58  /** This is a pointer to a string name. */
59  const char *name_p;
60  /** This is the actual 32-bit "raw" integer name. */
61  uint32_t    name_u32;
62} Objects_Name;
63
64/**
65 *  The following type defines the control block used to manage
66 *  object IDs.  The format is as follows (0=LSB):
67 *
68 *     Bits  0 .. 15    = index  (up to 65535 objects of a type)
69 *     Bits 16 .. 23    = node   (up to 255 nodes)
70 *     Bits 24 .. 26    = API    (up to 7 API classes)
71 *     Bits 27 .. 31    = class  (up to 31 object types per API)
72 */
73typedef uint32_t   Objects_Id;
74
75/**
76 * This type is used to store the maximum number of allowed objects
77 * of each type.
78 */
79typedef uint16_t   Objects_Maximum;
80
81/**
82 *  This is the bit position of the starting bit of the index portion of
83 *  the object Id.
84 */
85#define OBJECTS_INDEX_START_BIT  0U
86/**
87 *  This is the bit position of the starting bit of the node portion of
88 *  the object Id.
89 */
90#define OBJECTS_NODE_START_BIT  16U
91
92/**
93 *  This is the bit position of the starting bit of the API portion of
94 *  the object Id.
95 */
96#define OBJECTS_API_START_BIT   24U
97
98/**
99 *  This is the bit position of the starting bit of the class portion of
100 *  the object Id.
101 */
102#define OBJECTS_CLASS_START_BIT 27U
103
104/**
105 *  This mask is used to extract the index portion of an object Id.
106 */
107#define OBJECTS_INDEX_MASK      (Objects_Id)0x0000ffffU
108
109/**
110 *  This mask is used to extract the node portion of an object Id.
111 */
112#define OBJECTS_NODE_MASK       (Objects_Id)0x00ff0000U
113
114/**
115 *  This mask is used to extract the API portion of an object Id.
116 */
117#define OBJECTS_API_MASK        (Objects_Id)0x07000000U
118
119/**
120 *  This mask is used to extract the class portion of an object Id.
121 */
122#define OBJECTS_CLASS_MASK      (Objects_Id)0xf8000000U
123
124/**
125 *  This mask represents the bits that is used to ensure no extra bits
126 *  are set after shifting to extract the index portion of an object Id.
127 */
128#define OBJECTS_INDEX_VALID_BITS  (Objects_Id)0x0000ffffU
129
130/**
131 *  This mask represents the bits that is used to ensure no extra bits
132 *  are set after shifting to extract the node portion of an object Id.
133 */
134#define OBJECTS_NODE_VALID_BITS   (Objects_Id)0x000000ffU
135
136/**
137 *  This mask represents the bits that is used to ensure no extra bits
138 *  are set after shifting to extract the API portion of an object Id.
139 */
140#define OBJECTS_API_VALID_BITS    (Objects_Id)0x00000007U
141
142/**
143 *  This mask represents the bits that is used to ensure no extra bits
144 *  are set after shifting to extract the class portion of an object Id.
145 */
146#define OBJECTS_CLASS_VALID_BITS  (Objects_Id)0x0000001fU
147
148/**
149 *  Mask to enable unlimited objects.  This is used in the configuration
150 *  table when specifying the number of configured objects.
151 */
152#define OBJECTS_UNLIMITED_OBJECTS 0x80000000U
153
154/**
155 *  This is the lowest value for the index portion of an object Id.
156 */
157#define OBJECTS_ID_INITIAL_INDEX  (0)
158
159/**
160 *  This is the highest value for the index portion of an object Id.
161 */
162#define OBJECTS_ID_FINAL_INDEX    (0xffffU)
163
164/**
165 *  This enumerated type is used in the class field of the object ID.
166 */
167typedef enum {
168  OBJECTS_NO_API       = 0,
169  OBJECTS_INTERNAL_API = 1,
170  OBJECTS_CLASSIC_API  = 2,
171  OBJECTS_POSIX_API    = 3,
172  OBJECTS_FAKE_OBJECTS_API = 7
173} Objects_APIs;
174
175/** This macro is used to generically specify the last API index. */
176#define OBJECTS_APIS_LAST OBJECTS_POSIX_API
177
178/**
179 *  No object can have this ID.
180 */
181#define OBJECTS_ID_NONE 0
182
183/**
184 *  The following defines the constant which may be used
185 *  to manipulate the calling task.
186 */
187#define OBJECTS_ID_OF_SELF ((Objects_Id) 0)
188
189/**
190 *  The following constant is used to specify that a name to ID search
191 *  should search through all nodes.
192 */
193#define OBJECTS_SEARCH_ALL_NODES   0
194
195/**
196 *  The following constant is used to specify that a name to ID search
197 *  should search through all nodes except the current node.
198 */
199#define OBJECTS_SEARCH_OTHER_NODES 0x7FFFFFFE
200
201/**
202 *  The following constant is used to specify that a name to ID search
203 *  should search only on this node.
204 */
205#define OBJECTS_SEARCH_LOCAL_NODE  0x7FFFFFFF
206
207/**
208 *  The following constant is used to specify that a name to ID search
209 *  is being asked for the ID of the currently executing task.
210 */
211#define OBJECTS_WHO_AM_I           0
212
213/**
214 *  This macros calculates the lowest ID for the specified api, class,
215 *  and node.
216 */
217#define OBJECTS_ID_INITIAL(_api, _class, _node) \
218  _Objects_Build_id( (_api), (_class), (_node), OBJECTS_ID_INITIAL_INDEX )
219
220/**
221 *  This macro specifies the highest object ID value
222 */
223#define OBJECTS_ID_FINAL           ((Objects_Id)~0)
224
225/**
226 *  This macro is used to build a thirty-two bit style name from
227 *  four characters.  The most significant byte will be the
228 *  character @a _C1.
229 *
230 *  @param[in] _C1 is the first character of the name
231 *  @param[in] _C2 is the second character of the name
232 *  @param[in] _C3 is the third character of the name
233 *  @param[in] _C4 is the fourth character of the name
234 */
235#define  _Objects_Build_name( _C1, _C2, _C3, _C4 ) \
236  ( (uint32_t)(_C1) << 24 | \
237    (uint32_t)(_C2) << 16 | \
238    (uint32_t)(_C3) << 8 | \
239    (uint32_t)(_C4) )
240
241/**
242 * This function returns the API portion of the ID.
243 *
244 * @param[in] id is the object Id to be processed.
245 *
246 * @return This method returns an object Id constructed from the arguments.
247 */
248RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
249  Objects_Id id
250)
251{
252  return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
253}
254
255/**
256 * This function returns the class portion of the ID.
257 *
258 * @param[in] id is the object Id to be processed
259 */
260RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
261  Objects_Id id
262)
263{
264  return (uint32_t)
265    ((id >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS);
266}
267
268/**
269 * This function returns the node portion of the ID.
270 *
271 * @param[in] id is the object Id to be processed
272 *
273 * @return This method returns the node portion of an object ID.
274 */
275RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_node(
276  Objects_Id id
277)
278{
279  return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS;
280}
281
282/**
283 * This function returns the index portion of the ID.
284 *
285 * @param[in] id is the Id to be processed
286 *
287 * @return This method returns the class portion of the specified object ID.
288 */
289RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Get_index(
290  Objects_Id id
291)
292{
293  return
294    (Objects_Maximum)((id >> OBJECTS_INDEX_START_BIT) &
295                                          OBJECTS_INDEX_VALID_BITS);
296}
297
298/**
299 * This function builds an object's id from the processor node and index
300 * values specified.
301 *
302 * @param[in] the_api indicates the API associated with this Id.
303 * @param[in] the_class indicates the class of object.
304 *            It is specific to @a the_api.
305 * @param[in] node is the node where this object resides.
306 * @param[in] index is the instance number of this object.
307 *
308 * @return This method returns an object Id constructed from the arguments.
309 */
310RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id(
311  Objects_APIs     the_api,
312  uint16_t         the_class,
313  uint8_t          node,
314  uint16_t         index
315)
316{
317  return (( (Objects_Id) the_api )   << OBJECTS_API_START_BIT)   |
318         (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
319         (( (Objects_Id) node )      << OBJECTS_NODE_START_BIT)  |
320         (( (Objects_Id) index )     << OBJECTS_INDEX_START_BIT);
321}
322
323/**
324 * Returns if the object maximum specifies unlimited objects.
325 *
326 * @param[in] maximum The object maximum specification.
327 *
328 * @retval true Unlimited objects are available.
329 * @retval false The object count is fixed.
330 */
331RTEMS_INLINE_ROUTINE bool _Objects_Is_unlimited( uint32_t maximum )
332{
333  return (maximum & OBJECTS_UNLIMITED_OBJECTS) != 0;
334}
335
336/*
337 * We cannot use an inline function for this since it may be evaluated at
338 * compile time.
339 */
340#define _Objects_Maximum_per_allocation( maximum ) \
341  ((Objects_Maximum) ((maximum) & ~OBJECTS_UNLIMITED_OBJECTS))
342
343/**@}*/
344/**@}*/
345/**@}*/
346
347#ifdef __cplusplus
348}
349#endif
350
351#endif
352/* end of include file */
Note: See TracBrowser for help on using the repository browser.