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