/* * Percepio Trace Recorder for Tracealyzer v4.6.0 * Copyright 2021 Percepio AB * www.percepio.com * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * * @brief Public trace task APIs. */ #ifndef TRC_TASK_H #define TRC_TASK_H #if (TRC_USE_TRACEALYZER_RECORDER == 1) #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) #include #ifdef __cplusplus extern "C" { #endif /** * @defgroup trace_task_apis Trace Task APIs * @ingroup trace_recorder_apis * @{ */ #ifndef TRC_CFG_ENABLE_STACK_MONITOR #define TRC_CFG_ENABLE_STACK_MONITOR 0 #endif /** * @internal Trace Task Info Structure */ typedef struct TraceTaskInfo { void* coreTasks[TRC_CFG_CORE_COUNT]; } TraceTaskInfo_t; extern TraceTaskInfo_t* pxTraceTaskInfo; #define TRACE_TASK_INFO_BUFFER_SIZE (sizeof(TraceTaskInfo_t)) /** * @internal Trace Task Info Buffer Structure */ typedef struct TraceTaskInfoBuffer { uint8_t buffer[TRACE_TASK_INFO_BUFFER_SIZE]; } TraceTaskInfoBuffer_t; /** * @internal Initialize trace task system. * * @param[in] pxBuffer Pointer to memory that will be used by the * trace task system. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskInitialize(TraceTaskInfoBuffer_t* pxBuffer); /** * @brief Register trace task in the trace. * * @param[in] pvTask Task. * @param[in] szName Name. * @param[in] uxPriority Priority. * @param[out] pxTaskHandle Pointer to uninitialized trace task. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskRegister(pvTask, szName, uxPriority, pxTaskHandle) ((((pvTask) != 0) && (xTraceObjectRegister(PSF_EVENT_TASK_CREATE, pvTask, szName, uxPriority, (TraceObjectHandle_t*)(pxTaskHandle)) == TRC_SUCCESS)) ? (xTraceStackMonitorAdd(pvTask), TRC_SUCCESS) : TRC_FAIL) /** * @brief Unregister trace task from trace. * * @param[in] xTaskHandle Pointer to initialized trace task. * @param[in] uxPriority Priority. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskUnregister(TraceTaskHandle_t xTaskHandle, TraceUnsignedBaseType_t uxPriority); /** * @brief Sets trace task name. * * @param[in] pvTask Task. * @param[in] szName Name. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskSetName xTraceObjectSetName /** * @brief Sets trace task priority. * * @param[in] xTaskHandle Pointer to initialized trace task. * @param[in] uxPriority Priority. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskSetPriority(TraceTaskHandle_t xTaskHandle, TraceUnsignedBaseType_t uxPriority); /** * @brief Registers trace task without trace task handle. * * @param[in] pvTask Task. * @param[in] szName Name. * @param[in] uxPriority Priority. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskRegisterWithoutHandle(pvTask, szName, uxPriority) ((((pvTask) != 0) && (xTraceObjectRegisterWithoutHandle(PSF_EVENT_TASK_CREATE, pvTask, szName, uxPriority) == TRC_SUCCESS)) ? (xTraceStackMonitorAdd(pvTask), TRC_SUCCESS) : TRC_FAIL) /** * @brief Unregisters trace task without trace task handle. * * @param[in] pvTask Task. * @param[in] uxPriority Priority. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskUnregisterWithoutHandle(pvTask, uxPriority) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(xTraceStackMonitorRemove(pvTask), xTraceObjectUnregisterWithoutHandle(PSF_EVENT_TASK_DELETE, pvTask, uxPriority)) /** * @brief Sets trace task name without trace task handle. * * @param[in] pvTask Task. * @param[in] szName Name. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskSetNameWithoutHandle xTraceObjectSetNameWithoutHandle /** * @brief Sets trace task priority without trace task handle. * * @param[in] pvTask Task. * @param[in] uxPriority Priority. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskSetPriorityWithoutHandle(void* pvTask, TraceUnsignedBaseType_t uxPriority); /** * @brief Registers trace task switch event. * * @param[in] pvTask Task. * @param[in] uxPriority Priority. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskSwitch(void* pvTask, TraceUnsignedBaseType_t uxPriority); #if (TRC_CFG_INCLUDE_READY_EVENTS == 1) /** * @brief Registers trace task ready event. * * @param[in] pvTask Task. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskReady(void* pvTask); #else #define xTraceTaskReady(p) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2((void)p, TRC_SUCCESS) #endif /** * @brief Sets current trace task. * * @param[in] pvTask Task. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskSetCurrent(pvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(pxTraceTaskInfo->coreTasks[TRC_CFG_GET_CURRENT_CORE()] = (pvTask), TRC_SUCCESS) /** * @brief Gets current trace task. * * @param[out] ppvTask Task. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ #define xTraceTaskGetCurrent(ppvTask) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(ppvTask) = pxTraceTaskInfo->coreTasks[TRC_CFG_GET_CURRENT_CORE()], TRC_SUCCESS) /** * @brief Registers trace task instance finished event. * * This routine creates a trace event that ends the current task instance at * this very instant. This makes the viewer split the current fragment at * this point and begin a new actor instance, even if no task-switch has * occurred * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskInstanceFinishedNow(void); /** * @brief Marks the current trace task instance as finished on the next * kernel call. * * If that kernel call is blocking, the instance ends after the blocking event * and the corresponding return event is then the start of the next instance. * If the kernel call is not blocking, the viewer instead splits the current * fragment right before the kernel call, which makes this call the first event * of the next instance. * * @retval TRC_FAIL Failure * @retval TRC_SUCCESS Success */ traceResult xTraceTaskInstanceFinishedNext(void); /** @} */ #ifdef __cplusplus } #endif #endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */ #endif /* (TRC_USE_TRACEALYZER_RECORDER == 1) */ #endif /* TRC_TASK_H */