xTaskGetTickCount during ISR
I am working with the MSP430 port and have a problem with the xTaskGetTickCount() function.
I want to measure a time between two edges and call the function xTaskGetTickCount() to get the actual time. If I do this from a Interrupt Service Routine the system is not working. Below is the function from the file task.c listed.
portTickType xTaskGetTickCount( void )
{
portTickType xTicks;
/* Critical section required if running on a 16 bit processor. */
taskENTER_CRITICAL();
{
xTicks = xTickCount;
}
taskEXIT_CRITICAL();
return xTicks;
}
If I comment out taskENTER_CRITICAL() and taskEXIT_CRITICAL() all works fine.
Is the comment with 16 bit processor always correct ?
I think, this comment and the functions are only necessary, if:
- running on a 8 bit processor
or
- running on a 16 bit processor with configUSE_16_BIT_TICKS 0
Klaus
xTaskGetTickCount during ISR
Your assumption is correct. The comment is a bit historical. As long as read access to the variable is atomic then you don’t need the critical section. From within an ISR you definitely should not use a critical section.
You could provide another function xTaskGetTickCountFromISR() which does the same without the critical section to be totally sure.
Regards.