Hi, The Strong APA scheduler ( https://lists.rtems.org/pipermail/devel/2020-August/061662.html) passes this test as well. This test is again based on the example from page 6 of the paper <https://people.mpi-sws.org/~bbb/papers/pdf/rtss14f.pdf>. This test does not exactly work like the example in the paper does, but I need your help in figuring out how to make tasks that have a WCET (i.e. that they die out in some time, using a timer) to make something like that.
Thanks, Richi. On Sat, Aug 29, 2020 at 3:23 PM Richi Dubey <richidu...@gmail.com> wrote: > --- > testsuites/smptests/smpstrongapa01/init.c | 72 ++++++++++++++--------- > 1 file changed, 43 insertions(+), 29 deletions(-) > > diff --git a/testsuites/smptests/smpstrongapa01/init.c > b/testsuites/smptests/smpstrongapa01/init.c > index bf8bc05231..0daa768b48 100644 > --- a/testsuites/smptests/smpstrongapa01/init.c > +++ b/testsuites/smptests/smpstrongapa01/init.c > @@ -1,4 +1,5 @@ > /* > + * Copyright (c) 2020 Richi Dubey ( richidu...@gmail.com ) > * Copyright (c) 2016, 2017 embedded brains GmbH. All rights reserved. > * > * embedded brains GmbH > @@ -16,23 +17,28 @@ > #include "config.h" > #endif > > -#include "tmacros.h" > +#include <tmacros.h> > > #include <rtems.h> > > const char rtems_test_name[] = "SMPSTRONGAPA 1"; > > -#define CPU_COUNT 4 > +#define CPU_COUNT 2 > > -#define TASK_COUNT (3 * CPU_COUNT) > +#define TASK_COUNT 3 > > #define P(i) (UINT32_C(2) + i) > > #define ALL ((UINT32_C(1) << CPU_COUNT) - 1) > > -#define IDLE UINT8_C(255) > +#define A(cpu0, cpu1) ( (cpu1 << 1) | cpu0 ) > > -#define NAME rtems_build_name('S', 'A', 'P', 'A') > +typedef enum { > + T0, > + T1, > + T2, > + IDLE > +} task_index; > > typedef struct { > enum { > @@ -43,7 +49,7 @@ typedef struct { > KIND_UNBLOCK > } kind; > > - size_t index; > + task_index index; > > struct { > rtems_task_priority priority; > @@ -65,54 +71,59 @@ typedef struct { > KIND_RESET, \ > 0, \ > { 0 }, \ > - { IDLE, IDLE, IDLE, IDLE } \ > + { IDLE, IDLE} \ > } > > -#define SET_PRIORITY(index, prio, cpu0, cpu1, cpu2, cpu3) \ > +#define SET_PRIORITY(index, prio, cpu0, cpu1) \ > { \ > KIND_SET_PRIORITY, \ > index, \ > { .priority = prio }, \ > - { cpu0, cpu1, cpu2, cpu3 } \ > + { cpu0, cpu1} \ > } > > -#define SET_AFFINITY(index, aff, cpu0, cpu1, cpu2, cpu3) \ > +#define SET_AFFINITY(index, aff, cpu0, cpu1) \ > { \ > KIND_SET_AFFINITY, \ > index, \ > { .cpu_set = aff }, \ > - { cpu0, cpu1, cpu2, cpu3 } \ > + { cpu0, cpu1 } \ > } > > -#define BLOCK(index, cpu0, cpu1, cpu2, cpu3) \ > +#define BLOCK(index, cpu0, cpu1) \ > { \ > KIND_BLOCK, \ > index, \ > { 0 }, \ > - { cpu0, cpu1, cpu2, cpu3 } \ > + { cpu0, cpu1 } \ > } > > -#define UNBLOCK(index, cpu0, cpu1, cpu2, cpu3) \ > +#define UNBLOCK(index, cpu0, cpu1) \ > { \ > KIND_UNBLOCK, \ > index, \ > { 0 }, \ > - { cpu0, cpu1, cpu2, cpu3 } \ > + { cpu0, cpu1} \ > } > > static const test_action test_actions[] = { > RESET, > - UNBLOCK( 0, 0, IDLE, IDLE, IDLE), > - UNBLOCK( 1, 0, 1, IDLE, IDLE), > - UNBLOCK( 2, 0, 1, 2, IDLE), > - UNBLOCK( 3, 0, 1, 2, 3), > - UNBLOCK( 5, 0, 1, 2, 3), > - SET_PRIORITY( 3, P(4), 0, 1, 2, 3), > - SET_PRIORITY( 5, P(3), 0, 1, 2, 5), > - BLOCK( 5, 0, 1, 2, 3), > - SET_AFFINITY( 5, ALL, 0, 1, 2, 3), > - RESET, > - UNBLOCK( 0, 0, IDLE, IDLE, IDLE), > + UNBLOCK( T0, T0, IDLE), > + UNBLOCK( T1, T0, T1), > + UNBLOCK( T2, T0, T1), > + SET_PRIORITY( T0, P(0), T0, T1), > + /* > + * Introduce Task 2 intially with lowest priority to imitate late > arrival > + */ > + SET_PRIORITY( T2, P(4), T0, T1), > + SET_PRIORITY( T1, P(3), T0, T1), > + SET_AFFINITY( T0, ALL, T0, T1), > + SET_AFFINITY( T1, A(0, 1), T0, T1), > + SET_AFFINITY( T2, A(1, 0), T0, T1), > + /* > + * Show that higher priority task gets dislodged from its processor > + */ > + SET_PRIORITY( T2, P(2), T2, T0), > RESET > }; > > @@ -182,7 +193,7 @@ static void check_cpu_allocations(test_context *ctx, > const test_action *action) > size_t i; > > for (i = 0; i < CPU_COUNT; ++i) { > - size_t e; > + task_index e; > const Per_CPU_Control *c; > const Thread_Control *h; > > @@ -279,7 +290,7 @@ static void test(void) > > for (i = 0; i < TASK_COUNT; ++i) { > sc = rtems_task_create( > - NAME, > + rtems_build_name(' ', ' ', 'T', '0' + i), > P(i), > RTEMS_MINIMUM_STACK_SIZE, > RTEMS_DEFAULT_MODES, > @@ -292,7 +303,10 @@ static void test(void) > rtems_test_assert(sc == RTEMS_SUCCESSFUL); > } > > - sc = rtems_timer_create(NAME, &ctx->timer_id); > + sc = rtems_timer_create( > + rtems_build_name('A', 'C', 'T', 'N'), > + &ctx->timer_id > + ); > rtems_test_assert(sc == RTEMS_SUCCESSFUL); > > sc = rtems_timer_fire_after(ctx->timer_id, 1, timer, ctx); > -- > 2.17.1 > >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel