1 /* 2 * Percepio Trace Recorder for Tracealyzer v4.10.3 3 * Copyright 2023 Percepio AB 4 * www.percepio.com 5 * 6 * SPDX-License-Identifier: Apache-2.0 7 */ 8 9 /** 10 * @file 11 * 12 * @brief Public trace timestamp APIs. 13 */ 14 15 #ifndef TRC_TIMESTAMP_H 16 #define TRC_TIMESTAMP_H 17 18 #if (TRC_USE_TRACEALYZER_RECORDER == 1) && (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) 19 20 #include <trcTypes.h> 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 /** 27 * @defgroup trace_timestamp_apis Trace Timestamp APIs 28 * @ingroup trace_recorder_apis 29 * @{ 30 */ 31 32 /** 33 * @brief Trace Timestamp Structure 34 */ 35 typedef struct TraceTimestampData /* Aligned */ 36 { 37 uint32_t type; /**< Timer type (direction) */ 38 uint32_t period; /**< Timer Period */ 39 TraceUnsignedBaseType_t frequency; /**< Timer Frequency */ 40 uint32_t wraparounds; /**< Nr of timer wraparounds */ 41 uint32_t osTickHz; /**< RTOS tick frequency */ 42 uint32_t latestTimestamp; /**< Latest timestamp */ 43 uint32_t osTickCount; /**< RTOS tick count */ 44 } TraceTimestampData_t; 45 46 extern TraceTimestampData_t* pxTraceTimestamp; 47 48 /** 49 * @internal Initialize trace timestamp system. 50 * 51 * @param[in] pxBuffer Pointer to memory that will be used by the 52 * trace timestamp system. 53 * 54 * @retval TRC_FAIL Failure 55 * @retval TRC_SUCCESS Success 56 */ 57 traceResult xTraceTimestampInitialize(TraceTimestampData_t *pxBuffer); 58 59 #if ((TRC_CFG_USE_TRACE_ASSERT) == 1) 60 61 /** 62 * @brief Gets current trace timestamp. 63 * 64 * @param[out] puiTimestamp Timestamp. 65 * 66 * @retval TRC_FAIL Failure 67 * @retval TRC_SUCCESS Success 68 */ 69 traceResult xTraceTimestampGet(uint32_t* puiTimestamp); 70 71 /** 72 * @brief Gets trace timestamp wraparounds. 73 * 74 * @param[out] puiTimerWraparounds Timer wraparounds. 75 * 76 * @retval TRC_FAIL Failure 77 * @retval TRC_SUCCESS Success 78 */ 79 traceResult xTraceTimestampGetWraparounds(uint32_t* puiTimerWraparounds); 80 81 /** 82 * @brief Sets trace timestamp frequency. 83 * 84 * @param[in] uxFrequency Frequency. 85 * 86 * @retval TRC_FAIL Failure 87 * @retval TRC_SUCCESS Success 88 */ 89 traceResult xTraceTimestampSetFrequency(TraceUnsignedBaseType_t uxFrequency); 90 91 /** 92 * @brief Gets trace timestamp frequency. 93 * 94 * @param[out] puxFrequency Frequency. 95 * 96 * @retval TRC_FAIL Failure 97 * @retval TRC_SUCCESS Success 98 */ 99 traceResult xTraceTimestampGetFrequency(TraceUnsignedBaseType_t* puxFrequency); 100 101 /** 102 * @brief Sets trace timestamp period. 103 * 104 * @param[in] uiPeriod Period. 105 * 106 * @retval TRC_FAIL Failure 107 * @retval TRC_SUCCESS Success 108 */ 109 traceResult xTraceTimestampSetPeriod(uint32_t uiPeriod); 110 111 /** 112 * @brief Gets trace timestamp period. 113 * 114 * @param[out] puiPeriod Period. 115 * 116 * @retval TRC_FAIL Failure 117 * @retval TRC_SUCCESS Success 118 */ 119 traceResult xTraceTimestampGetPeriod(uint32_t* puiPeriod); 120 121 /** 122 * @brief Sets trace timestamp OS tick count. 123 * 124 * @param[in] uiOsTickCount OS tick count. 125 * 126 * @retval TRC_FAIL Failure 127 * @retval TRC_SUCCESS Success 128 */ 129 traceResult xTraceTimestampSetOsTickCount(uint32_t uiOsTickCount); 130 131 /** 132 * @brief Gets trace timestamp OS tick count. 133 * 134 * @param[in] puiOsTickCount 135 * 136 * @retval TRC_FAIL Failure 137 * @retval TRC_SUCCESS Success 138 */ 139 traceResult xTraceTimestampGetOsTickCount(uint32_t *puiOsTickCount); 140 141 #else /* ((TRC_CFG_USE_TRACE_ASSERT) == 1) */ 142 143 /** 144 * @brief Gets current trace timestamp. 145 * 146 * @param[out] puiTimestamp Timestamp. 147 * 148 * @retval TRC_FAIL Failure 149 * @retval TRC_SUCCESS Success 150 */ 151 #if ((TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_INCR) || (TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_INCR)) 152 #define xTraceTimestampGet(puiTimestamp) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4(*(puiTimestamp) = TRC_HWTC_COUNT, (*(puiTimestamp) < pxTraceTimestamp->latestTimestamp) ? pxTraceTimestamp->wraparounds++ : 0, pxTraceTimestamp->latestTimestamp = *(puiTimestamp), TRC_SUCCESS) 153 #elif ((TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_DECR) || (TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_DECR)) 154 #define xTraceTimestampGet(puiTimestamp) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4(*(puiTimestamp) = TRC_HWTC_COUNT, (*(puiTimestamp) > pxTraceTimestamp->latestTimestamp) ? pxTraceTimestamp->wraparounds++ : 0, pxTraceTimestamp->latestTimestamp = *(puiTimestamp), TRC_SUCCESS) 155 #elif ((TRC_HWTC_TYPE == TRC_OS_TIMER_INCR) || (TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)) 156 #define xTraceTimestampGet(puiTimestamp) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4(*(puiTimestamp) = ((TRC_HWTC_COUNT) & 0x00FFFFFFU) + ((pxTraceTimestamp->osTickCount & 0x000000FFU) << 24), pxTraceTimestamp->wraparounds = pxTraceTimestamp->osTickCount, pxTraceTimestamp->latestTimestamp = *(puiTimestamp), TRC_SUCCESS) 157 #endif 158 159 /** 160 * @brief Gets trace timestamp wraparounds. 161 * 162 * @param[out] puiTimerWraparounds Timer wraparounds. 163 * 164 * @retval TRC_FAIL Failure 165 * @retval TRC_SUCCESS Success 166 */ 167 #define xTraceTimestampGetWraparounds(puiTimerWraparounds) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(puiTimerWraparounds) = pxTraceTimestamp->wraparounds, TRC_SUCCESS) 168 169 /** 170 * @brief Sets trace timestamp frequency. 171 * 172 * @param[in] uxFrequency Frequency. 173 * 174 * @retval TRC_FAIL Failure 175 * @retval TRC_SUCCESS Success 176 */ 177 #define xTraceTimestampSetFrequency(uxFrequency) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(pxTraceTimestamp->frequency = uxFrequency, TRC_SUCCESS) 178 179 /** 180 * @brief Sets trace timestamp period. 181 * 182 * @param[in] uiPeriod Period. 183 * 184 * @retval TRC_FAIL Failure 185 * @retval TRC_SUCCESS Success 186 */ 187 #define xTraceTimestampSetPeriod(uiPeriod) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(pxTraceTimestamp->period = uiPeriod, TRC_SUCCESS) 188 189 /** 190 * @brief Sets trace timestamp OS tick count. 191 * 192 * @param[in] uiOsTickCount OS tick count. 193 * 194 * @retval TRC_FAIL Failure 195 * @retval TRC_SUCCESS Success 196 */ 197 #define xTraceTimestampSetOsTickCount(uiOsTickCount) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(pxTraceTimestamp->osTickCount = uiOsTickCount, TRC_SUCCESS) 198 199 /** 200 * @brief Gets trace timestamp frequency. 201 * 202 * @param[out] puxFrequency Frequency. 203 * 204 * @retval TRC_FAIL Failure 205 * @retval TRC_SUCCESS Success 206 */ 207 #define xTraceTimestampGetFrequency(puxFrequency) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(puxFrequency) = pxTraceTimestamp->frequency, TRC_SUCCESS) 208 209 /** 210 * @brief Gets trace timestamp period. 211 * 212 * @param[out] puiPeriod Period. 213 * 214 * @retval TRC_FAIL Failure 215 * @retval TRC_SUCCESS Success 216 */ 217 #define xTraceTimestampGetPeriod(puiPeriod) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(puiPeriod) = pxTraceTimestamp->period, TRC_SUCCESS) 218 219 /** 220 * @brief Gets trace timestamp OS tick count. 221 * 222 * @param[in] puiOsTickCount 223 * 224 * @retval TRC_FAIL Failure 225 * @retval TRC_SUCCESS Success 226 */ 227 #define xTraceTimestampGetOsTickCount(puiOsTickCount) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(puiOsTickCount) = pxTraceTimestamp->osTickCount, TRC_SUCCESS) 228 229 #endif /* ((TRC_CFG_USE_TRACE_ASSERT) == 1) */ 230 231 /** @} */ 232 233 #ifdef __cplusplus 234 } 235 #endif 236 237 #endif 238 239 #endif 240