[rtems commit] smptests/smpsignal01: Check signal ISR level

Sebastian Huber sebh at rtems.org
Tue Jan 24 08:44:57 UTC 2017


Module:    rtems
Branch:    master
Commit:    436a4b384b70b4b050d5c5967c169a2b79f90042
Changeset: http://git.rtems.org/rtems/commit/?id=436a4b384b70b4b050d5c5967c169a2b79f90042

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jan 24 09:43:20 2017 +0100

smptests/smpsignal01: Check signal ISR level

Close #2751.

---

 testsuites/smptests/smpsignal01/init.c          | 74 ++++++++++++++++++++++---
 testsuites/smptests/smpsignal01/smpsignal01.doc |  1 +
 2 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/testsuites/smptests/smpsignal01/init.c b/testsuites/smptests/smpsignal01/init.c
index af524bf..aa7aac1 100644
--- a/testsuites/smptests/smpsignal01/init.c
+++ b/testsuites/smptests/smpsignal01/init.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2013, 2017 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -38,6 +38,8 @@ typedef struct {
   rtems_id producer;
   uint32_t consumer_processor;
   uint32_t producer_processor;
+  rtems_id timer;
+  volatile bool done;
 } test_context;
 
 static void change_state(test_context *ctx, test_state new_state)
@@ -61,6 +63,8 @@ static void signal_handler(rtems_signal_set signal)
 {
   test_context *ctx = &ctx_instance;
 
+  rtems_test_assert(_ISR_Get_level() == 0);
+
   switch (ctx->state) {
     case SIG_0_ENABLE:
       change_state(ctx, SIG_0_PROCESSED);
@@ -119,15 +123,11 @@ static void producer(rtems_task_argument arg)
   rtems_test_assert(0);
 }
 
-static void test(void)
+static void test_two_processors(test_context *ctx)
 {
-  test_context *ctx = &ctx_instance;
   rtems_status_code sc;
   rtems_mode mode;
 
-  ctx->consumer = rtems_task_self();
-  ctx->consumer_processor = rtems_get_current_processor();
-
   sc = rtems_signal_catch(signal_handler, RTEMS_DEFAULT_MODES);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
@@ -151,6 +151,7 @@ static void test(void)
 
   sc = rtems_task_mode(RTEMS_ASR, RTEMS_ASR_MASK, &mode);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  rtems_test_assert(mode == RTEMS_NO_ASR);
 
   wait_for_state(ctx, SIG_0_PROCESSED);
 
@@ -162,12 +163,69 @@ static void test(void)
   check_consumer_processor(ctx);
 }
 
+static void isr_level_timer(rtems_id timer, void *arg)
+{
+  test_context *ctx = arg;
+  rtems_status_code sc;
+
+  sc = rtems_signal_send(ctx->consumer, TEST_SIGNAL);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void isr_level_handler(rtems_signal_set signal)
+{
+  test_context *ctx = &ctx_instance;
+
+  rtems_test_assert(_ISR_Get_level() == 0);
+
+  ctx->done = true;
+}
+
+static void test_isr_level(test_context *ctx)
+{
+  rtems_status_code sc;
+  rtems_mode mode;
+
+  sc = rtems_task_mode(RTEMS_ASR, RTEMS_ASR_MASK, &mode);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  rtems_test_assert(mode == RTEMS_NO_ASR);
+
+  sc = rtems_timer_create(rtems_build_name('T', 'I', 'M', 'R'), &ctx->timer);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  rtems_test_assert(!ctx->done);
+
+  sc = rtems_signal_catch(isr_level_handler, RTEMS_DEFAULT_MODES);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_timer_fire_after(ctx->timer, 1, isr_level_timer, ctx);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  while (!ctx->done) {
+    /* Wait for timer */
+  }
+
+  sc = rtems_timer_delete(ctx->timer);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_mode(RTEMS_NO_ASR, RTEMS_ASR_MASK, &mode);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  rtems_test_assert(mode == RTEMS_ASR);
+}
+
 static void Init(rtems_task_argument arg)
 {
+  test_context *ctx = &ctx_instance;
+
   TEST_BEGIN();
 
+  ctx->consumer = rtems_task_self();
+  ctx->consumer_processor = rtems_get_current_processor();
+
+  test_isr_level(ctx);
+
   if (rtems_get_processor_count() >= 2) {
-    test();
+    test_two_processors(ctx);
   }
 
   TEST_END();
@@ -183,6 +241,8 @@ static void Init(rtems_task_argument arg)
 
 #define CONFIGURE_MAXIMUM_TASKS 2
 
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
 
 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
diff --git a/testsuites/smptests/smpsignal01/smpsignal01.doc b/testsuites/smptests/smpsignal01/smpsignal01.doc
index 98a2a85..4d085f2 100644
--- a/testsuites/smptests/smpsignal01/smpsignal01.doc
+++ b/testsuites/smptests/smpsignal01/smpsignal01.doc
@@ -9,4 +9,5 @@ directives:
 
 concepts:
 
+  - Ensure that signal handlers are called with interrupts enabled.
   - Ensure that Classic Signals work on SMP.



More information about the vc mailing list