/*******************************************************************************\r
- * Tracealyzer v2.4.1 Recorder Library\r
+ * Tracealyzer v2.5.0 Recorder Library\r
* Percepio AB, www.percepio.com\r
*\r
* trcBase.c\r
/* Keeps track of available handles */\r
objectHandleStackType objectHandleStacks = { { 0 }, { 0 }, { 0 }, { 0 }, { 0 } };\r
\r
+uint32_t init_hwtc_count;\r
+\r
/*******************************************************************************\r
* RecorderData\r
*\r
/* This version of the function dynamically allocates the trace data */\r
void prvTraceInitTraceData()\r
{\r
+ init_hwtc_count = HWTC_COUNT;\r
+ \r
#if TRACE_DATA_ALLOCATION == TRACE_DATA_ALLOCATION_STATIC\r
RecorderDataPtr = &RecorderData;\r
#elif TRACE_DATA_ALLOCATION == TRACE_DATA_ALLOCATION_DYNAMIC\r
TRACE_ASSERT(objectclass < TRACE_NCLASSES, "uiIndexOfObject: Invalid value for objectclass", 0);\r
TRACE_ASSERT(objecthandle > 0 && objecthandle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "uiIndexOfObject: Invalid value for objecthandle", 0);\r
\r
- if ((objectclass < TRACE_NCLASSES) && (objecthandle > 0) && (objecthandle <=\r
- RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass]))\r
+ if ((objectclass < TRACE_NCLASSES) && (objecthandle > 0) && (objecthandle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass]))\r
{\r
- return (uint16_t)(RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[objectclass] +\r
- (RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[objectclass] * (objecthandle-1)));\r
+ return (uint16_t)(RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[objectclass] + (RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[objectclass] * (objecthandle-1)));\r
}\r
\r
vTraceError("Object table lookup with invalid object handle or object class!");\r
\r
TRACE_ASSERT(param_maxDTS == 0xFF || param_maxDTS == 0xFFFF, "prvTraceGetDTS: Invalid value for param_maxDTS", 0);\r
\r
- if (RecorderDataPtr->frequency == 0)\r
+ if (RecorderDataPtr->frequency == 0 && init_hwtc_count != HWTC_COUNT)\r
{\r
/* If HWTC_PERIOD is mapped to the timer reload register,\r
such as in the Cortex M port, it might not be initialized\r
before the Kernel scheduler has been started has been\r
- started. We therefore store the frequency of the timer at\r
- the first timestamped event after the scheduler has started.\r
- (Note that this function is called also by vTraceStart and\r
- uiTraceStart, which might be called before the scheduler\r
- has been started.) */\r
+ started. We therefore store the frequency of the timer\r
+ once the counter register has changed. */\r
\r
#if (SELECTED_PORT == PORT_Win32)\r
RecorderDataPtr->frequency = 100000;\r
#elif (SELECTED_PORT == PORT_HWIndependent)\r
RecorderDataPtr->frequency = TRACE_TICK_RATE_HZ;\r
#else\r
- RecorderDataPtr->frequency = TRACE_CPU_CLOCK_HZ / (uint32_t)HWTC_DIVISOR;\r
+ RecorderDataPtr->frequency = (HWTC_PERIOD * TRACE_TICK_RATE_HZ) / (uint32_t)HWTC_DIVISOR;\r
#endif\r
}\r
\r