[PATCH] Add Strong APA 2nd test

Richi Dubey richidubey at gmail.com
Sat Aug 29 09:58:05 UTC 2020


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 <richidubey at 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 ( richidubey at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200829/b97652aa/attachment-0001.html>


More information about the devel mailing list