[PATCH] Add Strong APA 2nd test

Gedare Bloom gedare at rtems.org
Tue Sep 1 18:55:15 UTC 2020


Hi Richi,

Is the original test that this patch replaces not good? Or should you
provide an additional smpstrongapa02 instead?

Simulating a WCET is challenging, but you can get an overestimate by
spinning over a running timer until the timeout you want is reached.
There will be error in both the setup and completion, since you won't
know how long it took to read the timer initially and you won't know
how long it took before the timeout was reached and your task yields.

-Gedare

On Sat, Aug 29, 2020 at 3:58 AM Richi Dubey <richidubey at gmail.com> wrote:
>
> 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. 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
>>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list