RTEMS 5.2
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
isrlock.h
Go to the documentation of this file.
1
9/*
10 * Copyright (c) 2013, 2019 embedded brains GmbH. All rights reserved.
11 *
12 * embedded brains GmbH
13 * Dornierstr. 4
14 * 82178 Puchheim
15 * Germany
16 * <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#ifndef _RTEMS_SCORE_ISR_LOCK_H
24#define _RTEMS_SCORE_ISR_LOCK_H
25
27#include <rtems/score/smplock.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
56typedef struct {
57#if defined( RTEMS_SMP )
58 SMP_lock_Control Lock;
59#endif
61
65typedef struct {
66#if defined( RTEMS_SMP )
67 SMP_lock_Context Lock_context;
68#else
69 ISR_Level isr_level;
70#endif
71#if defined( RTEMS_PROFILING )
75 CPU_Counter_ticks ISR_disable_instant;
76#endif
78
86#if defined( RTEMS_SMP )
87 #define ISR_LOCK_MEMBER( _designator ) ISR_lock_Control _designator;
88#else
89 #define ISR_LOCK_MEMBER( _designator )
90#endif
91
100#if defined( RTEMS_SMP )
101 #define ISR_LOCK_DECLARE( _qualifier, _designator ) \
102 _qualifier ISR_lock_Control _designator;
103#else
104 #define ISR_LOCK_DECLARE( _qualifier, _designator )
105#endif
106
117#if defined( RTEMS_SMP )
118 #define ISR_LOCK_DEFINE( _qualifier, _designator, _name ) \
119 _qualifier ISR_lock_Control _designator = { SMP_LOCK_INITIALIZER( _name ) };
120#else
121 #define ISR_LOCK_DEFINE( _qualifier, _designator, _name )
122#endif
123
132#if defined( RTEMS_SMP )
133 #define ISR_LOCK_REFERENCE( _designator, _target ) \
134 ISR_lock_Control *_designator = _target;
135#else
136 #define ISR_LOCK_REFERENCE( _designator, _target )
137#endif
138
145#if defined( RTEMS_SMP )
146 #define ISR_LOCK_INITIALIZER( _name ) \
147 { SMP_LOCK_INITIALIZER( _name ) }
148#else
149 #define ISR_LOCK_INITIALIZER( _name ) \
150 { }
151#endif
152
161 ISR_Level level
162)
163{
164#if defined( RTEMS_SMP )
165 context->Lock_context.isr_level = level;
166#else
167 context->isr_level = level;
168#endif
169}
170
181#if defined( RTEMS_SMP )
182 #define _ISR_lock_Initialize( _lock, _name ) \
183 _SMP_lock_Initialize( &( _lock )->Lock, _name )
184#else
185 #define _ISR_lock_Initialize( _lock, _name )
186#endif
187
195#if defined( RTEMS_SMP )
196 #define _ISR_lock_Destroy( _lock ) \
197 _SMP_lock_Destroy( &( _lock )->Lock )
198#else
199 #define _ISR_lock_Destroy( _lock )
200#endif
201
210#if defined( RTEMS_SMP )
211 #define _ISR_lock_Set_name( _lock, _name ) \
212 _SMP_lock_Set_name( &( _lock )->Lock, _name )
213#else
214 #define _ISR_lock_Set_name( _lock, _name )
215#endif
216
231#if defined( RTEMS_SMP )
232 #define _ISR_lock_ISR_disable_and_acquire( _lock, _context ) \
233 _SMP_lock_ISR_disable_and_acquire( \
234 &( _lock )->Lock, \
235 &( _context )->Lock_context \
236 )
237#else
238 #define _ISR_lock_ISR_disable_and_acquire( _lock, _context ) \
239 _ISR_Local_disable( ( _context )->isr_level )
240#endif
241
256#if defined( RTEMS_SMP )
257 #define _ISR_lock_Release_and_ISR_enable( _lock, _context ) \
258 _SMP_lock_Release_and_ISR_enable( \
259 &( _lock )->Lock, \
260 &( _context )->Lock_context \
261 )
262#else
263 #define _ISR_lock_Release_and_ISR_enable( _lock, _context ) \
264 _ISR_Local_enable( ( _context )->isr_level )
265#endif
266
283#if defined( RTEMS_SMP )
284 #define _ISR_lock_Acquire( _lock, _context ) \
285 do { \
286 _Assert( _ISR_Get_level() != 0 ); \
287 _SMP_lock_Acquire( \
288 &( _lock )->Lock, \
289 &( _context )->Lock_context \
290 ); \
291 } while ( 0 )
292#else
293 #define _ISR_lock_Acquire( _lock, _context ) \
294 do { (void) _context; } while ( 0 )
295#endif
296
309#if defined( RTEMS_SMP )
310 #define _ISR_lock_Release( _lock, _context ) \
311 _SMP_lock_Release( \
312 &( _lock )->Lock, \
313 &( _context )->Lock_context \
314 )
315#else
316 #define _ISR_lock_Release( _lock, _context ) \
317 do { (void) _context; } while ( 0 )
318#endif
319
325#if defined( RTEMS_SMP )
326 #define _ISR_lock_Acquire_inline( _lock, _context ) \
327 do { \
328 _Assert( _ISR_Get_level() != 0 ); \
329 _SMP_lock_Acquire_inline( \
330 &( _lock )->Lock, \
331 &( _context )->Lock_context \
332 ); \
333 } while ( 0 )
334#else
335 #define _ISR_lock_Acquire_inline( _lock, _context ) \
336 do { (void) _context; } while ( 0 )
337#endif
338
344#if defined( RTEMS_SMP )
345 #define _ISR_lock_Release_inline( _lock, _context ) \
346 _SMP_lock_Release_inline( \
347 &( _lock )->Lock, \
348 &( _context )->Lock_context \
349 )
350#else
351 #define _ISR_lock_Release_inline( _lock, _context ) \
352 do { (void) _context; } while ( 0 )
353#endif
354
355#if defined( RTEMS_DEBUG )
365 #if defined( RTEMS_SMP )
366 #define _ISR_lock_Is_owner( _lock ) \
367 _SMP_lock_Is_owner( &( _lock )->Lock )
368 #else
369 #define _ISR_lock_Is_owner( _lock ) \
370 ( _ISR_Get_level() != 0 )
371 #endif
372#endif
373
374#if defined( RTEMS_PROFILING )
375 #define _ISR_lock_ISR_disable_profile( _context ) \
376 ( _context )->ISR_disable_instant = _CPU_Counter_read();
377#else
378 #define _ISR_lock_ISR_disable_profile( _context )
379#endif
380
391#if defined( RTEMS_SMP )
392 #define _ISR_lock_ISR_disable( _context ) \
393 do { \
394 _ISR_Local_disable( ( _context )->Lock_context.isr_level ); \
395 _ISR_lock_ISR_disable_profile( _context ) \
396 } while ( 0 )
397#else
398 #define _ISR_lock_ISR_disable( _context ) \
399 do { \
400 _ISR_Local_disable( ( _context )->isr_level ); \
401 _ISR_lock_ISR_disable_profile( _context ) \
402 } while ( 0 )
403#endif
404
415#if defined( RTEMS_SMP )
416 #define _ISR_lock_ISR_enable( _context ) \
417 _ISR_Local_enable( ( _context )->Lock_context.isr_level )
418#else
419 #define _ISR_lock_ISR_enable( _context ) \
420 _ISR_Local_enable( ( _context )->isr_level )
421#endif
422
425#ifdef __cplusplus
426}
427#endif
428
429#endif /* _RTEMS_SCORE_ISR_LOCK_H */
#define RTEMS_INLINE_ROUTINE
Definition: basedefs.h:66
RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(ISR_lock_Context *context, ISR_Level level)
Sets the ISR level in the ISR lock context.
Definition: isrlock.h:159
uint32_t ISR_Level
Definition: isrlevel.h:41
ISR Level Type.
SMP Lock API.
Local ISR lock context for acquire and release pairs.
Definition: isrlock.h:65
ISR lock control.
Definition: isrlock.h:56
unsigned context
Definition: tlb.h:1