RTEMS
6.1-rc6
Loading...
Searching...
No Matches
cpukit
include
rtems
score
isrlock.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: BSD-2-Clause */
2
12
/*
13
* Copyright (C) 2013, 2024 embedded brains GmbH & Co. KG
14
*
15
* Redistribution and use in source and binary forms, with or without
16
* modification, are permitted provided that the following conditions
17
* are met:
18
* 1. Redistributions of source code must retain the above copyright
19
* notice, this list of conditions and the following disclaimer.
20
* 2. Redistributions in binary form must reproduce the above copyright
21
* notice, this list of conditions and the following disclaimer in the
22
* documentation and/or other materials provided with the distribution.
23
*
24
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
* POSSIBILITY OF SUCH DAMAGE.
35
*/
36
37
#ifndef _RTEMS_SCORE_ISR_LOCK_H
38
#define _RTEMS_SCORE_ISR_LOCK_H
39
40
#include <
rtems/score/isrlevel.h
>
41
#include <
rtems/score/smplock.h
>
42
43
#ifdef __cplusplus
44
extern
"C"
{
45
#endif
46
76
#if defined( RTEMS_SMP )
77
#define ISR_LOCK_NEEDS_OBJECT 1
78
#else
79
#define ISR_LOCK_NEEDS_OBJECT 0
80
#endif
81
82
#if ISR_LOCK_NEEDS_OBJECT
86
typedef
struct
{
87
SMP_lock_Control Lock;
88
} ISR_lock_Control;
89
#endif
90
94
typedef
struct
{
95
#if defined( RTEMS_SMP )
96
SMP_lock_Context Lock_context;
97
#else
98
ISR_Level
isr_level;
99
#endif
100
#if defined( RTEMS_PROFILING )
104
CPU_Counter_ticks ISR_disable_instant;
105
#endif
106
}
ISR_lock_Context
;
107
108
#if ISR_LOCK_NEEDS_OBJECT
115
#define ISR_LOCK_INITIALIZER( _name ) { SMP_LOCK_INITIALIZER( _name ) }
116
#endif
117
124
static
inline
void
_ISR_lock_Context_set_level(
125
ISR_lock_Context
*
context
,
126
ISR_Level
level
127
)
128
{
129
#if defined( RTEMS_SMP )
130
context
->Lock_context.isr_level = level;
131
#else
132
context
->isr_level = level;
133
#endif
134
}
135
146
#if defined( RTEMS_SMP )
147
#define _ISR_lock_Initialize( _lock, _name ) \
148
_SMP_lock_Initialize( &( _lock )->Lock, _name )
149
#else
150
#define _ISR_lock_Initialize( _lock, _name ) \
151
do { (void) _name; } while (0)
152
#endif
153
161
#if defined( RTEMS_SMP )
162
#define _ISR_lock_Destroy( _lock ) \
163
_SMP_lock_Destroy( &( _lock )->Lock )
164
#else
165
#define _ISR_lock_Destroy( _lock )
166
#endif
167
176
#if defined( RTEMS_SMP )
177
#define _ISR_lock_Set_name( _lock, _name ) \
178
_SMP_lock_Set_name( &( _lock )->Lock, _name )
179
#else
180
#define _ISR_lock_Set_name( _lock, _name )
181
#endif
182
197
#if defined( RTEMS_SMP )
198
#define _ISR_lock_ISR_disable_and_acquire( _lock, _context ) \
199
_SMP_lock_ISR_disable_and_acquire( \
200
&( _lock )->Lock, \
201
&( _context )->Lock_context \
202
)
203
#else
204
#define _ISR_lock_ISR_disable_and_acquire( _lock, _context ) \
205
_ISR_Local_disable( ( _context )->isr_level )
206
#endif
207
222
#if defined( RTEMS_SMP )
223
#define _ISR_lock_Release_and_ISR_enable( _lock, _context ) \
224
_SMP_lock_Release_and_ISR_enable( \
225
&( _lock )->Lock, \
226
&( _context )->Lock_context \
227
)
228
#else
229
#define _ISR_lock_Release_and_ISR_enable( _lock, _context ) \
230
_ISR_Local_enable( ( _context )->isr_level )
231
#endif
232
249
#if defined( RTEMS_SMP )
250
#define _ISR_lock_Acquire( _lock, _context ) \
251
do { \
252
_Assert( _ISR_Get_level() != 0 ); \
253
_SMP_lock_Acquire( \
254
&( _lock )->Lock, \
255
&( _context )->Lock_context \
256
); \
257
} while ( 0 )
258
#else
259
#define _ISR_lock_Acquire( _lock, _context ) \
260
do { (void) _context; } while ( 0 )
261
#endif
262
275
#if defined( RTEMS_SMP )
276
#define _ISR_lock_Release( _lock, _context ) \
277
_SMP_lock_Release( \
278
&( _lock )->Lock, \
279
&( _context )->Lock_context \
280
)
281
#else
282
#define _ISR_lock_Release( _lock, _context ) \
283
do { (void) _context; } while ( 0 )
284
#endif
285
291
#if defined( RTEMS_SMP )
292
#define _ISR_lock_Acquire_inline( _lock, _context ) \
293
do { \
294
_Assert( _ISR_Get_level() != 0 ); \
295
_SMP_lock_Acquire_inline( \
296
&( _lock )->Lock, \
297
&( _context )->Lock_context \
298
); \
299
} while ( 0 )
300
#else
301
#define _ISR_lock_Acquire_inline( _lock, _context ) \
302
do { (void) _context; } while ( 0 )
303
#endif
304
310
#if defined( RTEMS_SMP )
311
#define _ISR_lock_Release_inline( _lock, _context ) \
312
_SMP_lock_Release_inline( \
313
&( _lock )->Lock, \
314
&( _context )->Lock_context \
315
)
316
#else
317
#define _ISR_lock_Release_inline( _lock, _context ) \
318
do { (void) _context; } while ( 0 )
319
#endif
320
321
#if defined( RTEMS_DEBUG )
331
#if defined( RTEMS_SMP )
332
#define _ISR_lock_Is_owner( _lock ) \
333
_SMP_lock_Is_owner( &( _lock )->Lock )
334
#else
335
#define _ISR_lock_Is_owner( _lock ) \
336
( _ISR_Get_level() != 0 )
337
#endif
338
#endif
339
340
#if defined( RTEMS_PROFILING )
341
#define _ISR_lock_ISR_disable_profile( _context ) \
342
( _context )->ISR_disable_instant = _CPU_Counter_read();
343
#else
344
#define _ISR_lock_ISR_disable_profile( _context )
345
#endif
346
357
#if defined( RTEMS_SMP )
358
#define _ISR_lock_ISR_disable( _context ) \
359
do { \
360
_ISR_Local_disable( ( _context )->Lock_context.isr_level ); \
361
_ISR_lock_ISR_disable_profile( _context ) \
362
} while ( 0 )
363
#else
364
#define _ISR_lock_ISR_disable( _context ) \
365
do { \
366
_ISR_Local_disable( ( _context )->isr_level ); \
367
_ISR_lock_ISR_disable_profile( _context ) \
368
} while ( 0 )
369
#endif
370
381
#if defined( RTEMS_SMP )
382
#define _ISR_lock_ISR_enable( _context ) \
383
_ISR_Local_enable( ( _context )->Lock_context.isr_level )
384
#else
385
#define _ISR_lock_ISR_enable( _context ) \
386
_ISR_Local_enable( ( _context )->isr_level )
387
#endif
388
391
#ifdef __cplusplus
392
}
393
#endif
394
395
#endif
/* _RTEMS_SCORE_ISR_LOCK_H */
ISR_Level
uint32_t ISR_Level
Definition:
isrlevel.h:60
isrlevel.h
This header file provides the ISR_Level related interfaces of the ISR Handler.
context
rtems_termios_device_context * context
Definition:
console-config.c:62
smplock.h
This header file provides the main interfaces of the SMP Locks.
ISR_lock_Context
Local ISR lock context for acquire and release pairs.
Definition:
isrlock.h:94
Generated by
1.9.6