Thanks for your reply. I have attached the program that fails with
partitioned EDF_SMP configuration.

I will try RTEMS_SCHEDULER_EDF_SMP(name,CONFIGURE_MAXIMUM_PROCESSORS)
on all the four scheduler instances and see if that works.

Best regards
Ebenezer

On Mon, 28 Oct 2019 at 07:12, Sebastian Huber
<sebastian.hu...@embedded-brains.de> wrote:
>
> Hello Ebenezer,
>
> a self-contained example program which reproduces this issue would be
> helpful.
>
> In the RTEMS_SCHEDULER_EDF_SMP(name, max_cpu_count) configuration
> define, the max_cpu_count must be CONFIGURE_MAXIMUM_PROCESSORS.
>
> --
> Sebastian Huber, embedded brains GmbH
>
> Address : Dornierstr. 4, D-82178 Puchheim, Germany
> Phone   : +49 89 189 47 41-16
> Fax     : +49 89 189 47 41-09
> E-Mail  : sebastian.hu...@embedded-brains.de
> PGP     : Public key available on request.
>
> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#define BKT_PRIO 14

#include <bsp.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>

rtems_task task1(rtems_task_argument argument){
  while (1){
    printf("task 1 on CPU: %d \n", rtems_scheduler_get_processor());
    printf("Sleep for 1 Sec \n");
    rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(1000));
  }
}

rtems_task task2(rtems_task_argument argument){
  while (1){
    printf("task 2 on CPU: %d\n", rtems_scheduler_get_processor());
    printf("Sleep for 2 Sec \n");
    rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(2000));
  }
}

rtems_task task3(rtems_task_argument argument){
  while (1){
    printf("task 3 on CPU: %d \n", rtems_scheduler_get_processor());
    printf("Sleep for 4 Sec \n");
    rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(4000));
  }
}

rtems_task task4(rtems_task_argument argument){
  while (1){
    printf("task 4 on CPU: %d \n", rtems_scheduler_get_processor());
    printf("Sleep for 8 Sec \n");
    rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(8000));
  }
}

