mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-19 17:48:33 -04:00
+ New feature added: Task notifications.
+ Optimise Cortex-M4F ports by inlining some critical section macros. + Original ports used a #define to set the path to portmacro.h - that method has been obsolete for years and now all the old definitions have been moved into a separate header files called deprecated_definitions.h. + Cortex-M port now check the active vector bits against 0xff when determining if a function is called from an interrupt - previously only a subset of the bits (0x1f) were checked. + Add in new standard demo/test files TaskNotify.c/h and include the files in the simulator demos. + Update trace recorder code, and some demos to use the new version (more to do). + Introduce uxTaskPriorityGetFromISR(). + Minor typo corrections. + Update MingW simulator demo to match the MSVC simulator demo.
This commit is contained in:
parent
ca22607d14
commit
85fb1cc024
65 changed files with 5524 additions and 4527 deletions
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Tracealyzer v2.6.0 Recorder Library
|
||||
* Tracealyzer v2.7.0 Recorder Library
|
||||
* Percepio AB, www.percepio.com
|
||||
*
|
||||
* trcBase.h
|
||||
|
|
@ -31,7 +31,9 @@
|
|||
* 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.
|
||||
*
|
||||
* Copyright Percepio AB, 2013.
|
||||
* Tabs are used for indent in this file (1 tab = 4 spaces)
|
||||
*
|
||||
* Copyright Percepio AB, 2014.
|
||||
* www.percepio.com
|
||||
******************************************************************************/
|
||||
|
||||
|
|
@ -99,20 +101,20 @@ extern uint8_t excludedEventCodes[NEventCodes / 8 + 1];
|
|||
*****************************************************************************/
|
||||
typedef struct
|
||||
{
|
||||
/* For each object class, the index of the next handle to allocate */
|
||||
uint16_t indexOfNextAvailableHandle[ TRACE_NCLASSES ];
|
||||
/* For each object class, the index of the next handle to allocate */
|
||||
uint16_t indexOfNextAvailableHandle[ TRACE_NCLASSES ];
|
||||
|
||||
/* The lowest index of this class (constant) */
|
||||
uint16_t lowestIndexOfClass[ TRACE_NCLASSES ];
|
||||
/* The lowest index of this class (constant) */
|
||||
uint16_t lowestIndexOfClass[ TRACE_NCLASSES ];
|
||||
|
||||
/* The highest index of this class (constant) */
|
||||
uint16_t highestIndexOfClass[ TRACE_NCLASSES ];
|
||||
/* The highest index of this class (constant) */
|
||||
uint16_t highestIndexOfClass[ TRACE_NCLASSES ];
|
||||
|
||||
/* The highest use count for this class (for statistics) */
|
||||
uint16_t handleCountWaterMarksOfClass[ TRACE_NCLASSES ];
|
||||
/* The highest use count for this class (for statistics) */
|
||||
uint16_t handleCountWaterMarksOfClass[ TRACE_NCLASSES ];
|
||||
|
||||
/* The free object handles - a set of stacks within this array */
|
||||
objectHandleType objectHandles[ TRACE_KERNEL_OBJECT_COUNT ];
|
||||
/* The free object handles - a set of stacks within this array */
|
||||
objectHandleType objectHandles[ TRACE_KERNEL_OBJECT_COUNT ];
|
||||
|
||||
} objectHandleStackType;
|
||||
|
||||
|
|
@ -136,47 +138,47 @@ extern objectHandleStackType objectHandleStacks;
|
|||
|
||||
typedef struct
|
||||
{
|
||||
/* = NCLASSES */
|
||||
uint32_t NumberOfObjectClasses;
|
||||
/* = NCLASSES */
|
||||
uint32_t NumberOfObjectClasses;
|
||||
|
||||
uint32_t ObjectPropertyTableSizeInBytes;
|
||||
uint32_t ObjectPropertyTableSizeInBytes;
|
||||
|
||||
/* This is used to calculate the index in the dynamic object table
|
||||
(handle - 1 - nofStaticObjects = index)*/
|
||||
/* This is used to calculate the index in the dynamic object table
|
||||
(handle - 1 - nofStaticObjects = index)*/
|
||||
#if (USE_16BIT_OBJECT_HANDLES == 1)
|
||||
objectHandleType NumberOfObjectsPerClass[2*((TRACE_NCLASSES+1)/2)];
|
||||
objectHandleType NumberOfObjectsPerClass[2*((TRACE_NCLASSES+1)/2)];
|
||||
#else
|
||||
objectHandleType NumberOfObjectsPerClass[4*((TRACE_NCLASSES+3)/4)];
|
||||
#endif
|
||||
|
||||
/* Allocation size rounded up to the closest multiple of 4 */
|
||||
uint8_t NameLengthPerClass[ 4*((TRACE_NCLASSES+3)/4) ];
|
||||
/* Allocation size rounded up to the closest multiple of 4 */
|
||||
uint8_t NameLengthPerClass[ 4*((TRACE_NCLASSES+3)/4) ];
|
||||
|
||||
uint8_t TotalPropertyBytesPerClass[ 4*((TRACE_NCLASSES+3)/4) ];
|
||||
uint8_t TotalPropertyBytesPerClass[ 4*((TRACE_NCLASSES+3)/4) ];
|
||||
|
||||
/* Allocation size rounded up to the closest multiple of 2 */
|
||||
uint16_t StartIndexOfClass[ 2*((TRACE_NCLASSES+1)/2) ];
|
||||
/* Allocation size rounded up to the closest multiple of 2 */
|
||||
uint16_t StartIndexOfClass[ 2*((TRACE_NCLASSES+1)/2) ];
|
||||
|
||||
/* The actual handles issued, should be Initiated to all zeros */
|
||||
uint8_t objbytes[ 4*((TRACE_OBJECT_TABLE_SIZE+3)/4) ];
|
||||
/* The actual handles issued, should be Initiated to all zeros */
|
||||
uint8_t objbytes[ 4*((TRACE_OBJECT_TABLE_SIZE+3)/4) ];
|
||||
} ObjectPropertyTableType;
|
||||
|
||||
/* Symbol table data structure */
|
||||
typedef struct
|
||||
{
|
||||
/* = SYMBOL_HISTORY_TABLE_SIZE_IN_BYTES */
|
||||
uint32_t symTableSize;
|
||||
/* = SYMBOL_HISTORY_TABLE_SIZE_IN_BYTES */
|
||||
uint32_t symTableSize;
|
||||
|
||||
/* Entry 0 is reserved. Any reference to entry 0 implies NULL*/
|
||||
uint32_t nextFreeSymbolIndex;
|
||||
/* Entry 0 is reserved. Any reference to entry 0 implies NULL*/
|
||||
uint32_t nextFreeSymbolIndex;
|
||||
|
||||
/* Size rounded up to closest multiple of 4, to avoid alignment issues*/
|
||||
uint8_t symbytes[4*((SYMBOL_TABLE_SIZE+3)/4)];
|
||||
/* Size rounded up to closest multiple of 4, to avoid alignment issues*/
|
||||
uint8_t symbytes[4*((SYMBOL_TABLE_SIZE+3)/4)];
|
||||
|
||||
/* Used for lookups - Up to 64 linked lists within the symbol table
|
||||
connecting all entries with the same 6 bit checksum.
|
||||
This field holds the current list heads. Should be initiated to zeros */
|
||||
uint16_t latestEntryOfChecksum[64];
|
||||
/* Used for lookups - Up to 64 linked lists within the symbol table
|
||||
connecting all entries with the same 6 bit checksum.
|
||||
This field holds the current list heads. Should be initiated to zeros */
|
||||
uint16_t latestEntryOfChecksum[64];
|
||||
} symbolTableType;
|
||||
|
||||
|
||||
|
|
@ -186,72 +188,80 @@ typedef struct
|
|||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t objHandle;
|
||||
uint16_t dts; /* differential timestamp - time since last event */
|
||||
uint8_t type;
|
||||
uint8_t objHandle;
|
||||
uint16_t dts; /* differential timestamp - time since last event */
|
||||
} TSEvent, TREvent;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t dummy;
|
||||
uint16_t dts; /* differential timestamp - time since last event */
|
||||
uint16_t dts; /* differential timestamp - time since last event */
|
||||
} LPEvent;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t objHandle;
|
||||
uint16_t dts; /* differential timestamp - time since last event */
|
||||
uint8_t type;
|
||||
uint8_t objHandle;
|
||||
uint16_t dts; /* differential timestamp - time since last event */
|
||||
} KernelCall;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t objHandle;
|
||||
uint8_t param;
|
||||
uint8_t dts; /* differential timestamp - time since last event */
|
||||
uint8_t type;
|
||||
uint8_t objHandle;
|
||||
uint8_t param;
|
||||
uint8_t dts; /* differential timestamp - time since last event */
|
||||
} KernelCallWithParamAndHandle;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t dts; /* differential timestamp - time since last event */
|
||||
uint16_t param;
|
||||
uint8_t type;
|
||||
uint8_t dts; /* differential timestamp - time since last event */
|
||||
uint16_t param;
|
||||
} KernelCallWithParam16;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t objHandle; /* the handle of the closed object */
|
||||
uint16_t symbolIndex; /* the name of the closed object */
|
||||
uint8_t type;
|
||||
uint8_t objHandle; /* the handle of the closed object */
|
||||
uint16_t symbolIndex; /* the name of the closed object */
|
||||
} ObjCloseNameEvent;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t arg1;
|
||||
uint8_t arg2;
|
||||
uint8_t arg3;
|
||||
uint8_t type;
|
||||
uint8_t arg1;
|
||||
uint8_t arg2;
|
||||
uint8_t arg3;
|
||||
} ObjClosePropEvent;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t dts;
|
||||
uint16_t payload; /* the name of the user event */
|
||||
uint8_t type;
|
||||
uint8_t unused1;
|
||||
uint8_t unused2;
|
||||
uint8_t dts;
|
||||
} TaskInstanceStatusEvent;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t dts;
|
||||
uint16_t payload; /* the name of the user event */
|
||||
} UserEvent;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t type;
|
||||
|
||||
/* 8 bits extra for storing DTS, if it does not fit in ordinary event
|
||||
(this one is always MSB if used) */
|
||||
uint8_t xts_8;
|
||||
/* 8 bits extra for storing DTS, if it does not fit in ordinary event
|
||||
(this one is always MSB if used) */
|
||||
uint8_t xts_8;
|
||||
|
||||
/* 16 bits extra for storing DTS, if it does not fit in ordinary event. */
|
||||
uint16_t xts_16;
|
||||
/* 16 bits extra for storing DTS, if it does not fit in ordinary event. */
|
||||
uint16_t xts_16;
|
||||
} XTSEvent;
|
||||
|
||||
typedef struct
|
||||
|
|
@ -309,110 +319,108 @@ typedef struct
|
|||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t startmarker0;
|
||||
uint8_t startmarker1;
|
||||
uint8_t startmarker2;
|
||||
uint8_t startmarker3;
|
||||
uint8_t startmarker4;
|
||||
uint8_t startmarker5;
|
||||
uint8_t startmarker6;
|
||||
uint8_t startmarker7;
|
||||
uint8_t startmarker8;
|
||||
uint8_t startmarker9;
|
||||
uint8_t startmarker10;
|
||||
uint8_t startmarker11;
|
||||
uint8_t startmarker0;
|
||||
uint8_t startmarker1;
|
||||
uint8_t startmarker2;
|
||||
uint8_t startmarker3;
|
||||
uint8_t startmarker4;
|
||||
uint8_t startmarker5;
|
||||
uint8_t startmarker6;
|
||||
uint8_t startmarker7;
|
||||
uint8_t startmarker8;
|
||||
uint8_t startmarker9;
|
||||
uint8_t startmarker10;
|
||||
uint8_t startmarker11;
|
||||
|
||||
/* Used to determine Kernel and Endianess */
|
||||
uint16_t version;
|
||||
/* Used to determine Kernel and Endianess */
|
||||
uint16_t version;
|
||||
|
||||
/* Currently 3, since v2.6.0 */
|
||||
uint8_t minor_version;
|
||||
/* Currently 3, since v2.6.0 */
|
||||
uint8_t minor_version;
|
||||
|
||||
/* This should be 0 if lower IRQ priority values implies higher priority
|
||||
levels, such as on ARM Cortex M. If the opposite scheme is used, i.e.,
|
||||
if higher IRQ priority values means higher priority, this should be 1. */
|
||||
uint8_t irq_priority_order;
|
||||
/* This should be 0 if lower IRQ priority values implies higher priority
|
||||
levels, such as on ARM Cortex M. If the opposite scheme is used, i.e.,
|
||||
if higher IRQ priority values means higher priority, this should be 1. */
|
||||
uint8_t irq_priority_order;
|
||||
|
||||
/* sizeof(RecorderDataType) - just for control */
|
||||
uint32_t filesize;
|
||||
/* sizeof(RecorderDataType) - just for control */
|
||||
uint32_t filesize;
|
||||
|
||||
/* Current number of events recorded */
|
||||
uint32_t numEvents;
|
||||
/* Current number of events recorded */
|
||||
uint32_t numEvents;
|
||||
|
||||
/* The buffer size, in number of event records */
|
||||
uint32_t maxEvents;
|
||||
/* The buffer size, in number of event records */
|
||||
uint32_t maxEvents;
|
||||
|
||||
/* The event buffer index, where to write the next event */
|
||||
uint32_t nextFreeIndex;
|
||||
/* The event buffer index, where to write the next event */
|
||||
uint32_t nextFreeIndex;
|
||||
|
||||
/* 1 if the buffer is full, 0 otherwise */
|
||||
uint32_t bufferIsFull;
|
||||
/* 1 if the buffer is full, 0 otherwise */
|
||||
uint32_t bufferIsFull;
|
||||
|
||||
/* The frequency of the clock/timer/counter used as time base */
|
||||
uint32_t frequency;
|
||||
/* The frequency of the clock/timer/counter used as time base */
|
||||
uint32_t frequency;
|
||||
|
||||
/* The absolute timestamp of the last stored event, in the native
|
||||
timebase, modulo frequency! */
|
||||
uint32_t absTimeLastEvent;
|
||||
/* The absolute timestamp of the last stored event, in the native
|
||||
timebase, modulo frequency! */
|
||||
uint32_t absTimeLastEvent;
|
||||
|
||||
/* The number of seconds in total - lasts for 136 years */
|
||||
uint32_t absTimeLastEventSecond;
|
||||
/* The number of seconds in total - lasts for 136 years */
|
||||
uint32_t absTimeLastEventSecond;
|
||||
|
||||
/* 1 if the recorder has been started, 0 if not yet started or stopped.
|
||||
This is a 32 bit variable due to alignment issues. */
|
||||
uint32_t recorderActive;
|
||||
/* 1 if the recorder has been started, 0 if not yet started or stopped.
|
||||
This is a 32 bit variable due to alignment issues. */
|
||||
uint32_t recorderActive;
|
||||
|
||||
/* Not used, remains for compatibility and future use */
|
||||
uint8_t notused[28];
|
||||
|
||||
/* The amount of heap memory remaining at the last malloc or free event */
|
||||
/* Not used, remains for compatibility and future use */
|
||||
uint8_t notused[28];
|
||||
|
||||
/* The amount of heap memory remaining at the last malloc or free event */
|
||||
uint32_t heapMemUsage;
|
||||
|
||||
/* 0xF0F0F0F0 - for control only */
|
||||
int32_t debugMarker0;
|
||||
/* 0xF0F0F0F0 - for control only */
|
||||
int32_t debugMarker0;
|
||||
|
||||
/* Set to value of USE_16BIT_OBJECT_HANDLES */
|
||||
uint32_t isUsing16bitHandles;
|
||||
|
||||
/* The Object Property Table holds information about currently active
|
||||
tasks, queues, and other recorded objects. This is updated on each
|
||||
create call and includes object name and other properties. */
|
||||
ObjectPropertyTableType ObjectPropertyTable;
|
||||
/* The Object Property Table holds information about currently active
|
||||
tasks, queues, and other recorded objects. This is updated on each
|
||||
create call and includes object name and other properties. */
|
||||
ObjectPropertyTableType ObjectPropertyTable;
|
||||
|
||||
/* 0xF1F1F1F1 - for control only */
|
||||
int32_t debugMarker1;
|
||||
/* 0xF1F1F1F1 - for control only */
|
||||
int32_t debugMarker1;
|
||||
|
||||
/* The Symbol Table stores strings for User Events and is also used to
|
||||
store names of deleted objects, which still may be in the trace but no
|
||||
longer are available. */
|
||||
symbolTableType SymbolTable;
|
||||
/* The Symbol Table stores strings for User Events and is also used to
|
||||
store names of deleted objects, which still may be in the trace but no
|
||||
longer are available. */
|
||||
symbolTableType SymbolTable;
|
||||
|
||||
/* For inclusion of float support, and for endian detection of floats.
|
||||
The value should be (float)1 or (uint32_t)0 */
|
||||
/* For inclusion of float support, and for endian detection of floats.
|
||||
The value should be (float)1 or (uint32_t)0 */
|
||||
#if (INCLUDE_FLOAT_SUPPORT == 1)
|
||||
float exampleFloatEncoding;
|
||||
float exampleFloatEncoding;
|
||||
#else
|
||||
uint32_t exampleFloatEncoding;
|
||||
uint32_t exampleFloatEncoding;
|
||||
#endif
|
||||
/* This is non-zero if an internal error occurred in the recorder, e.g., if
|
||||
one of the Nxxx constants was too small. The systemInfo string will then
|
||||
contain an error message that is displayed when attempting to view the
|
||||
trace file. */
|
||||
uint32_t internalErrorOccured;
|
||||
/* This is non-zero if an internal error occurred in the recorder, e.g., if
|
||||
one of the Nxxx constants was too small. The systemInfo string will then
|
||||
contain an error message that is displayed when attempting to view the
|
||||
trace file. */
|
||||
uint32_t internalErrorOccured;
|
||||
|
||||
/* 0xF2F2F2F2 - for control only */
|
||||
int32_t debugMarker2;
|
||||
/* 0xF2F2F2F2 - for control only */
|
||||
int32_t debugMarker2;
|
||||
|
||||
/* Generic system information string, presented in the tool. Note that this
|
||||
is also used for storing any internal error messages from the recorder, so
|
||||
do not make TRACE_DESCRIPTION_MAX_LENGTH too small. 80 is recommended. */
|
||||
char systemInfo[TRACE_DESCRIPTION_MAX_LENGTH];
|
||||
/* Error messages from the recorder. */
|
||||
char systemInfo[80];
|
||||
|
||||
/* 0xF3F3F3F3 - for control only */
|
||||
int32_t debugMarker3;
|
||||
/* 0xF3F3F3F3 - for control only */
|
||||
int32_t debugMarker3;
|
||||
|
||||
/* The event data, in 4-byte records */
|
||||
uint8_t eventData[ EVENT_BUFFER_SIZE * 4 ];
|
||||
/* The event data, in 4-byte records */
|
||||
uint8_t eventData[ EVENT_BUFFER_SIZE * 4 ];
|
||||
|
||||
#if (USE_SEPARATE_USER_EVENT_BUFFER == 1)
|
||||
UserEventBuffer userEventBuffer;
|
||||
|
|
@ -421,18 +429,18 @@ typedef struct
|
|||
/* This should always be 0 */
|
||||
uint32_t endOfSecondaryBlocks;
|
||||
|
||||
uint8_t endmarker0;
|
||||
uint8_t endmarker1;
|
||||
uint8_t endmarker2;
|
||||
uint8_t endmarker3;
|
||||
uint8_t endmarker4;
|
||||
uint8_t endmarker5;
|
||||
uint8_t endmarker6;
|
||||
uint8_t endmarker7;
|
||||
uint8_t endmarker8;
|
||||
uint8_t endmarker9;
|
||||
uint8_t endmarker10;
|
||||
uint8_t endmarker11;
|
||||
uint8_t endmarker0;
|
||||
uint8_t endmarker1;
|
||||
uint8_t endmarker2;
|
||||
uint8_t endmarker3;
|
||||
uint8_t endmarker4;
|
||||
uint8_t endmarker5;
|
||||
uint8_t endmarker6;
|
||||
uint8_t endmarker7;
|
||||
uint8_t endmarker8;
|
||||
uint8_t endmarker9;
|
||||
uint8_t endmarker10;
|
||||
uint8_t endmarker11;
|
||||
} RecorderDataType;
|
||||
|
||||
extern RecorderDataType* RecorderDataPtr;
|
||||
|
|
@ -444,14 +452,14 @@ uint16_t prvTraceGetDTS(uint16_t param_maxDTS);
|
|||
void prvTraceGetChecksum(const char *pname, uint8_t* pcrc, uint8_t* plength);
|
||||
|
||||
traceLabel prvTraceCreateSymbolTableEntry(const char* name,
|
||||
uint8_t crc6,
|
||||
uint8_t len,
|
||||
traceLabel channel);
|
||||
uint8_t crc6,
|
||||
uint8_t len,
|
||||
traceLabel channel);
|
||||
|
||||
traceLabel prvTraceLookupSymbolTableEntry(const char* name,
|
||||
uint8_t crc6,
|
||||
uint8_t len,
|
||||
traceLabel channel);
|
||||
uint8_t crc6,
|
||||
uint8_t len,
|
||||
traceLabel channel);
|
||||
|
||||
traceLabel prvTraceOpenSymbol(const char* name, traceLabel userEventChannel);
|
||||
|
||||
|
|
@ -462,11 +470,11 @@ void prvCheckDataToBeOverwrittenForMultiEntryEvents(uint8_t nEntries);
|
|||
objectHandleType xTraceGetObjectHandle(traceObjectClass objectclass);
|
||||
|
||||
void vTraceFreeObjectHandle(traceObjectClass objectclass,
|
||||
objectHandleType handle);
|
||||
objectHandleType handle);
|
||||
|
||||
void vTraceSetObjectName(traceObjectClass objectclass,
|
||||
objectHandleType handle,
|
||||
const char* name);
|
||||
objectHandleType handle,
|
||||
const char* name);
|
||||
|
||||
void* xTraceNextFreeEventBufferSlot(void);
|
||||
|
||||
|
|
@ -478,7 +486,7 @@ unsigned char prvTraceGet8BitHandle(objectHandleType handle);
|
|||
|
||||
|
||||
uint16_t uiIndexOfObject(objectHandleType objecthandle,
|
||||
uint8_t objectclass);
|
||||
uint8_t objectclass);
|
||||
|
||||
/*******************************************************************************
|
||||
* vTraceError
|
||||
|
|
@ -519,9 +527,6 @@ RecorderDataPtr->ObjectPropertyTable.objbytes[uiIndexOfObject(handle, objectclas
|
|||
#define TRACE_CLEAR_EVENT_CODE_FLAG_ISEXCLUDED(eventCode) TRACE_CLEAR_FLAG_ISEXCLUDED(excludedEventCodes, eventCode)
|
||||
#define TRACE_GET_EVENT_CODE_FLAG_ISEXCLUDED(eventCode) TRACE_GET_FLAG_ISEXCLUDED(excludedEventCodes, eventCode)
|
||||
|
||||
#define TRACE_INCR_HEAP_USAGE(change) {if (RecorderDataPtr != NULL) RecorderDataPtr->heapMemUsage += change;}
|
||||
#define TRACE_DECR_HEAP_USAGE(change) {if (RecorderDataPtr != NULL) RecorderDataPtr->heapMemUsage -= change;}
|
||||
|
||||
/* DEBUG ASSERTS */
|
||||
#if defined USE_TRACE_ASSERT && USE_TRACE_ASSERT != 0
|
||||
#define TRACE_ASSERT(eval, msg, defRetVal) \
|
||||
|
|
@ -536,4 +541,8 @@ if (!(eval)) \
|
|||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue