[PATCH 1/4] Minor conditionals to enable building Scheduler Simulator on GNU/Linux
Joel Sherrill
joel.sherrill at oarcorp.com
Tue May 27 22:16:28 UTC 2014
- rtems/score/threadimpl.h: _Thread_Start_multitasking does return
on Scheduler Simulator. Initializing RTEMS returns to the command
interpreter.
- rtems/score/smpimpl.h: _SMP_Start_multitasking_on_secondary_processor()
is not applicable on the Scheduler Simulator and the no return attribute
gives a warning.
- rtems/score/assert.h: Scheduler Simulator uses glibc assert.h on GNU/Linux.
This will likely need to be adjusted more for other host compilers and
C libraries
- threadrestart.c: Disable assert on Scheduler Simulator. Restarting self
returns to the command interpreter.
---
cpukit/score/include/rtems/score/assert.h | 20 ++++++++++++++++----
cpukit/score/include/rtems/score/smpimpl.h | 9 ++++++++-
cpukit/score/include/rtems/score/threadimpl.h | 7 +++++++
cpukit/score/src/threadrestart.c | 9 ++++++++-
4 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/cpukit/score/include/rtems/score/assert.h b/cpukit/score/include/rtems/score/assert.h
index 41ef1ae..d1971d2 100644
--- a/cpukit/score/include/rtems/score/assert.h
+++ b/cpukit/score/include/rtems/score/assert.h
@@ -28,12 +28,24 @@ extern "C" {
/**
* @brief Assertion similar to assert() controlled via RTEMS_DEBUG instead of
* NDEBUG.
+ *
+ * __ASSERT_FUNC is newlib. __ASSERT_FUNCTION is glibc.
*/
#if defined( RTEMS_DEBUG )
- #define _Assert( _e ) \
- ( ( _e ) ? \
- ( void ) 0 : \
- __assert_func( __FILE__, __LINE__, __ASSERT_FUNC, #_e ) )
+ #if defined(__ASSERT_FUNC)
+ #define _Assert( _e ) \
+ ( ( _e ) ? \
+ ( void ) 0 : \
+ __assert_func( __FILE__, __LINE__, __ASSERT_FUNC, #_e ) )
+ #elif defined(__ASSERT_FUNCTION)
+ #define _Assert( _e ) \
+ ( ( _e ) ? \
+ ( void ) 0 : \
+ __assert_fail( #_e, __FILE__, __LINE__, __ASSERT_FUNCTION ) )
+ #else
+ #error "What does assert.h use?"
+ #endif
+
#else
#define _Assert( _e ) ( ( void ) 0 )
#endif
diff --git a/cpukit/score/include/rtems/score/smpimpl.h b/cpukit/score/include/rtems/score/smpimpl.h
index 70475ba..1ed4a4f 100644
--- a/cpukit/score/include/rtems/score/smpimpl.h
+++ b/cpukit/score/include/rtems/score/smpimpl.h
@@ -105,10 +105,17 @@ static inline void _SMP_Fatal( SMP_Fatal_code code )
* This function must not be called by the main processor. The main processor
* uses _Thread_Start_multitasking() instead.
*
- * This function does not return to the caller.
+ * In a "real system", this function does not return to the caller.
+ * But on the Scheduler Simulator, this method actually returns since
+ * there are no context switches in that environment.
*/
+#ifdef RTEMS_SCHEDSIM
+void _SMP_Start_multitasking_on_secondary_processor( void );
+#else
void _SMP_Start_multitasking_on_secondary_processor( void )
RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
+#endif
+
typedef void ( *SMP_Test_message_handler )( Per_CPU_Control *cpu_self );
diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h
index 2be5cc5..35257df 100644
--- a/cpukit/score/include/rtems/score/threadimpl.h
+++ b/cpukit/score/include/rtems/score/threadimpl.h
@@ -97,8 +97,15 @@ void _Thread_Create_idle(void);
* This routine initiates multitasking. It is invoked only as
* part of initialization and its invocation is the last act of
* the non-multitasking part of the system initialization.
+ *
+ * @note On the Scheduler Simulator, this method actually returns.
+ * There are no true context switches in that environment.
*/
+#ifdef RTEMS_SCHEDSIM
+void _Thread_Start_multitasking( void );
+#else
void _Thread_Start_multitasking( void ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
+#endif
/**
* @brief Allocate the requested stack space for the thread.
diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c
index 5c527d8..7c1f77e 100644
--- a/cpukit/score/src/threadrestart.c
+++ b/cpukit/score/src/threadrestart.c
@@ -189,7 +189,14 @@ void _Thread_Life_action_handler(
_Thread_Enable_dispatch();
- _Assert_Not_reached();
+ /*
+ * On the Scheduler Simulator, there are real context switches -- only
+ * the bookkeeping. So the "thread of execution" really does return here.
+ * We need to return to the invoking environment.
+ */
+ #ifndef RTEMS_SCHEDSIM
+ _Assert_Not_reached();
+ #endif
} else {
_Assert( _Thread_Is_life_restarting( previous_life_state ) );
--
1.7.1
More information about the devel
mailing list