Issue working with rtemsTimer

Joel Sherrill joel.sherrill at oarcorp.com
Mon Sep 15 20:12:26 UTC 2014


The timer method runs inside the clock tick ISR and you can't call printf() from an interrupt. At least that is what I spot first.

Also easy in C++ to do something in an ISR you shouldn't.

On September 15, 2014 3:05:03 PM CDT, "Martínez, Pablo" <pabloa.mar at gmail.com> wrote:
>Hi guys,
>
>Im trying to implement a single shot timer.
>
>I derive from rtemsTimer class and replace virtual void triggered()=0
>
>#include <rtems++/rtemsTimer.h>
>...
>
>class Timer : public rtemsTimer {
>public:
>    Timer(const char* tname);
>    virtual ~Timer();
>private:
>    void triggered();
>};
>
>in timer.cpp
>
>
>void SynchTimer::triggered(){
>
>    printf("hello Timer! \n");
>
>}
>
>
>Then I have the following task class who creates and fires a Timer
>object:
>
>class TimerMngr : public rtemsTask{
>
>public:
>    TimerMngr(const char* tname);
>    virtual ~TimerMngr();
>
>private:
>    void body(rtems_task_argument argument);
>
>};
>
>
>
>in timerMngr.cpp
>
>TimerMngr::TimerMngr(const char* tname)
>:    rtemsTask(tname,
>        1,
>        RTEMS_MINIMUM_STACK_SIZE,
>        RTEMS_PREEMPT|RTEMS_TIMESLICE,
>        0,
>        RTEMS_NO_FLOATING_POINT,
>        RTEMS_LOCAL)
>
>{
>    if(last_status_code()!=RTEMS_SUCCESSFUL)
>        printf("SynchMngr::error when create()%d \n",
>                last_status_code());
>}
>
>
>
>
>void TimerMngr::body(rtems_task_argument argument){
>
>    printf("TimerMngr::body!  \n");   [1] 
>
>    /* Create the Timer
>     * *****************************/
>    Timer* timer=new Timer("timer");
>
>    printf("SynchMngr, CurrentTime! @ %d \n",getCurrentTime());   [2] 
>
>
>    /* start timer
>     * *****************************/
>    rtems_status_code status;
>    status=synch_timer->fire_after(120);
>    printf("synch_timer->fire_after() status %d \n",status); [3] 
>
>
>    wake_after(500);
>    printf("SynchMngr, CurrentTime @ %d \n",getCurrentTime()); [4]
>
>}
>
>unsigned TimerMngr::getCurrentTime(){
>    //rtems_unsigned32  time_stamp;
>    unsigned time_stamp;
>    time_stamp=0;
>    rtems_status_code status;
>
>status=rtems_clock_get(RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH,&time_stamp);
>    if(status!=RTEMS_SUCCESSFUL)
>        printf("error with rtems_clock_get %d \n",status);
>
>    return time_stamp;
>}
>
>When I run the app I get the first and second printf [1] y [2]. But
>just 
>"syn" from the 3erd printf [3].
>
>In the conf file:
>
>#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>#define CONFIGURE_TICKS_PER_TIMESLICE       30 
>#define CONFIGURE_MAXIMUM_TIMERS              4
>
>
>Any suggestion?
>
>
>Cheers,
>
>Pablo
>
>
>-- 
>Martínez, Pablo Agustín 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20140915/4300fc52/attachment.html>


More information about the users mailing list