source: rtems-schedsim/schedsim/shell/shared/main_taskcreate.c @ 3200227

Last change on this file since 3200227 was 3200227, checked in by Jennifer Averett <jennifer.averett@…>, on May 16, 2014 at 7:46:36 PM

schedsim: Add affinity support to task create.

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 *  Task Create Shell Command Implmentation
3 *
4 *  COPYRIGHT (c) 1989-2013.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.rtems.com/license/LICENSE.
10 */
11
12#ifdef HAVE_CONFIG_H
13#include "config.h"
14#endif
15
16#define _GNU_SOURCE
17#include <sys/cpuset.h>
18
19#include <stdio.h>
20
21#define __need_getopt_newlib
22#include <newlib/getopt.h>
23
24#include <rtems.h>
25#include "shell.h"
26#include <rtems/stringto.h>
27#include <schedsim_shell.h>
28#include <rtems/error.h>
29
30static void print_mode(
31  const char *prefix,
32  rtems_mode  mode
33)
34{
35  printf(
36    "%sPreemption: %s Timeslicing: %s\n",
37    prefix,
38    ((mode & RTEMS_NO_PREEMPT) ? "no" : "yes"),
39    ((mode & RTEMS_TIMESLICE) ? "yes" : "no")
40  );
41}
42
43rtems_task dummy_task(
44  rtems_task_argument arg
45)
46{
47}
48
49int rtems_shell_main_task_create(
50  int   argc,
51  char *argv[]
52)
53{
54  char              *c_p;
55  char               name[5];
56  rtems_id           id;
57  rtems_status_code  status;
58  long               priority;
59  rtems_mode         mode;
60  rtems_mode         mask;
61  struct getopt_data getopt_reent;
62  char               option;
63  int                arg;
64  unsigned long      affinity;
65  cpu_set_t          cpuset;
66  bool               do_affinity;
67
68  CHECK_RTEMS_IS_UP();
69
70  mode = 0;
71  mask = 0;
72  do_affinity = false;
73  memset(&getopt_reent, 0, sizeof(getopt_data));
74  while ( (option = getopt_r( argc, argv, "a:tTpP", &getopt_reent)) != -1 ) {
75    switch (option) {
76      case 'a':
77        c_p = getopt_reent.optarg;
78        if ( rtems_string_to_unsigned_long( c_p, &affinity, NULL, 0) ) {
79          fprintf( stderr, "Affinity (%s) is not a number\n", argv[2] );
80          return 1;
81        }
82        do_affinity = true;
83
84        CPU_ZERO( &cpuset );
85        cpuset.__bits[0] = affinity;
86        break;
87
88      case 't':
89        mask |= RTEMS_TIMESLICE_MASK;
90        mode  = (mode & ~RTEMS_TIMESLICE_MASK) | RTEMS_NO_TIMESLICE;
91        break;
92      case 'T':
93        mask |= RTEMS_TIMESLICE_MASK;
94        mode  = (mode & ~RTEMS_TIMESLICE_MASK) | RTEMS_TIMESLICE;
95        break;
96      case 'p':
97        mask |= RTEMS_PREEMPT_MASK;
98        mode  = (mode & ~RTEMS_PREEMPT_MASK) | RTEMS_NO_PREEMPT;
99        break;
100      case 'P':
101        mask |= RTEMS_PREEMPT_MASK;
102        mode  = (mode & ~RTEMS_PREEMPT_MASK) | RTEMS_PREEMPT;
103        break;
104      default:
105        fprintf( stderr, "%s: Usage [-tTpP]\n", argv[0] );
106        return -1;
107    }
108  }
109
110  print_mode( "Creating task with:  ", mode );
111
112  /*
113   *  Rest of arguments
114   */
115  arg = getopt_reent.optind;
116  if ( ((argc - arg) != 2) && ((argc - arg) != 4) ){
117    fprintf( stderr, "%s: Usage [args] name priority -a affinity\n", argv[0] );
118    return -1;
119  }
120
121  if ( rtems_string_to_long(argv[arg+1], &priority, NULL, 0) ) {
122    printf( "Priority argument (%s) is not a number\n", argv[1] );
123    return -1;
124  }
125
126  /*
127   *  Now create the task
128   */
129  memset( name, '\0', sizeof(name) );
130  strncpy( name, argv[arg], 4 );
131
132  status = rtems_task_create(
133    rtems_build_name( name[0], name[1], name[2], name[3] ),
134    (rtems_task_priority) priority,
135    RTEMS_MINIMUM_STACK_SIZE,
136    mode,
137    RTEMS_DEFAULT_ATTRIBUTES,
138    &id
139  );
140  if ( status ) {
141    fprintf(
142      stderr,
143      "Task Create(%s) returned %s\n",
144      name,
145      rtems_status_text( status )
146    );
147    return -1;
148  }
149
150  printf(
151    "Task (%s) created: id=0x%08x, priority=%ld\n",
152    name,
153    id,
154    priority
155  );
156
157  /*
158   * If specified, set the affinity
159   */
160  if ( do_affinity ) {
161    status = rtems_task_set_affinity( id, sizeof(cpuset), &cpuset );
162    if ( status != RTEMS_SUCCESSFUL ) {
163      fprintf(
164        stderr,
165        "Task Set Affinity(0x%08x) returned %s\n"
166        "Deleting task 0x%08x\n",
167        affinity,
168        rtems_status_text( status ),
169        id
170      );
171      rtems_task_delete( id );
172      return -1;
173    }
174    printf("Task (0x%08x) Set affinity=0x%08x\n", id, cpuset.__bits[0] );
175  }
176
177  /*
178   * Starting the task
179   */
180  printf(
181    "Task (%s) starting: id=0x%08x, priority=%ld\n",
182    name,
183    id,
184    priority
185  );
186
187  status = rtems_task_start( id, dummy_task, 1 );
188  if ( status ) {
189    fprintf(
190      stderr,
191      "Task Start(%s) returned %s\n",
192      name,
193      rtems_status_text( status )
194    );
195    return -1;
196  }
197
198  return 0;
199}
200
201rtems_shell_cmd_t rtems_shell_TASK_CREATE_Command = {
202  "task_create",                 /* name */
203  "task_create name priority",   /* usage */
204  "rtems",                       /* topic */
205  rtems_shell_main_task_create,  /* command */
206  NULL,                          /* alias */
207  NULL                           /* next */
208};
Note: See TracBrowser for help on using the repository browser.