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?
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.).
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 ).