rtems_task Init(rtems_task_argument argument){
  rtems_id           id[4];
  rtems_id           schd[4];
  rtems_status_code  status;
  cpu_set_t          cpuset;

  printf("Number of CPUS: %d \n", rtems_scheduler_get_processor_maximum());
  printf("Init task on CPU: %d\n", rtems_scheduler_get_processor());

  status = rtems_scheduler_ident( rtems_build_name('S', 'C', 'H', '0'), &schd[0]);
  assert( status == RTEMS_SUCCESSFUL );
  CPU_ZERO(&cpuset);
  status = rtems_scheduler_get_processor_set(schd[0], sizeof(cpuset), &cpuset);
  assert(status == RTEMS_SUCCESSFUL );
  printf("Scheduler 0 on: %d Cores \n",CPU_COUNT(&cpuset));
  printf("CPUSET : %d \n",cpuset);
  printf("CPU 0 : %d \n",CPU_ISSET(0, &cpuset));
  printf("CPU 1 : %d \n",CPU_ISSET(1, &cpuset));
  printf("CPU 2 : %d \n",CPU_ISSET(2, &cpuset));
  printf("CPU 3 : %d \n",CPU_ISSET(3, &cpuset));

  status = rtems_scheduler_ident( rtems_build_name('S', 'C', 'H', '1'), &schd[1]);
  assert( status == RTEMS_SUCCESSFUL );
  CPU_ZERO(&cpuset);
  status = rtems_scheduler_get_processor_set(schd[1], sizeof(cpuset), &cpuset);
  assert( status == RTEMS_SUCCESSFUL );
  printf("Scheduler 1 on: %d Cores \n",CPU_COUNT(&cpuset));
  printf("CPUSET : %d \n",cpuset);
  printf("CPU 0 : %d \n",CPU_ISSET(0, &cpuset));
  printf("CPU 1 : %d \n",CPU_ISSET(1, &cpuset));
  printf("CPU 2 : %d \n",CPU_ISSET(2, &cpuset));
  printf("CPU 3 : %d \n",CPU_ISSET(3, &cpuset));

  status = rtems_scheduler_ident( rtems_build_name('S', 'C', 'H', '2'), &schd[2]);
  assert( status == RTEMS_SUCCESSFUL );
  status = rtems_scheduler_add_processor(schd[2], 2);
  CPU_ZERO(&cpuset);
  status = rtems_scheduler_get_processor_set(schd[2], sizeof(cpuset), &cpuset);
  assert( status == RTEMS_SUCCESSFUL );
  printf("Scheduler 2 on: %d Cores \n",CPU_COUNT(&cpuset));
  printf("CPUSET : %d \n",cpuset);
  printf("CPU 0 : %d \n",CPU_ISSET(0, &cpuset));
  printf("CPU 1 : %d \n",CPU_ISSET(1, &cpuset));
  printf("CPU 2 : %d \n",CPU_ISSET(2, &cpuset));
  printf("CPU 3 : %d \n",CPU_ISSET(3, &cpuset));

  status = rtems_scheduler_ident( rtems_build_name('S', 'C', 'H', '3'), &schd[3]);
  assert( status == RTEMS_SUCCESSFUL );
  CPU_ZERO(&cpuset);
  status = rtems_scheduler_get_processor_set(schd[3], sizeof(cpuset), &cpuset);
  assert( status == RTEMS_SUCCESSFUL );
  printf("Scheduler 3 on: %d Cores \n",CPU_COUNT(&cpuset));
  printf("CPUSET : %d \n",cpuset);
  printf("CPU 0 : %d \n",CPU_ISSET(0, &cpuset));
  printf("CPU 1 : %d \n",CPU_ISSET(1, &cpuset));
  printf("CPU 2 : %d \n",CPU_ISSET(2, &cpuset));
  printf("CPU 3 : %d \n",CPU_ISSET(3, &cpuset));

  // Background tasks
  status = rtems_task_create(rtems_build_name( 'T', 'A', 1, ' ' ),1,RTEMS_MINIMUM_STACK_SIZE,RTEMS_DEFAULT_MODES,RTEMS_DEFAULT_ATTRIBUTES,&id[0]);
  status = rtems_task_set_scheduler(id[0], schd[0], BKT_PRIO);
  status = rtems_task_start( id[0], task1, 1 );

  status = rtems_task_create(rtems_build_name( 'T', 'A', 2, ' ' ),1,RTEMS_MINIMUM_STACK_SIZE,RTEMS_DEFAULT_MODES,RTEMS_DEFAULT_ATTRIBUTES,&id[1]);
  status = rtems_task_set_scheduler(id[1], schd[1], BKT_PRIO);
  status = rtems_task_start( id[1], task2, 2 );

  status = rtems_task_create(rtems_build_name( 'T', 'A', 3, ' ' ),1,RTEMS_MINIMUM_STACK_SIZE,RTEMS_DEFAULT_MODES,RTEMS_DEFAULT_ATTRIBUTES,&id[2]);
  status = rtems_task_set_scheduler(id[2], schd[2], BKT_PRIO);
  status = rtems_task_start( id[2], task3, 3 );

  status = rtems_task_create(rtems_build_name( 'T', 'A', 4, ' ' ),1,RTEMS_MINIMUM_STACK_SIZE,RTEMS_DEFAULT_MODES,RTEMS_DEFAULT_ATTRIBUTES,&id[3]);
  status = rtems_task_set_scheduler(id[3], schd[3], BKT_PRIO);
  status = rtems_task_start( id[3], task4, 4 );

  printf("Init ends \n");
  rtems_task_exit();
}

#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MAXIMUM_PROCESSORS  4
#define CONFIGURE_MICROSECONDS_PER_TICK   1000
#define CONFIGURE_MAXIMUM_TASKS 7
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_INIT

#define CONFIGURE_SCHEDULER_EDF_SMP
#include<rtems/scheduler.h>

RTEMS_SCHEDULER_EDF_SMP(sch0, 1);
RTEMS_SCHEDULER_EDF_SMP(sch1, 1);
RTEMS_SCHEDULER_EDF_SMP(sch2, 1);
RTEMS_SCHEDULER_EDF_SMP(sch3, 1);

#define CONFIGURE_SCHEDULER_TABLE_ENTRIES RTEMS_SCHEDULER_TABLE_EDF_SMP(sch0, rtems_build_name('S','C','H','0')),\
RTEMS_SCHEDULER_TABLE_EDF_SMP(sch1, rtems_build_name('S','C','H','1')),\
RTEMS_SCHEDULER_TABLE_EDF_SMP(sch2, rtems_build_name('S','C','H','2')),\
RTEMS_SCHEDULER_TABLE_EDF_SMP(sch3, rtems_build_name('S','C','H','3'))

#define CONFIGURE_SCHEDULER_ASSIGNMENTS RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY),\
RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY),\
RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY),\
RTEMS_SCHEDULER_ASSIGN(3, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY)

#include <rtems/confdefs.h>
_______________________________________________
users mailing list
users@rtems.org
http://lists.rtems.org/mailman/listinfo/users

Reply via email to