|
|
/*******************************************************************************
|
|
|
* Trace Recorder Library for Tracealyzer v3.0.2
|
|
|
* Percepio AB, www.percepio.com
|
|
|
*
|
|
|
* trcStreamPort.h
|
|
|
*
|
|
|
* This file defines the trace streaming interface used by the
|
|
|
* Trace Recorder Library. It comes preconfigured for use with SEGGER's RTT and
|
|
|
* a TCP/IP (needs additional configuration in trcTCPIPConfig.h).
|
|
|
*
|
|
|
* Terms of Use
|
|
|
* This software (the "Tracealyzer Recorder Library") is the intellectual
|
|
|
* property of Percepio AB and may not be sold or in other ways commercially
|
|
|
* redistributed without explicit written permission by Percepio AB.
|
|
|
*
|
|
|
* Separate conditions applies for the SEGGER branded source code included.
|
|
|
*
|
|
|
* The recorder library is free for use together with Percepio products.
|
|
|
* You may distribute the recorder library in its original form, but public
|
|
|
* distribution of modified versions require approval by Percepio AB.
|
|
|
*
|
|
|
* Disclaimer
|
|
|
* The trace tool and recorder library is being delivered to you AS IS and
|
|
|
* Percepio AB makes no warranty as to its use or performance. Percepio AB does
|
|
|
* not and cannot warrant the performance or results you may obtain by using the
|
|
|
* software or documentation. Percepio AB make no warranties, express or
|
|
|
* implied, as to noninfringement of third party rights, merchantability, or
|
|
|
* fitness for any particular purpose. In no event will Percepio AB, its
|
|
|
* technology partners, or distributors be liable to you for any consequential,
|
|
|
* incidental or special damages, including any lost profits or lost savings,
|
|
|
* even if a representative of Percepio AB has been advised of the possibility
|
|
|
* of such damages, or for any claim by any third party. Some jurisdictions do
|
|
|
* not allow the exclusion or limitation of incidental, consequential or special
|
|
|
* damages, or the exclusion of implied warranties or limitations on how long an
|
|
|
* implied warranty may last, so the above limitations may not apply to you.
|
|
|
*
|
|
|
* Tabs are used for indent in this file (1 tab = 4 spaces)
|
|
|
*
|
|
|
* Copyright Percepio AB, 2015.
|
|
|
* www.percepio.com
|
|
|
******************************************************************************/
|
|
|
|
|
|
#ifndef _TRC_STREAM_PORT_H
|
|
|
#define _TRC_STREAM_PORT_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
extern <EFBFBD>C<EFBFBD> {
|
|
|
#endif
|
|
|
|
|
|
#if (USE_TRACEALYZER_RECORDER == 1)
|
|
|
|
|
|
#define TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_BLOCK (0x01)
|
|
|
#define TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_NOBLOCK (0x02)
|
|
|
#define TRC_RECORDER_TRANSFER_METHOD_TCPIP (0x03)
|
|
|
#define TRC_RECORDER_TRANSFER_METHOD_CUSTOM (0xFF)
|
|
|
|
|
|
#define TRC_RECORDER_BUFFER_ALLOCATION_STATIC (0x00)
|
|
|
#define TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC (0x01)
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_BLOCK / NOBLOCK
|
|
|
******************************************************************************/
|
|
|
#if TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_BLOCK || TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_NOBLOCK
|
|
|
|
|
|
#if TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_BLOCK
|
|
|
#define TRC_STREAM_PORT_BLOCKING_TRANSFER 1
|
|
|
#define RTT_MODE SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
|
|
|
#else
|
|
|
#define TRC_STREAM_PORT_BLOCKING_TRANSFER 0
|
|
|
#define RTT_MODE SEGGER_RTT_MODE_NO_BLOCK_SKIP
|
|
|
#endif
|
|
|
|
|
|
#include "SEGGER_RTT_Conf.h"
|
|
|
#include "SEGGER_RTT.h"
|
|
|
|
|
|
/* Up-buffer. If index is defined as 0, the internal RTT buffers will be used instead of this. */ \
|
|
|
#if TRC_RTT_UP_BUFFER_INDEX == 0
|
|
|
#define TRC_RTT_ALLOC_UP() static char* _TzTraceData = NULL; /* Not actually used. Ignore allocation method. */
|
|
|
#define TRC_STREAM_PORT_MALLOC() /* Static allocation. Not used. */
|
|
|
#else
|
|
|
#if TRC_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_STATIC
|
|
|
#define TRC_RTT_ALLOC_UP() static char _TzTraceData[BUFFER_SIZE_UP]; /* Static allocation */
|
|
|
#define TRC_STREAM_PORT_MALLOC() /* Static allocation. Not used. */
|
|
|
#else
|
|
|
#define TRC_RTT_ALLOC_UP() static char* _TzTraceData = NULL; /* Dynamic allocation */
|
|
|
#define TRC_STREAM_PORT_MALLOC() _TzTraceData = TRC_PORT_MALLOC(BUFFER_SIZE_UP);
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
/* Down-buffer. If index is defined as 0, the internal RTT buffers will be used instead of this. */ \
|
|
|
#if TRC_RTT_DOWN_BUFFER_INDEX == 0
|
|
|
#define TRC_RTT_ALLOC_DOWN() static char* _TzCtrlData = NULL; /* Not actually used. Ignore allocation method. */
|
|
|
#else
|
|
|
#define TRC_RTT_ALLOC_DOWN() static char _TzCtrlData[BUFFER_SIZE_DOWN]; /* This buffer should be ~32bytes. Ignore allocation method. */
|
|
|
#endif
|
|
|
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_FIELDS() \
|
|
|
TRC_RTT_ALLOC_UP() /* Macro that will result in proper UP buffer allocation */ \
|
|
|
TRC_RTT_ALLOC_DOWN() /* Macro that will result in proper DOWN buffer allocation */
|
|
|
|
|
|
#define TRC_STREAM_PORT_INIT() \
|
|
|
TRC_STREAM_PORT_MALLOC(); /*Dynamic allocation or empty if static */ \
|
|
|
SEGGER_RTT_ConfigUpBuffer(TRC_RTT_UP_BUFFER_INDEX, "TzData", _TzTraceData, sizeof(_TzTraceData), RTT_MODE ); \
|
|
|
SEGGER_RTT_ConfigDownBuffer(TRC_RTT_DOWN_BUFFER_INDEX, "TzCtrl", _TzCtrlData, sizeof(_TzCtrlData), 0);
|
|
|
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_EVENT(_type, _ptrData, _size) uint8_t tmpEvt[_size]; _type* _ptrData = (_type*)tmpEvt;
|
|
|
#define TRC_STREAM_PORT_COMMIT_EVENT(_ptrData, _size) SEGGER_RTT_Write(TRC_RTT_UP_BUFFER_INDEX, (const char*)_ptrData, _size);
|
|
|
#define TRC_STREAM_PORT_READ_DATA(_ptrData, _size, _ptrBytesRead) *_ptrBytesRead = SEGGER_RTT_Read(TRC_RTT_DOWN_BUFFER_INDEX, (char*)_ptrData, _size);
|
|
|
#define TRC_STREAM_PORT_PERIODIC_SEND_DATA(_ptrBytesSent)
|
|
|
|
|
|
#define TRC_STREAM_PORT_ON_TRACE_BEGIN() /* Do nothing */
|
|
|
#define TRC_STREAM_PORT_ON_TRACE_END() /* Do nothing */
|
|
|
|
|
|
#endif /*TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_BLOCK || TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_JLINK_RTT_NOBLOCK*/
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* TRC_RECORDER_TRANSFER_METHOD_TCPIP
|
|
|
*
|
|
|
* This TCP/IP implementation is using a secondary buffer consisting of multiple
|
|
|
* pages to avoid the endless recursive calls that occurr when "socket_send"
|
|
|
* uses kernel objects such as mutexes and semaphores, which in turn needs to be
|
|
|
* traced. To use your own TCP/IP stack, modify the functions declared in
|
|
|
* trcTCPIPConfig.h.
|
|
|
******************************************************************************/
|
|
|
#if TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_TCPIP
|
|
|
|
|
|
#include "trcTCPIP.h"
|
|
|
#include "trcPagedEventBuffer.h"
|
|
|
#include "trcPagedEventBufferConfig.h"
|
|
|
#define TRC_STREAM_PORT_BLOCKING_TRANSFER 0
|
|
|
|
|
|
#if TRC_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_STATIC
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_FIELDS() static char _TzTraceData[TRC_PAGED_EVENT_BUFFER_PAGE_COUNT * TRC_PAGED_EVENT_BUFFER_PAGE_SIZE]; /* Static allocation. */
|
|
|
#define TRC_STREAM_PORT_MALLOC() /* Static allocation. Not used. */
|
|
|
#else
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_FIELDS() static char* _TzTraceData = NULL; /* Dynamic allocation. */
|
|
|
#define TRC_STREAM_PORT_MALLOC() _TzTraceData = TRC_PORT_MALLOC(TRC_PAGED_EVENT_BUFFER_PAGE_COUNT * TRC_PAGED_EVENT_BUFFER_PAGE_SIZE);
|
|
|
#endif
|
|
|
|
|
|
#define TRC_STREAM_PORT_INIT() \
|
|
|
TRC_STREAM_PORT_MALLOC(); /*Dynamic allocation or empty if static */ \
|
|
|
vPagedEventBufferInit(_TzTraceData);
|
|
|
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_EVENT(_type, _ptrData, _size) _type* _ptrData; _ptrData = (_type*)vPagedEventBufferGetWritePointer(_size);
|
|
|
#define TRC_STREAM_PORT_COMMIT_EVENT(_ptrData, _size) /* Not needed since we write immediately into the buffer received above by TRC_STREAM_PORT_ALLOCATE_EVENT, and the TRC_STREAM_PORT_PERIODIC_SEND_DATA defined below will take care of the actual trace transfer. */
|
|
|
#define TRC_STREAM_PORT_READ_DATA(_ptrData, _size, _ptrBytesRead) trcTcpRead(_ptrData, _size, _ptrBytesRead);
|
|
|
#define TRC_STREAM_PORT_PERIODIC_SEND_DATA(_ptrBytesSent) vPagedEventBufferTransfer(trcTcpWrite, _ptrBytesSent);
|
|
|
|
|
|
#define TRC_STREAM_PORT_ON_TRACE_BEGIN() vPagedEventBufferInit(_TzTraceData);
|
|
|
#define TRC_STREAM_PORT_ON_TRACE_END() /* Do nothing */
|
|
|
|
|
|
#endif /*TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_TCPIP*/
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* TRC_RECORDER_TRANSFER_METHOD_CUSTOM
|
|
|
*
|
|
|
* Implement the following macros in trcConfig.h. If your transfer method uses
|
|
|
* kernel objects when sending data you will need to use a secondary buffer to
|
|
|
* store the trace data before sending it. For this reason we provide
|
|
|
* trcPagedEventBuffer. Look at the TCP/IP macros above to see how to use it.
|
|
|
******************************************************************************/
|
|
|
#if TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_CUSTOM
|
|
|
|
|
|
/* When using the custom transfer method, define TRC_STREAM_CUSTOM_XXXXXXXXXXXXX in trcConfig.h */
|
|
|
#define TRC_STREAM_PORT_BLOCKING_TRANSFER TRC_STREAM_CUSTOM_BLOCKING_TRANSFER
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_FIELDS() TRC_STREAM_CUSTOM_ALLOCATE_FIELDS()
|
|
|
#define TRC_STREAM_PORT_INIT() TRC_STREAM_CUSTOM_INIT()
|
|
|
#define TRC_STREAM_PORT_ALLOCATE_EVENT(_type, _ptr, _size) TRC_STREAM_CUSTOM_ALLOCATE_EVENT(_type, _ptr, _size)
|
|
|
#define TRC_STREAM_PORT_COMMIT_EVENT(_ptr, _size) TRC_STREAM_CUSTOM_COMMIT_EVENT(_ptr, _size)
|
|
|
#define TRC_STREAM_PORT_READ_DATA(_ptrData, _size, _ptrBytesRead) TRC_STREAM_CUSTOM_READ_DATA(_ptrData, _size, _ptrBytesRead)
|
|
|
#define TRC_STREAM_PORT_PERIODIC_SEND_DATA(_ptrBytesSent) TRC_STREAM_CUSTOM_PERIODIC_SEND_DATA(_ptrBytesSent)
|
|
|
#define TRC_STREAM_PORT_ON_TRACE_BEGIN() TRC_STREAM_CUSTOM_ON_TRACE_BEGIN()
|
|
|
#define TRC_STREAM_PORT_ON_TRACE_END() TRC_STREAM_CUSTOM_ON_TRACE_END()
|
|
|
|
|
|
#endif /*TRC_RECORDER_TRANSFER_METHOD == TRC_RECORDER_TRANSFER_METHOD_CUSTOM*/
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_ALLOCATE_FIELDS
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_ALLOCATE_FIELDS!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_ALLOCATE_EVENT
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_ALLOCATE_EVENT!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_COMMIT_EVENT
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_COMMIT_EVENT!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_INIT
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_INIT!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_BLOCKING_TRANSFER
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_BLOCKING_TRANSFER!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_READ_DATA
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_READ_DATA!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_PERIODIC_SEND_DATA
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_PERIODIC_SEND_DATA!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_ON_TRACE_BEGIN
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_ON_TRACE_BEGIN!"
|
|
|
#endif
|
|
|
|
|
|
#ifndef TRC_STREAM_PORT_ON_TRACE_END
|
|
|
#error "Selected TRC_RECORDER_TRANSFER_METHOD does not define TRC_STREAM_PORT_ON_TRACE_END!"
|
|
|
#endif
|
|
|
|
|
|
#endif /*(USE_TRACEALYZER_RECORDER == 1)*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
#endif /* _TRC_STREAM_PORT_H */
|