Accurate time with a timer possible?

anonymous wrote on Friday, January 27, 2012:

I am running a dsPIC33F at 36.864 MIPS (crystal controlled.) I would like to keep accurate time down to the second.

I thought about using a FreeRTOS software timer; so I made a basic implementation:

#define CLOCK_TICK_RES  40
void vTickClock()
{
	pre_tick_clock(CLOCK_TICK_RES);
}
int main()
{
    xTimerStart(xTimerCreate("sysclk", (1000 / CLOCK_TICK_RES) / portTICK_RATE_MS, pdTRUE, 0, vTickClock), portMAX_DELAY);
    vTaskStartScheduler();
    while(1);
    return 0;
}

pre_tick_clock just ticks the clock by the required 25ms. I would expect the function to be called every 1000ms / 40 Hz = 25 ms, but it isn’t. It’s called around every 23.91ms, which means it gains a considerable amount of time per second.

Is it just that the software timers are not supposed to be used for precise time keeping or am I missing something?

Thank you

anonymous wrote on Friday, January 27, 2012:

Oh! I feel like an idiot. The timer duration needs to be a multiple of the system clock time, right? Changed that and it’s keeping much better time.

anonymous wrote on Friday, January 27, 2012:

*system clock time = RTOS tick time

davedoors wrote on Friday, January 27, 2012:

Provided your tick frequency is below 1KHz (which it should be), you can set a timer to execute ever second by giving it a period of (1000/portTICK_RATE_MS) where 1000 is the number of milliseconds in a second, and portTICK_RATE_MS is the tick rate specified in milliseconds. portTICK_RATE_MS is defined by FreeRTOS already.