summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests/smp04/init.c
blob: 88528e3d4f4b4e9e4b3aac6e7f3459dbb8ced775 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 *  COPYRIGHT (c) 1989-2011.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#define CONFIGURE_INIT
#include "system.h"

#include <stdio.h>


void Loop() {
  volatile int i;

  for (i=0; i<500000; i++);
}

rtems_task Test_task(
  rtems_task_argument task_index
)
{
  int               cpu_num;

  cpu_num = bsp_smp_processor_id();
  locked_printf("  CPU %d running task TA%" PRIu32 "\n", cpu_num, task_index );
  Loop();
  TaskRan[task_index] = true;

  while(1);
}

rtems_task Init(
  rtems_task_argument argument
)
{
  int               i;
  char              ch;
  rtems_id          id;
  rtems_status_code status;
  bool              allDone;
  int               cpu_num;

  Loop();
  locked_print_initialize();
  locked_printf( "\n\n***  SMP04 TEST ***\n" );

  /* Display which cpu is running this init thread. */
  cpu_num = bsp_smp_processor_id();
  locked_printf("  CPU %d running task Init\n", cpu_num );

  /* Set all Tasks to not ran except for the init task */
  TaskRan[0] = true;
  for ( i=1; i <= rtems_smp_get_number_of_processors() ; i++ )
    TaskRan[i] = false;
  

  /*
   * For each processor create and start a task alternating 
   * between  RTEMS_PREEMPT and RTEMS_NO_PREEMPT.
   */
  for ( i=1; i < rtems_smp_get_number_of_processors() ; i++ ){

    /* Create and start tasks for each CPU */
    ch = '0' + i;
    locked_printf(
      "Create a TA%c a %s task\n",
      ch, 
      ((i%2) ? "RTEMS_PREEMPT" : "RTEMS_NO_PREEMPT" ) 
    );

    status = rtems_task_create(
      rtems_build_name( 'T', 'A', ch, ' ' ),
      CONFIGURE_INIT_TASK_PRIORITY +
        (2*rtems_smp_get_number_of_processors()) - (2*i),
      RTEMS_MINIMUM_STACK_SIZE,
      ((i%2) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT),
      RTEMS_DEFAULT_ATTRIBUTES,
      &id
    );

    locked_printf(
      "Start TA%c a %s task\n",
      ch, 
      ((i%2) ? "RTEMS_PREEMPT" : "RTEMS_NO_PREEMPT" ) 
    );
    status = rtems_task_start( id, Test_task, i );

    /*
     * Force a wait on the task to run in order to synchronize on
     * simulated systems.
     */   
    while (TaskRan[i] == false)
      ;
  }

  /*
   * Create and start one more task.  This task
   * should preempt the longest running PREEMPTABLE
   * task and run on that cpu.
   */
  ch = '0' + rtems_smp_get_number_of_processors() ;
  locked_printf(
    "Create a TA%c a %s task\n",
    ch, 
    "RTEMS_PREEMPT"  
  );
  status = rtems_task_create(
    rtems_build_name( 'T', 'A', ch, ' ' ),
    3,
    RTEMS_MINIMUM_STACK_SIZE,
    RTEMS_PREEMPT,
    RTEMS_DEFAULT_ATTRIBUTES,
    &id
  );
  locked_printf(
    "Start TA%c a %s task\n",
    ch, 
    "RTEMS_PREEMPT" 
  );
  status = rtems_task_start(
    id,
    Test_task,
    rtems_smp_get_number_of_processors()
  );
  
  /* 
   * Wait on the all tasks to run 
   */
  while (1) {
    allDone = true;
    for ( i=1; i<=rtems_smp_get_number_of_processors() ; i++ ) {
      if (TaskRan[i] == false)
        allDone = false;
    }
    if (allDone) {
      Loop();
      locked_printf( "*** END OF TEST SMP04 ***\n" );
      rtems_test_exit( 0 );
    }
  }
}