/******************************************************************************* * vTraceEnable * * Function that enables the tracing and creates the control task. It will halt * execution until a Start command has been received if haltUntilStart is true. * ******************************************************************************/ void vTraceEnable(int startOption) { int bytes = 0; extern uint32_t RecorderEnabled; TracealyzerCommandType msg; TRC_STREAM_PORT_INIT(); if (startOption == TRC_START_AWAIT_HOST) { /* We keep trying to read commands until the recorder has been started */ do { bytes = 0; TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), &bytes); if (bytes == sizeof(TracealyzerCommandType)) { if (prvIsValidCommand(&msg)) { if (msg.cmdCode == CMD_SET_ACTIVE && msg.param1 == 1) { /* On start, init and reset the timestamping */ TRC_PORT_SPECIFIC_INIT(); } prvProcessCommand(&msg); } } } while (RecorderEnabled == 0); } else if (startOption == TRC_START) { /* We start streaming directly - this assumes that the interface is ready! */ msg.cmdCode = CMD_SET_ACTIVE; msg.param1 = 1; prvProcessCommand(&msg); } else { /* Start commands will be processed by the TzCtrl task. */ TRC_PORT_SPECIFIC_INIT(); } trcWarningChannel = xTraceRegisterString("Warnings from Recorder"); /* Creates the TzCtrl task - receives trace commands (start, stop, ...) */ #if (configSUPPORT_STATIC_ALLOCATION == 1) HandleTzCtrl = xTaskCreateStatic(TzCtrl, "TzCtrl", TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, stackTzCtrl, &tcbTzCtrl); (void)HandleTzCtrl; #else xTaskCreate( TzCtrl, "TzCtrl", TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, &HandleTzCtrl ); #endif }
/******************************************************************************* * TzCtrl * * Task for receiving commands from Tracealyzer and for recorder diagnostics. * ******************************************************************************/ static portTASK_FUNCTION( TzCtrl, pvParameters ) { (void)pvParameters; TracealyzerCommandType msg; int bytes = 0; while (1) { do { /* Listen for new commands */ bytes = 0; TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), &bytes); if (bytes == sizeof(TracealyzerCommandType)) { if (prvIsValidCommand(&msg)) { prvProcessCommand(&msg); /* Start or Stop currently... */ } } /* Send periodic data */ bytes = 0; TRC_STREAM_PORT_PERIODIC_SEND_DATA(&bytes); /* If there was data sent (bytes != 0), immediately loop around and do all this again. Otherwise, step out of this loop and sleep for a while. */ } while (bytes != 0); prvCheckRecorderStatus(); vTaskDelay(TRC_CFG_CTRL_TASK_DELAY); /* 10ms */ } }
/******************************************************************************* * TzCtrl * * Task for sending the trace data from the internal buffer to the stream * interface (assuming TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) and for * receiving commands from Tracealyzer. Also does some diagnostics. ******************************************************************************/ static portTASK_FUNCTION( TzCtrl, pvParameters ) { TracealyzerCommandType msg; int32_t bytes = 0; int32_t status = 0; (void)pvParameters; while (1) { do { /* Listen for new commands */ bytes = 0; status = TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), (int32_t*)&bytes); if (status != 0) { prvTraceWarning(PSF_WARNING_STREAM_PORT_READ); } if ((status == 0) && (bytes == sizeof(TracealyzerCommandType))) { if (prvIsValidCommand(&msg)) { prvProcessCommand(&msg); /* Start or Stop currently... */ } } /* If the internal buffer is disabled, the COMMIT macro instead sends the data directly from the "event functions" (using TRC_STREAM_PORT_WRITE_DATA). */ #if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) /* If there is a buffer page, this sends it to the streaming interface using TRC_STREAM_PORT_WRITE_DATA. */ bytes = prvPagedEventBufferTransfer(); #endif /* If there was data sent or received (bytes != 0), loop around and repeat, if there is more data to send or receive. Otherwise, step out of this loop and sleep for a while. */ } while (bytes != 0); prvCheckRecorderStatus(); vTaskDelay(TRC_CFG_CTRL_TASK_DELAY); } }
/******************************************************************************* * vTraceEnable * * Function that enables the tracing and creates the control task. It will halt * execution until a Start command has been received if haltUntilStart is true. * ******************************************************************************/ void vTraceEnable(int startOption) { int32_t bytes = 0; int32_t status; extern uint32_t RecorderEnabled; TracealyzerCommandType msg; /* Only do this first time...*/ if (HandleTzCtrl == NULL) { TRC_STREAM_PORT_INIT(); /* Note: Requires that TRC_CFG_INCLUDE_USER_EVENTS is 1. */ trcWarningChannel = xTraceRegisterString("Warnings from Recorder"); /* Creates the TzCtrl task - receives trace commands (start, stop, ...) */ #if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) HandleTzCtrl = xTaskCreateStatic(TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, stackTzCtrl, &tcbTzCtrl); #else xTaskCreate( TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, &HandleTzCtrl ); #endif if (HandleTzCtrl == NULL) { prvTraceError(PSF_ERROR_TZCTRLTASK_NOT_CREATED); } } if (startOption == TRC_START_AWAIT_HOST) { /* We keep trying to read commands until the recorder has been started */ do { bytes = 0; status = TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), (int32_t*)&bytes); if (status != 0) { prvTraceWarning(PSF_WARNING_STREAM_PORT_READ); } if ((status == 0) && (bytes == sizeof(TracealyzerCommandType))) { if (prvIsValidCommand(&msg)) { if (msg.cmdCode == CMD_SET_ACTIVE && msg.param1 == 1) { /* On start, init and reset the timestamping */ TRC_PORT_SPECIFIC_INIT(); } prvProcessCommand(&msg); } } } while (RecorderEnabled == 0); } else if (startOption == TRC_START) { /* We start streaming directly - this assumes that the interface is ready! */ TRC_PORT_SPECIFIC_INIT(); msg.cmdCode = CMD_SET_ACTIVE; msg.param1 = 1; prvProcessCommand(&msg); } else { /* On TRC_INIT */ TRC_PORT_SPECIFIC_INIT(); } }