source: rtems/testsuites/smptests/smpscheduler02/init.c @ 77ff5599

5
Last change on this file since 77ff5599 was 77ff5599, checked in by Sebastian Huber <sebastian.huber@…>, on 06/10/16 at 06:48:54

score: Introduce map priority scheduler operation

Introduce map/unmap priority scheduler operations to map thread priority
values from/to the user domain to/from the scheduler domain. Use the
map priority operation to validate the thread priority. The EDF
schedulers use this new operation to distinguish between normal
priorities and priorities obtain through a job release.

Update #2173.
Update #2556.

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