source: rtems/testsuites/smptests/smpschededf04/init.c @ 806fe963

5
Last change on this file since 806fe963 was 806fe963, checked in by Sebastian Huber <sebastian.huber@…>, on 12/19/19 at 10:38:45

config: Improve EDF SMP scheduler configuration

Use CONFIGURE_MAXIMUM_PROCESSORS to configure the EDF SMP scheduler
context. This avoids hard to debug configuration errors resulting in
memory corruptions.

Close #3815.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*
2 * Copyright (c) 2018 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include "tmacros.h"
20
21#include <rtems.h>
22
23const char rtems_test_name[] = "SMPSCHEDEDF 4";
24
25#define CPU_COUNT 4
26
27#define TASK_COUNT 2
28
29#define MAIN rtems_build_name('M', 'A', 'I', 'N')
30
31#define OTHER rtems_build_name('O', 'T', 'H', 'R')
32
33typedef struct {
34  rtems_id other_scheduler_id;
35  rtems_id task_ids[TASK_COUNT];
36} test_context;
37
38static test_context test_instance;
39
40static void do_nothing_task(rtems_task_argument arg)
41{
42  (void) arg;
43
44  _CPU_Thread_Idle_body(0);
45}
46
47static void test(void)
48{
49  test_context *ctx;
50  rtems_status_code sc;
51  size_t i;
52
53  ctx = &test_instance;
54
55  for (i = 0; i < TASK_COUNT; ++i) {
56    sc = rtems_task_create(
57      rtems_build_name('N', 'B', 'D', 'Y'),
58      2,
59      RTEMS_MINIMUM_STACK_SIZE,
60      RTEMS_DEFAULT_MODES,
61      RTEMS_DEFAULT_ATTRIBUTES,
62      &ctx->task_ids[i]
63    );
64    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
65
66    sc = rtems_task_start(ctx->task_ids[i], do_nothing_task, 0);
67    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
68  }
69
70  sc = rtems_scheduler_ident(OTHER, &ctx->other_scheduler_id);
71  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
72
73  for (i = 0; i < TASK_COUNT; ++i) {
74    const Per_CPU_Control *cpu;
75
76    sc = rtems_task_set_scheduler(ctx->task_ids[i], ctx->other_scheduler_id, 2);
77    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
78
79    cpu = _Per_CPU_Get_by_index(CPU_COUNT - 1 - i);
80    rtems_test_assert(cpu->heir->Object.id == ctx->task_ids[i]);
81  }
82
83  for (i = 0; i < TASK_COUNT; ++i) {
84    sc = rtems_task_delete(ctx->task_ids[i]);
85    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
86  }
87}
88
89static void Init(rtems_task_argument arg)
90{
91  TEST_BEGIN();
92
93  if (rtems_scheduler_get_processor_maximum() == CPU_COUNT) {
94    test();
95  } else {
96    puts("warning: wrong processor count to run the test");
97  }
98
99  TEST_END();
100  rtems_test_exit(0);
101}
102
103#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
104
105#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
106
107#define CONFIGURE_MAXIMUM_TASKS (1 + TASK_COUNT)
108
109#define CONFIGURE_MAXIMUM_PROCESSORS CPU_COUNT
110
111#define CONFIGURE_SCHEDULER_EDF_SMP
112
113#include <rtems/scheduler.h>
114
115RTEMS_SCHEDULER_EDF_SMP(a);
116
117RTEMS_SCHEDULER_EDF_SMP(b);
118
119#define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
120  RTEMS_SCHEDULER_TABLE_EDF_SMP(a, MAIN), \
121  RTEMS_SCHEDULER_TABLE_EDF_SMP(b, OTHER)
122
123#define CONFIGURE_SCHEDULER_ASSIGNMENTS \
124  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
125  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
126  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
127  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
128
129#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
130
131#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
132
133#define CONFIGURE_INIT
134
135#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.