smptests/smpsignal01: Check signal ISR level

Close #2751.
This commit is contained in:
Sebastian Huber
2017-01-24 09:43:20 +01:00
parent 3d20f5fbb7
commit 436a4b384b
2 changed files with 68 additions and 7 deletions

View File

@@ -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

View File

@@ -9,4 +9,5 @@ directives:
concepts:
- Ensure that signal handlers are called with interrupts enabled.
- Ensure that Classic Signals work on SMP.