Which api's can be invoked from an isr?

Joel Sherrill joel.sherrill at OARcorp.com
Tue Dec 17 14:48:10 UTC 2002


> Hi, all
>     I'm now so clear about which api's could be invoked from an isr. For example, in a timer service, I know it is part of rtems_clock_tick() which is the timer isr in general, can I call rtems_task_start()? There is a list of system calls which can be called from an isr in RTEMS C User' Guide, but only a few functions listed there. So it is dangerous if I did call functions not listed there?

Yes.  

The general rules are that 

  + you can not block in an ISR because you are not in a task.  
  + You can not allocate any resources via RTEMS create services,
    regions, or the C program heap.
  + You should not do any time consuming operations (broadcast 
    and printf come to mind here).
  + Unless you save the floating point context yourself, you
    should not use floating point operations.
  + Most if not all network operations are off limits.

>         Thanks for anyone helps.
>         
> PS. I find message_queue_send() and message_queue_urgent() are listed there but message_queue_broadcast() not. I'm confused somewhat. :-p

Broadcast is an O(n) operation where n is the number of tasks that will
receive the message.  Do you really want the overhead of unblocking
an arbitrary number of tasks and copying the message n times?

FWIW I suspect it is safe from RTEMS perspective to call queue broadcast
from an ISR but I would say it was bad form to do so in an ISR due to
the implications on system wide performance and responsiveness.

--joel



More information about the users mailing list