source: rtems/testsuites/smptests/smpwakeafter01/init.c @ 98c6d50

5
Last change on this file since 98c6d50 was 98c6d50, checked in by Chris Johns <chrisj@…>, on 10/19/17 at 05:39:16

testsuite: Use printk for all test output where possible.

  • Remove the printf support leaving the direct printk support configured with TESTS_USE_PRINTK and all other output goes via a buffered vsniprintf call to printk.
  • Control the test's single init for functions and global data with TEST_INIT and not CONFIGURE_INIT. They are now separate.

Updates #3170.

  • Property mode set to 100644
File size: 6.4 KB
Line 
1/*
2 * Copyright (c) 2014 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#define TEST_INIT
20
21#include "tmacros.h"
22
23#include <stdio.h>
24#include <inttypes.h>
25
26#include <rtems.h>
27#include <rtems/libcsupport.h>
28
29const char rtems_test_name[] = "SMPWAKEAFTER 1";
30
31#define CPU_COUNT 32
32
33#define INTERVAL_COUNT 8
34
35#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A')
36
37#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B')
38
39static rtems_id task_ids[CPU_COUNT][INTERVAL_COUNT];
40
41static const rtems_interval intervals[INTERVAL_COUNT] =
42  { 1, 2, 3, 5, 7, 11, 13, 17 };
43
44static uint32_t counts[CPU_COUNT][INTERVAL_COUNT];
45
46static rtems_task_argument make_arg(uint32_t i, uint32_t j)
47{
48  return (i << 8) | (j << 0);
49}
50
51static void get_indices(rtems_task_argument arg, uint32_t *i, uint32_t *j)
52{
53  *i = (arg >> 8) & 0xff;
54  *j = (arg >> 0) & 0xff;
55}
56
57static void task(rtems_task_argument arg)
58{
59  uint32_t i;
60  uint32_t j;
61  rtems_interval ticks;
62
63  get_indices(arg, &i, &j);
64  ticks = intervals[j];
65
66  while (true) {
67    rtems_status_code sc;
68
69    ++counts[i][j];
70
71    sc = rtems_task_wake_after(ticks);
72    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
73  }
74}
75
76static void test(void)
77{
78  rtems_status_code sc;
79  uint32_t test_time_in_seconds = 10;
80  uint32_t cpu_count = rtems_get_processor_count();
81  uint32_t i;
82
83  for (i = 0; i < cpu_count; ++i) {
84    rtems_id scheduler_id;
85    uint32_t j;
86
87    if (i != 1) {
88      sc = rtems_scheduler_ident(SCHED_A, &scheduler_id);
89      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
90    } else {
91      sc = rtems_scheduler_ident(SCHED_B, &scheduler_id);
92      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
93    }
94
95    for (j = 0; j < INTERVAL_COUNT; ++j) {
96      sc = rtems_task_create(
97        rtems_build_name('T', 'A', 'S', 'K'),
98        255,
99        RTEMS_MINIMUM_STACK_SIZE,
100        RTEMS_DEFAULT_MODES,
101        RTEMS_DEFAULT_ATTRIBUTES,
102        &task_ids[i][j]
103      );
104      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
105
106      sc = rtems_task_set_scheduler(task_ids[i][j], scheduler_id, 2);
107      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
108
109      sc = rtems_task_start(task_ids[i][j], task, make_arg(i, j));
110      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
111    }
112  }
113
114  for (i = 0; i < test_time_in_seconds; ++i) {
115    printf("%" PRIu32 " seconds remaining\n", test_time_in_seconds - i);
116
117    sc = rtems_task_wake_after(rtems_clock_get_ticks_per_second());
118    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
119  }
120
121  for (i = 0; i < cpu_count; ++i) {
122    uint32_t j;
123
124    for (j = 0; j < INTERVAL_COUNT; ++j) {
125      sc = rtems_task_delete(task_ids[i][j]);
126      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
127
128      printf(
129        "counts[%" PRIu32 "][%" PRIu32 "] = %" PRIu32 "\n",
130        i,
131        j,
132        counts[i][j]
133      );
134    }
135  }
136}
137
138static void Init(rtems_task_argument arg)
139{
140  rtems_resource_snapshot snapshot;
141
142  TEST_BEGIN();
143
144  rtems_resource_snapshot_take(&snapshot);
145
146  test();
147
148  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
149
150  TEST_END();
151  rtems_test_exit(0);
152}
153
154#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
155#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
156
157#define CONFIGURE_MICROSECONDS_PER_TICK 1000
158
159#define CONFIGURE_MAXIMUM_PROCESSORS CPU_COUNT
160
161#define CONFIGURE_MAXIMUM_PRIORITY 255
162
163#define CONFIGURE_SCHEDULER_PRIORITY_SMP
164
165#include <rtems/scheduler.h>
166
167RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, CONFIGURE_MAXIMUM_PRIORITY + 1);
168
169RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, CONFIGURE_MAXIMUM_PRIORITY + 1);
170
171#define CONFIGURE_SCHEDULER_CONTROLS \
172  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \
173  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B)
174
175#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
176  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
177  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
178  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
179  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
180  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
181  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
182  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
183  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
184  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
185  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
186  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
187  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
188  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
189  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
190  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
191  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
192  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
193  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
194  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
195  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
196  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
197  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
198  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
199  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
200  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
201  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
202  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
203  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
204  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
205  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
206  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
207  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
208
209#define CONFIGURE_MAXIMUM_TASKS (1 + CPU_COUNT * INTERVAL_COUNT)
210
211#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
212
213#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
214
215#define CONFIGURE_INIT
216
217#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.