Timers in a task context

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Apr 11 06:19:36 UTC 2018

On 10/04/18 14:20, Matthew J Fletcher wrote:
> Hi
> It would be good to know if rtems_task_self() is expected to return 
> the 'TIME' a.k.a rtems_timer_initiate_server() task id, when a timer 
> created with rtems_timer_server_fire_after() fires.

The use of rtems_task_self() in timer routines is a bad application 
behaviour from my point of view. The execution context of the timer 
routines is an implementation detail.

> If it is then i will have to make up some work around, as quite a bit 
> of code thats coming over from ThreadX depends on, it returning the 
> previous 'user' task, not the previous 'system' task.

You can easily fix this with some glue code, e.g.

typedef struct your_timer {
   rtems_id task_which_created_this_timer;
   rtems_id timer;
   void *arg;
   void (*handler)(struct your_timer *, void *);
} your_timer;

void create_timer(your_timer *t)
   t->task_which_created_this_timer = rtems_task_self();
   rtems_timer_create(..., &t->timer);

void timer_wrapper(rtems_id timer, void *arg)
   your_timer *t = arg;

   (*t->handler)(t, t->arg);

void fire_timer(your_timer *t, ...)
   rtems_timer_fire_after(..., timer_wrapper, t);

rtems_id get_task_which_created_this_timer(const your_timer *t)
    return t->task_which_created_this_timer;

> Personally it does feel wrong that the behavior of rtems_task_self() 
> changes behavior depending if you use the timer server or not.

rtems_task_self() returns the id of the executing thread.

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.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

More information about the users mailing list