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 task APIs.
13  */
14 
15 #ifndef TRC_TASK_H
16 #define TRC_TASK_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_task_apis Trace Task APIs
28  * @ingroup trace_recorder_apis
29  * @{
30  */
31 
32 #ifndef TRC_CFG_ENABLE_STACK_MONITOR
33 #define TRC_CFG_ENABLE_STACK_MONITOR 0
34 #endif
35 
36 /**
37  * @internal Trace Task Data Structure
38  */
39 typedef struct TraceTaskData	/* Aligned */
40 {
41 	void* coreTasks[TRC_CFG_CORE_COUNT];
42 } TraceTaskData_t;
43 
44 extern TraceTaskData_t* pxTraceTaskData;
45 
46 /**
47  * @internal Initialize trace task system.
48  *
49  * @param[in] pxBuffer Pointer to memory that will be used by the
50  * trace task system.
51  *
52  * @retval TRC_FAIL Failure
53  * @retval TRC_SUCCESS Success
54  */
55 traceResult xTraceTaskInitialize(TraceTaskData_t* pxBuffer);
56 
57 /**
58  * @brief Register trace task in the trace.
59  *
60  * @param[in] pvTask Task.
61  * @param[in] szName Name.
62  * @param[in] uxPriority Priority.
63  * @param[out] pxTaskHandle Pointer to uninitialized trace task.
64  *
65  * @retval TRC_FAIL Failure
66  * @retval TRC_SUCCESS Success
67  */
68 #define xTraceTaskRegister(pvTask, szName, uxPriority, pxTaskHandle) ((((pvTask) != 0) && (xTraceObjectRegister(PSF_EVENT_TASK_CREATE, pvTask, szName, uxPriority, (TraceObjectHandle_t*)(pxTaskHandle)) == TRC_SUCCESS)) ? ((void)xTraceStackMonitorAdd(pvTask), TRC_SUCCESS) : TRC_FAIL)
69 
70 /**
71  * @brief Unregister trace task from trace.
72  *
73  * @param[in] xTaskHandle Pointer to initialized trace task.
74  * @param[in] uxPriority Priority.
75  *
76  * @retval TRC_FAIL Failure
77  * @retval TRC_SUCCESS Success
78  */
79 #define xTraceTaskUnregister(xTaskHandle, uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)xTraceStackMonitorRemove(xTraceEntryGetAddressReturn((TraceEntryHandle_t)(xTaskHandle))), xTraceObjectUnregister((TraceObjectHandle_t)(xTaskHandle), PSF_EVENT_TASK_DELETE, uxPriority))
80 
81 /**
82  * @brief Sets trace task name.
83  *
84  * @param[in] pvTask Task.
85  * @param[in] szName Name.
86  *
87  * @retval TRC_FAIL Failure
88  * @retval TRC_SUCCESS Success
89  */
90 #define xTraceTaskSetName xTraceObjectSetName
91 
92 /**
93  * @brief Sets trace task priority.
94  *
95  * @param[in] xTaskHandle Pointer to initialized trace task.
96  * @param[in] uxPriority Priority.
97  *
98  * @retval TRC_FAIL Failure
99  * @retval TRC_SUCCESS Success
100  */
101 traceResult xTraceTaskSetPriority(TraceTaskHandle_t xTaskHandle, TraceUnsignedBaseType_t uxPriority);
102 
103 /**
104  * @brief Registers trace task without trace task handle.
105  *
106  * @param[in] pvTask Task.
107  * @param[in] szName Name.
108  * @param[in] uxPriority Priority.
109  *
110  * @retval TRC_FAIL Failure
111  * @retval TRC_SUCCESS Success
112  */
113 #define xTraceTaskRegisterWithoutHandle(pvTask, szName, uxPriority) ((((pvTask) != 0) && (xTraceObjectRegisterWithoutHandle(PSF_EVENT_TASK_CREATE, pvTask, szName, uxPriority) == TRC_SUCCESS)) ? ((void)xTraceStackMonitorAdd(pvTask), TRC_SUCCESS) : TRC_FAIL)
114 
115 /**
116  * @brief Unregisters trace task without trace task handle.
117  *
118  * @param[in] pvTask Task.
119  * @param[in] uxPriority Priority.
120  *
121  * @retval TRC_FAIL Failure
122  * @retval TRC_SUCCESS Success
123  */
124 #define xTraceTaskUnregisterWithoutHandle(pvTask, uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)xTraceStackMonitorRemove(pvTask), xTraceObjectUnregisterWithoutHandle(PSF_EVENT_TASK_DELETE, pvTask, uxPriority))
125 
126 /**
127  * @brief Sets trace task name without trace task handle.
128  *
129  * @param[in] pvTask Task.
130  * @param[in] szName Name.
131  *
132  * @retval TRC_FAIL Failure
133  * @retval TRC_SUCCESS Success
134  */
135 #define xTraceTaskSetNameWithoutHandle xTraceObjectSetNameWithoutHandle
136 
137 /**
138  * @brief Sets trace task priority without trace task handle.
139  *
140  * @param[in] pvTask Task.
141  * @param[in] uxPriority Priority.
142  *
143  * @retval TRC_FAIL Failure
144  * @retval TRC_SUCCESS Success
145  */
146 traceResult xTraceTaskSetPriorityWithoutHandle(void* pvTask, TraceUnsignedBaseType_t uxPriority);
147 
148 /**
149  * @brief Registers trace task switch event.
150  *
151  * @param[in] pvTask Task.
152  * @param[in] uxPriority Priority.
153  *
154  * @retval TRC_FAIL Failure
155  * @retval TRC_SUCCESS Success
156  */
157 traceResult xTraceTaskSwitch(void* pvTask, TraceUnsignedBaseType_t uxPriority);
158 
159 #if (TRC_CFG_INCLUDE_READY_EVENTS == 1)
160 /**
161  * @brief Registers trace task ready event.
162  *
163  * @param[in] pvTask Task.
164  *
165  * @retval TRC_FAIL Failure
166  * @retval TRC_SUCCESS Success
167  */
168 #define xTraceTaskReady(pvTask) xTraceEventCreate1(PSF_EVENT_TASK_READY, (TraceUnsignedBaseType_t)(pvTask))
169 #else
170 #define xTraceTaskReady(p) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)p, TRC_SUCCESS)
171 #endif
172 
173 /**
174  * @brief Sets current trace task on current core.
175  *
176  * @param[in] pvTask Task.
177  *
178  * @retval TRC_FAIL Failure
179  * @retval TRC_SUCCESS Success
180  */
181 #define xTraceTaskSetCurrent(pvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(pxTraceTaskData->coreTasks[TRC_CFG_GET_CURRENT_CORE()] = (pvTask), TRC_SUCCESS)
182 
183 /**
184  * @brief Sets current trace task on specific core.
185  *
186  * @param[in] coreId Core id.
187  * @param[in] pvTask Task.
188  *
189  * @retval TRC_FAIL Failure
190  * @retval TRC_SUCCESS Success
191  */
192 #define xTraceTaskSetCurrentOnCore(coreId, pvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(pxTraceTaskData->coreTasks[coreId] = (pvTask), TRC_SUCCESS)
193 
194 /**
195  * @brief Gets current trace task on current core.
196  *
197  * @param[out] ppvTask Task.
198  *
199  * @retval TRC_FAIL Failure
200  * @retval TRC_SUCCESS Success
201  */
202 #define xTraceTaskGetCurrent(ppvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(ppvTask) = pxTraceTaskData->coreTasks[TRC_CFG_GET_CURRENT_CORE()], TRC_SUCCESS)
203 
204 /**
205  * @brief Gets current trace task on specific core.
206  *
207  * @param[in] coreId Core id.
208  * @param[out] ppvTask Task.
209  *
210  * @retval TRC_FAIL Failure
211  * @retval TRC_SUCCESS Success
212  */
213 #define xTraceTaskGetCurrentOnCore(coreId, ppvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(ppvTask) = pxTraceTaskData->coreTasks[coreId], TRC_SUCCESS)
214 
215  /**
216   * @brief Returns current trace task.
217   *
218   * @returns Current trace task.
219   */
220 #define xTraceTaskGetCurrentReturn() (pxTraceTaskData->coreTasks[TRC_CFG_GET_CURRENT_CORE()])
221 
222 /**
223  * @brief Registers trace task instance finished event.
224  *
225  * This routine creates a trace event that ends the current task instance at
226  * this very instant. This makes the viewer split the current fragment at
227  * this point and begin a new actor instance, even if no task-switch has
228  * occurred
229  *
230  * @retval TRC_FAIL Failure
231  * @retval TRC_SUCCESS Success
232  */
233 #define xTraceTaskInstanceFinishedNow() xTraceEventCreate0(PSF_EVENT_IFE_DIRECT)
234 
235 /**
236  * @brief Marks the current trace task instance as finished on the next
237  * kernel call.
238  *
239  * If that kernel call is blocking, the instance ends after the blocking event
240  * and the corresponding return event is then the start of the next instance.
241  * If the kernel call is not blocking, the viewer instead splits the current
242  * fragment right before the kernel call, which makes this call the first event
243  * of the next instance.
244  *
245  * @retval TRC_FAIL Failure
246  * @retval TRC_SUCCESS Success
247  */
248 #define xTraceTaskInstanceFinishedNext() xTraceEventCreate0(PSF_EVENT_IFE_NEXT)
249 
250 /** @} */
251 
252 #ifdef __cplusplus
253 }
254 #endif
255 
256 #else
257 
258 #define xTraceTaskRegister(__pvTask, ___szName, __uxPriority, __pxTaskHandle) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_5((void)(__pvTask), (void)(__szName), (void)(__uxPriority), (void)(__pxTaskHandle), TRC_SUCCESS)
259 
260 #define xTraceTaskUnregister(__xTaskHandle, __uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__xTaskHandle), (void)(__uxPriority), TRC_SUCCESS)
261 
262 #define xTraceTaskSetName(__xTaskHandle, __szName) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__xTaskHandle), (void)(__szName), TRC_SUCCESS)
263 
264 #define xTraceTaskSetPriority(__xTaskHandle, __uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__xTaskHandle), (void)(__uxPriority), TRC_SUCCESS)
265 
266 #define xTraceTaskRegisterWithoutHandle(__pvTask, __szName, __uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4((void)(__pvTask), (void)(__szName), (void)(__uxPriority), TRC_SUCCESS)
267 
268 #define xTraceTaskUnregisterWithoutHandle(__pvTask, __uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__pvTask), (void)(__uxPriority), TRC_SUCCESS)
269 
270 #define xTraceTaskSetNameWithoutHandle(__pvTask, __szName) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__pvTask), (void)(__szName), TRC_SUCCESS)
271 
272 #define xTraceTaskSetPriorityWithoutHandle(__pvTask, __uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__pvTask), (void)(__uxPriority), TRC_SUCCESS)
273 
274 #define xTraceTaskSwitch(__pvTask, __uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__pvTask), (void)(__uxPriority), TRC_SUCCESS)
275 
276 #define xTraceTaskReady(__pvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)(__pvTask), TRC_SUCCESS)
277 
278 #define xTraceTaskSetCurrent(__pvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)(__pvTask), TRC_SUCCESS)
279 
280 #define xTraceTaskSetCurrentOnCore(__coreId, __pvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__coreId), (void)(__pvTask), TRC_SUCCESS)
281 
282 #define xTraceTaskGetCurrent(__ppvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)(__ppvTask), TRC_SUCCESS)
283 
284 #define xTraceTaskGetCurrentOnCore(__coreId, __ppvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3((void)(__coreId), (void)(__ppvTask), TRC_SUCCESS)
285 
286 #define xTraceTaskGetCurrentReturn() (0)
287 
288 #define xTraceTaskInstanceFinishedNow() (TRC_SUCCESS)
289 
290 #define xTraceTaskInstanceFinishedNext() (TRC_SUCCESS)
291 
292 #endif
293 
294 #endif
295