FreeRTOS SW Timers inaccurate

smurali wrote on Tuesday, January 09, 2018:

We have been using FreeRTOS SW timers all this while for periods ranging from 10ms to 1 minute.
Recently we added a timer for 5 minutes. This paritcular timer seems very inaccurate. It usually takes around 5 minutes 45 seconds to trigger the interrupt. Is there something that i am missing?

configTIMER_TASK_PRIORITY is 2

rtel wrote on Tuesday, January 09, 2018:

Is there something that i am missing?

Don’t know, as I don’t know what you have.

Which port are you using? Does the chip have a stable and accurate
clock? Or is it using a lower accuracy internal resonator? Have you
checked the accuracy of the clock and the tick frequency using a scope?
Are you setting the tick frequency to something that can be achieved
exactly, or are you using a slow low power clock and attempting a tick
frequency that can’t actually be achieved exactly (considering rounding
errors, etc.).

smurali wrote on Wednesday, January 10, 2018:

We are using a port with 64MHz CPU clock which is stable. The configTICK_RATE_HZ is set 1000

smurali wrote on Thursday, February 15, 2018:

Any updates?

heinbali01 wrote on Monday, February 19, 2018:

We are using a port with 64MHz CPU clock which is stable.
The configTICK_RATE_HZ is set 1000

Richard asked you a lot more. The information he’s asking for is necessary to make a correct diagnosis.

These were his questions:

  • Which port are you using?

Richard is asking what platform and CPU you are using ( and please be exact about this ).

  • Does the chip have a stable and accurate clock?
  • Or is it using a lower accuracy internal resonator?

The phrase “64MHz CPU clock which is stable” is not really convincing. Maybe the CPU gets 64 MHz, but oscillators are usually slower, like e.g. 8 or 12 MHz.
Can you tell what component is generating the clock? What are it properties?
Or does it run on an internal resonator?

  • Have you checked the accuracy of the clock and the tick frequency using a scope?

Did you?
I know that X-tals come in different qualities, just like resistors. Cheap resistors have a resistance of e.g. 22 K +/- 5%. The actual frequency of X-tals also varies from part to part.

  • Are you setting the tick frequency to something that can be achieved exactly?
  • Or are you using a slow low power clock and attempting a tick frequency that can’t actually be achieved exactly (considering rounding errors, etc.).

On some platforms and for some clocks, a frequency of exactly 1000 Hz can not be produced, at the best an approximation. You will have to check the reference of your CPU and look-up the timer that produces the FreeRTOS clock-tick. It has an input frequency ( which can be changed in some cases ), and it has a divisor. You will find a formula like:

    F-output = F-input / divisor

If the deviation can be explained and if is quite constant ( 5:45 in stead of 5:00 ), you may want to “calibrate” the clock and use a different frequency in your calculations ( E.g. 869 Hz ).