forked from Imagelibrary/rtems
score: Improve debug support for ISR locks
Ensure that interrupts are disabled while acquiring an ISR lock.
This commit is contained in:
@@ -342,8 +342,16 @@ typedef ISR_lock_Context rtems_interrupt_lock_context;
|
||||
*
|
||||
* @see rtems_interrupt_lock_release_isr().
|
||||
*/
|
||||
#define rtems_interrupt_lock_acquire_isr( _lock, _lock_context ) \
|
||||
_ISR_lock_Acquire( _lock, _lock_context )
|
||||
#if defined(RTEMS_SMP)
|
||||
#define rtems_interrupt_lock_acquire_isr( _lock, _lock_context ) \
|
||||
_SMP_lock_Acquire( \
|
||||
&( _lock )->Lock, \
|
||||
&( _lock_context )->Lock_context \
|
||||
)
|
||||
#else
|
||||
#define rtems_interrupt_lock_acquire_isr( _lock, _lock_context ) \
|
||||
do { (void) _lock_context; } while ( 0 )
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Releases an interrupt lock in the corresponding interrupt service
|
||||
@@ -358,8 +366,16 @@ typedef ISR_lock_Context rtems_interrupt_lock_context;
|
||||
*
|
||||
* @see rtems_interrupt_lock_acquire_isr().
|
||||
*/
|
||||
#define rtems_interrupt_lock_release_isr( _lock, _lock_context ) \
|
||||
_ISR_lock_Release( _lock, _lock_context )
|
||||
#if defined(RTEMS_SMP)
|
||||
#define rtems_interrupt_lock_release_isr( _lock, _lock_context ) \
|
||||
_SMP_lock_Release( \
|
||||
&( _lock )->Lock, \
|
||||
&( _lock_context )->Lock_context \
|
||||
)
|
||||
#else
|
||||
#define rtems_interrupt_lock_release_isr( _lock, _lock_context ) \
|
||||
do { (void) _lock_context; } while ( 0 )
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved.
|
||||
* Copyright (c) 2013, 2019 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
@@ -267,13 +267,16 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
|
||||
*/
|
||||
#if defined( RTEMS_SMP )
|
||||
#define _ISR_lock_Acquire( _lock, _context ) \
|
||||
_SMP_lock_Acquire( \
|
||||
&( _lock )->Lock, \
|
||||
&( _context )->Lock_context \
|
||||
)
|
||||
do { \
|
||||
_Assert( _ISR_Get_level() != 0 ); \
|
||||
_SMP_lock_Acquire( \
|
||||
&( _lock )->Lock, \
|
||||
&( _context )->Lock_context \
|
||||
); \
|
||||
} while ( 0 )
|
||||
#else
|
||||
#define _ISR_lock_Acquire( _lock, _context ) \
|
||||
(void) _context;
|
||||
do { (void) _context; } while ( 0 )
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -296,7 +299,7 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
|
||||
)
|
||||
#else
|
||||
#define _ISR_lock_Release( _lock, _context ) \
|
||||
(void) _context;
|
||||
do { (void) _context; } while ( 0 )
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -306,13 +309,16 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
|
||||
*/
|
||||
#if defined( RTEMS_SMP )
|
||||
#define _ISR_lock_Acquire_inline( _lock, _context ) \
|
||||
_SMP_lock_Acquire_inline( \
|
||||
&( _lock )->Lock, \
|
||||
&( _context )->Lock_context \
|
||||
)
|
||||
do { \
|
||||
_Assert( _ISR_Get_level() != 0 ); \
|
||||
_SMP_lock_Acquire_inline( \
|
||||
&( _lock )->Lock, \
|
||||
&( _context )->Lock_context \
|
||||
); \
|
||||
} while ( 0 )
|
||||
#else
|
||||
#define _ISR_lock_Acquire_inline( _lock, _context ) \
|
||||
(void) _context;
|
||||
do { (void) _context; } while ( 0 )
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -328,7 +334,7 @@ RTEMS_INLINE_ROUTINE void _ISR_lock_Context_set_level(
|
||||
)
|
||||
#else
|
||||
#define _ISR_lock_Release_inline( _lock, _context ) \
|
||||
(void) _context;
|
||||
do { (void) _context; } while ( 0 )
|
||||
#endif
|
||||
|
||||
#if defined( RTEMS_DEBUG )
|
||||
|
||||
@@ -178,6 +178,7 @@ static void test_isr_locks( void )
|
||||
ISR_lock_Context lock_context;
|
||||
size_t i;
|
||||
const uint8_t *initialized_bytes;
|
||||
ISR_Level interrupt_level;
|
||||
|
||||
memset( &container, 0xff, sizeof( container ) );
|
||||
_ISR_lock_Initialize( &container.lock, "test" );
|
||||
@@ -203,9 +204,20 @@ static void test_isr_locks( void )
|
||||
|
||||
rtems_test_assert( normal_interrupt_level == _ISR_Get_level() );
|
||||
|
||||
#if defined(RTEMS_DEBUG)
|
||||
_ISR_lock_ISR_disable( &lock_context );
|
||||
#endif
|
||||
interrupt_level = _ISR_Get_level();
|
||||
_ISR_lock_Acquire( &container.lock, &lock_context );
|
||||
rtems_test_assert( interrupt_level == _ISR_Get_level() );
|
||||
#if !defined(RTEMS_DEBUG)
|
||||
rtems_test_assert( normal_interrupt_level == _ISR_Get_level() );
|
||||
#endif
|
||||
_ISR_lock_Release( &container.lock, &lock_context );
|
||||
rtems_test_assert( interrupt_level == _ISR_Get_level() );
|
||||
#if defined(RTEMS_DEBUG)
|
||||
_ISR_lock_ISR_enable( &lock_context );
|
||||
#endif
|
||||
|
||||
rtems_test_assert( normal_interrupt_level == _ISR_Get_level() );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user