source: rtems/testsuites/smptests/smpscheduler02/init.c @ ea02782a

5
Last change on this file since ea02782a was ea02782a, checked in by Sebastian Huber <sebastian.huber@…>, on 06/14/16 at 09:12:19

posix: sched_get_priority_min()

Enable for all configurations since it pulls in no additional
dependencies.

  • Property mode set to 100644
File size: 8.7 KB
Line 
1/*
2 * Copyright (c) 2014, 2016 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 <sched.h>
20
21#include <rtems.h>
22#include <rtems/libcsupport.h>
23
24#include "tmacros.h"
25
26const char rtems_test_name[] = "SMPSCHEDULER 2";
27
28#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
29
30#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A')
31
32#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B')
33
34#define SCHED_C rtems_build_name(' ', ' ', ' ', 'C')
35
36static rtems_id main_task_id;
37
38static void task(rtems_task_argument arg)
39{
40  rtems_status_code sc;
41
42  (void) arg;
43
44  rtems_test_assert(rtems_get_current_processor() == 1);
45  rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
46
47  sc = rtems_event_transient_send(main_task_id);
48  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
49
50  while (1) {
51    /* Do nothing */
52  }
53}
54
55static void test(void)
56{
57  rtems_status_code sc;
58  rtems_id task_id;
59  rtems_id scheduler_id;
60  rtems_id scheduler_a_id;
61  rtems_id scheduler_b_id;
62  rtems_id scheduler_c_id;
63  cpu_set_t cpuset;
64  cpu_set_t first_cpu;
65  cpu_set_t second_cpu;
66  cpu_set_t all_cpus;
67  uint32_t cpu_count;
68
69  main_task_id = rtems_task_self();
70
71  CPU_ZERO(&first_cpu);
72  CPU_SET(0, &first_cpu);
73
74  CPU_ZERO(&second_cpu);
75  CPU_SET(1, &second_cpu);
76
77  CPU_ZERO(&all_cpus);
78  CPU_SET(0, &all_cpus);
79  CPU_SET(1, &all_cpus);
80
81  cpu_count = rtems_get_processor_count();
82
83  rtems_test_assert(rtems_get_current_processor() == 0);
84
85  sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
86  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
87
88  if (cpu_count > 1) {
89    sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
90    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
91    rtems_test_assert(scheduler_a_id != scheduler_b_id);
92  }
93
94  sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id);
95  rtems_test_assert(sc == RTEMS_UNSATISFIED);
96
97  CPU_ZERO(&cpuset);
98  sc = rtems_scheduler_get_processor_set(
99    scheduler_a_id,
100    sizeof(cpuset),
101    &cpuset
102  );
103  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
104  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
105
106  if (cpu_count > 1) {
107    CPU_ZERO(&cpuset);
108    sc = rtems_scheduler_get_processor_set(
109      scheduler_b_id,
110      sizeof(cpuset),
111      &cpuset
112    );
113    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
114    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
115  }
116
117  sc = rtems_task_create(
118    rtems_build_name('T', 'A', 'S', 'K'),
119    1,
120    RTEMS_MINIMUM_STACK_SIZE,
121    RTEMS_DEFAULT_MODES,
122    RTEMS_DEFAULT_ATTRIBUTES,
123    &task_id
124  );
125  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
126
127  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
128  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
129  rtems_test_assert(scheduler_id == scheduler_a_id);
130
131  CPU_ZERO(&cpuset);
132  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
133  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
134  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
135
136  rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
137
138  if (cpu_count > 1) {
139    sc = rtems_task_set_scheduler(task_id, scheduler_b_id);
140    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
141
142    sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1);
143    rtems_test_assert(sc == RTEMS_INVALID_ID);
144
145    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
146    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
147    rtems_test_assert(scheduler_id == scheduler_b_id);
148
149    CPU_ZERO(&cpuset);
150    sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
151    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
152    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
153
154    sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus);
155    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
156
157    sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu);
158    rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
159
160    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
161    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
162    rtems_test_assert(scheduler_id == scheduler_b_id);
163
164    sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu);
165    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
166
167    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
168    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
169    rtems_test_assert(scheduler_id == scheduler_b_id);
170
171    sc = rtems_task_start(task_id, task, 0);
172    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
173
174    sc = rtems_task_set_scheduler(task_id, scheduler_b_id);
175    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
176
177    sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
178    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
179  }
180
181  sc = rtems_task_delete(task_id);
182  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
183}
184
185#else /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
186
187static void test(void)
188{
189  /* Nothing to do */
190}
191
192#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
193
194static void Init(rtems_task_argument arg)
195{
196  rtems_resource_snapshot snapshot;
197
198  TEST_BEGIN();
199
200  rtems_resource_snapshot_take(&snapshot);
201
202  test();
203
204  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
205
206  TEST_END();
207  rtems_test_exit(0);
208}
209
210#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
211#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
212
213#define CONFIGURE_SMP_APPLICATION
214
215/* Lets see when the first RTEMS system hits this limit */
216#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 64
217
218#define CONFIGURE_MAXIMUM_PRIORITY 255
219
220#define CONFIGURE_SCHEDULER_PRIORITY_SMP
221#define CONFIGURE_SCHEDULER_SIMPLE_SMP
222
223#include <rtems/scheduler.h>
224
225RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, CONFIGURE_MAXIMUM_PRIORITY + 1);
226
227RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, CONFIGURE_MAXIMUM_PRIORITY + 1);
228
229RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(c);
230
231#define CONFIGURE_SCHEDULER_CONTROLS \
232  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \
233  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B), \
234  RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(c, SCHED_C)
235
236#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
237  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
238  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
239  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
240  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
241  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
242  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
243  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
244  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
245  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
246  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
247  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
248  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
249  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
250  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
251  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
252  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
253  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
254  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
255  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
256  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
257  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
258  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
259  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
260  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
261  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
262  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
263  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
264  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
265  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
266  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
267  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
268  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
269  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
270  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
271
272#define CONFIGURE_MAXIMUM_TASKS 2
273
274#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
275
276#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
277
278#define CONFIGURE_INIT
279
280#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.