Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

timer or while-loop is the question

Asked by per isakson on 8 Mar 2013

It is possible to emulate a simple timer with a while-loop as I outline below.

The timer object causes me trouble and now I think a construct based on a while-loop would serve better in my specific case. I need a timer that runs "forever" and invokes a "callback function" every few seconds. It should be able to recover after run-time errors in the "callback function".

Reasons to use a while-loop:

Reasons to use the timer:

  • "The advantage of the timer is it allows you to do something else while the timer is waiting giving you the appearance of multi-threading." copied from Daniels answer.
  • better control over when callbacks are fired (see Daniels answer)
  • less and more readable code

Have I missed something important?

.

Out-line of simple "timer" based on a while-loop

    period          = 1;
    tasks2execute   = 1;
    TasksToExecute  = 3;
    start_delay     = 0;
    pause( start_delay )
    while tasks2execute <= TasksToExecute 
        try 
            timer_function( ... ) 
        catch me
            disp( 'cleanup' )
        end
        pause( period )
        tasks2execute = tasks2execute + 1; 
    end

.

and my timer construct; "my specific case" (added 2013-02-09)

    tmr = timer('Name'          , 'my_timer'        ...
            ,   'TimerFcn'      , @timer_function   ...
            ,   'BusyMode'      , 'drop'            ...
            ,   'ExecutionMode' , 'fixedDelay'      ...
            ,   'Period'        ,  1                ...
            ,   'StartDelay'    ,  1                ...     
            ,   'TasksToExecute',  999999           ...
            ); 
    start( tmr )
    wait ( tmr )

0 Comments

per isakson

Products

No products are associated with this question.

1 Answer

Answer by Daniel on 9 Mar 2013
Edited by Daniel on 9 Mar 2013
Accepted answer

I think your reasons to use a timer are wrong. Since timers are running in an alternate thread they don't always fire when they should. A loop can only be interrupted when you say it can. This means you can block out interrupts 100ms before the callback and be pretty much guaranteed the callback fires when it should. As for less code you could write a timerloop function so you would only have 1 line of code.

The advantage of the timer is it allows you to do something else while the timer is waiting giving you the appearance of multi threading. Imagine a GUI stop watch that updated every second. From the commandline you might type start(stopwatch). If you used a timer it would return instantly. With a timer loop it would never return.

I personally find Timer object useless for anything requiring better than 10s accuracy.

5 Comments

per isakson on 9 Mar 2013

Walter, I made a little test:

  • R2012a 64bit
  • commented out wait(tmr)
  • set 'BusyMode','queue'
  • started my timer-construct
  • started while true, a=17^17; b=1; c=1; end in the command window
  • observed Windows Task Manger

The while-loop blocked the execution of timer_function completely. Cntrl+C halted the while-loop and timer_function started to execute.

Next, I repeated the test with a different while-loop: while true, a=17^17; b=1; c=1; pause(0.2); end. This time, timer_function run as expected.

per isakson on 9 Mar 2013

Daniel,

I did not honor KISS and have paid for that. However, I learned something.

TMW ought to add your sentence, "The advantage of the timer ...", to the documentation. They typically provide tools without discussing, for which tasks they are appropriate.

The try-catch-wrapper for timer_function, which you proposed, is really helpful when debugging.

Thanks, Per

Daniel on 10 Mar 2013

Per, some discussion about when timers can fire, and links to documentation can be found in this old question (although the documentation appears to be wrong). I will follow this up with a new question.

Daniel

Contact us