1 /* 2 * Trace Recorder for Tracealyzer v4.8.1.hotfix1 3 * Copyright 2023 Percepio AB 4 * www.percepio.com 5 * 6 * SPDX-License-Identifier: Apache-2.0 7 * 8 * The implementation of timestamps. 9 */ 10 11 #include <trcRecorder.h> 12 13 #if (TRC_USE_TRACEALYZER_RECORDER == 1) 14 15 #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) 16 17 TraceTimestampData_t *pxTraceTimestamp TRC_CFG_RECORDER_DATA_ATTRIBUTE; 18 xTraceTimestampInitialize(TraceTimestampData_t * pxBuffer)19traceResult xTraceTimestampInitialize(TraceTimestampData_t *pxBuffer) 20 { 21 /* This should never fail */ 22 TRC_ASSERT(pxBuffer != (void*)0); 23 24 pxTraceTimestamp = pxBuffer; 25 26 /* These will be set when tracing is enabled */ 27 pxTraceTimestamp->frequency = 0u; 28 pxTraceTimestamp->period = 0u; 29 30 pxTraceTimestamp->osTickHz = TRC_TICK_RATE_HZ; 31 pxTraceTimestamp->osTickCount = 0u; 32 pxTraceTimestamp->wraparounds = 0u; 33 pxTraceTimestamp->type = TRC_HWTC_TYPE; 34 35 #if (TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_INCR || TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_INCR) 36 pxTraceTimestamp->latestTimestamp = 0u; 37 #elif (TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_DECR || TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_DECR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR) 38 pxTraceTimestamp->latestTimestamp = pxTraceTimestamp->period - 1u; 39 #endif 40 41 xTraceSetComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP); 42 43 return TRC_SUCCESS; 44 } 45 46 #if ((TRC_CFG_USE_TRACE_ASSERT) == 1) 47 xTraceTimestampGet(uint32_t * puiTimestamp)48traceResult xTraceTimestampGet(uint32_t *puiTimestamp) 49 { 50 /* This should never fail */ 51 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 52 53 /* This should never fail */ 54 TRC_ASSERT(puiTimestamp != (void*)0); 55 56 switch (pxTraceTimestamp->type) 57 { 58 case TRC_FREE_RUNNING_32BIT_INCR: 59 case TRC_CUSTOM_TIMER_INCR: 60 *puiTimestamp = (uint32_t)(TRC_HWTC_COUNT); 61 if (*puiTimestamp < pxTraceTimestamp->latestTimestamp) 62 { 63 pxTraceTimestamp->wraparounds++; 64 } 65 break; 66 case TRC_FREE_RUNNING_32BIT_DECR: 67 case TRC_CUSTOM_TIMER_DECR: 68 *puiTimestamp = (uint32_t)(TRC_HWTC_COUNT); 69 if (*puiTimestamp > pxTraceTimestamp->latestTimestamp) 70 { 71 pxTraceTimestamp->wraparounds++; 72 } 73 break; 74 case TRC_OS_TIMER_INCR: 75 case TRC_OS_TIMER_DECR: 76 *puiTimestamp = (((uint32_t)(TRC_HWTC_COUNT)) & 0x00FFFFFFUL) + ((pxTraceTimestamp->osTickCount & 0x000000FFUL) << 24); 77 pxTraceTimestamp->wraparounds = pxTraceTimestamp->osTickCount; 78 break; 79 default: 80 return TRC_FAIL; 81 break; 82 } 83 84 pxTraceTimestamp->latestTimestamp = *puiTimestamp; 85 86 return TRC_SUCCESS; 87 } 88 xTraceTimestampGetWraparounds(uint32_t * puiTimerWraparounds)89traceResult xTraceTimestampGetWraparounds(uint32_t* puiTimerWraparounds) 90 { 91 /* This should never fail */ 92 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 93 94 /* This should never fail */ 95 TRC_ASSERT(puiTimerWraparounds != (void*)0); 96 97 *puiTimerWraparounds = pxTraceTimestamp->wraparounds; 98 99 return TRC_SUCCESS; 100 } 101 xTraceTimestampSetFrequency(TraceUnsignedBaseType_t uxFrequency)102traceResult xTraceTimestampSetFrequency(TraceUnsignedBaseType_t uxFrequency) 103 { 104 /* This should never fail */ 105 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 106 107 pxTraceTimestamp->frequency = uxFrequency; 108 109 return TRC_SUCCESS; 110 } 111 xTraceTimestampSetPeriod(uint32_t uiPeriod)112traceResult xTraceTimestampSetPeriod(uint32_t uiPeriod) 113 { 114 /* This should never fail */ 115 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 116 117 pxTraceTimestamp->period = uiPeriod; 118 119 return TRC_SUCCESS; 120 } 121 xTraceTimestampSetOsTickCount(uint32_t uiOsTickCount)122traceResult xTraceTimestampSetOsTickCount(uint32_t uiOsTickCount) 123 { 124 /* This should never fail */ 125 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 126 127 pxTraceTimestamp->osTickCount = uiOsTickCount; 128 129 return TRC_SUCCESS; 130 } 131 xTraceTimestampGetFrequency(TraceUnsignedBaseType_t * puxFrequency)132traceResult xTraceTimestampGetFrequency(TraceUnsignedBaseType_t *puxFrequency) 133 { 134 /* This should never fail */ 135 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 136 137 /* This should never fail */ 138 TRC_ASSERT(puxFrequency != (void*)0); 139 140 *puxFrequency = pxTraceTimestamp->frequency; 141 142 return TRC_SUCCESS; 143 } 144 xTraceTimestampGetPeriod(uint32_t * puiPeriod)145traceResult xTraceTimestampGetPeriod(uint32_t *puiPeriod) 146 { 147 /* This should never fail */ 148 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 149 150 /* This should never fail */ 151 TRC_ASSERT(puiPeriod != (void*)0); 152 153 *puiPeriod = pxTraceTimestamp->period; 154 155 return TRC_SUCCESS; 156 } 157 xTraceTimestampGetOsTickCount(uint32_t * puiOsTickCount)158traceResult xTraceTimestampGetOsTickCount(uint32_t* puiOsTickCount) 159 { 160 /* This should never fail */ 161 TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_TIMESTAMP)); 162 163 /* This should never fail */ 164 TRC_ASSERT(puiOsTickCount != (void*)0); 165 166 *puiOsTickCount = pxTraceTimestamp->osTickCount; 167 168 return TRC_SUCCESS; 169 } 170 171 #endif /* ((TRC_CFG_USE_TRACE_ASSERT) == 1) */ 172 173 #endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */ 174 175 #endif /* (TRC_USE_TRACEALYZER_RECORDER == 1) */ 176