1 /*******************************************************************************
\r
2 * Tracealyzer v2.5.0 Recorder Library
\r
3 * Percepio AB, www.percepio.com
\r
7 * Kernel-specific functionality for FreeRTOS, used by the recorder library.
\r
10 * This software is copyright Percepio AB. The recorder library is free for
\r
11 * use together with Percepio products. You may distribute the recorder library
\r
12 * in its original form, including modifications in trcHardwarePort.c/.h
\r
13 * given that these modification are clearly marked as your own modifications
\r
14 * and documented in the initial comment section of these source files.
\r
15 * This software is the intellectual property of Percepio AB and may not be
\r
16 * sold or in other ways commercially redistributed without explicit written
\r
17 * permission by Percepio AB.
\r
20 * The trace tool and recorder library is being delivered to you AS IS and
\r
21 * Percepio AB makes no warranty as to its use or performance. Percepio AB does
\r
22 * not and cannot warrant the performance or results you may obtain by using the
\r
23 * software or documentation. Percepio AB make no warranties, express or
\r
24 * implied, as to noninfringement of third party rights, merchantability, or
\r
25 * fitness for any particular purpose. In no event will Percepio AB, its
\r
26 * technology partners, or distributors be liable to you for any consequential,
\r
27 * incidental or special damages, including any lost profits or lost savings,
\r
28 * even if a representative of Percepio AB has been advised of the possibility
\r
29 * of such damages, or for any claim by any third party. Some jurisdictions do
\r
30 * not allow the exclusion or limitation of incidental, consequential or special
\r
31 * damages, or the exclusion of implied warranties or limitations on how long an
\r
32 * implied warranty may last, so the above limitations may not apply to you.
\r
34 * Copyright Percepio AB, 2013.
\r
36 ******************************************************************************/
\r
38 #include "trcKernelPort.h"
\r
40 #if (USE_TRACEALYZER_RECORDER == 1)
\r
46 traceObjectClass TraceObjectClassTable[5] = {
\r
49 TRACE_CLASS_SEMAPHORE,
\r
50 TRACE_CLASS_SEMAPHORE,
\r
54 extern unsigned char ucQueueGetQueueType(void*);
\r
55 extern unsigned portBASE_TYPE uxQueueGetQueueNumber(void*);
\r
57 objectHandleType prvTraceGetObjectNumber(void* handle)
\r
59 return uxQueueGetQueueNumber(handle);
\r
62 unsigned char prvTraceGetObjectType(void* handle)
\r
64 return ucQueueGetQueueType(handle);
\r
67 objectHandleType prvTraceGetTaskNumber(void* handle)
\r
69 return (objectHandleType)uxTaskGetTaskNumber(handle);
\r
72 void prvTraceEnterCritical()
\r
74 taskENTER_CRITICAL();
\r
77 void prvTraceExitCritical()
\r
79 taskEXIT_CRITICAL();
\r
82 unsigned char prvTraceIsSchedulerActive()
\r
84 return xTaskGetSchedulerState() == taskSCHEDULER_RUNNING;
\r
87 unsigned char prvTraceIsSchedulerSuspended()
\r
89 return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED;
\r
92 unsigned char prvTraceIsSchedulerStarted()
\r
94 return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED;
\r
97 void* prvTraceGetCurrentTaskHandle()
\r
99 return xTaskGetCurrentTaskHandle();
\r
102 /* Initialization of the object property table */
\r
103 void vTraceInitObjectPropertyTable()
\r
105 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectClasses = TRACE_NCLASSES;
\r
106 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[0] = NQueue;
\r
107 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[1] = NSemaphore;
\r
108 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[2] = NMutex;
\r
109 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[3] = NTask;
\r
110 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = NISR;
\r
111 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = NameLenQueue;
\r
112 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = NameLenSemaphore;
\r
113 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = NameLenMutex;
\r
114 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[3] = NameLenTask;
\r
115 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = NameLenISR;
\r
116 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue;
\r
117 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore;
\r
118 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex;
\r
119 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[3] = PropertyTableSizeTask;
\r
120 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[4] = PropertyTableSizeISR;
\r
121 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[0] = StartIndexQueue;
\r
122 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[1] = StartIndexSemaphore;
\r
123 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[2] = StartIndexMutex;
\r
124 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[3] = StartIndexTask;
\r
125 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[4] = StartIndexISR;
\r
126 RecorderDataPtr->ObjectPropertyTable.ObjectPropertyTableSizeInBytes = TRACE_OBJECT_TABLE_SIZE;
\r
129 /* Initialization of the handle mechanism, see e.g, xTraceGetObjectHandle */
\r
130 void vTraceInitObjectHandleStack()
\r
132 objectHandleStacks.indexOfNextAvailableHandle[0] = 0;
\r
133 objectHandleStacks.indexOfNextAvailableHandle[1] = NQueue;
\r
134 objectHandleStacks.indexOfNextAvailableHandle[2] = NQueue + NSemaphore;
\r
135 objectHandleStacks.indexOfNextAvailableHandle[3] = NQueue + NSemaphore + NMutex;
\r
136 objectHandleStacks.indexOfNextAvailableHandle[4] = NQueue + NSemaphore + NMutex + NTask;
\r
137 objectHandleStacks.lowestIndexOfClass[0] = 0;
\r
138 objectHandleStacks.lowestIndexOfClass[1] = NQueue;
\r
139 objectHandleStacks.lowestIndexOfClass[2] = NQueue + NSemaphore;
\r
140 objectHandleStacks.lowestIndexOfClass[3] = NQueue + NSemaphore + NMutex;
\r
141 objectHandleStacks.lowestIndexOfClass[4] = NQueue + NSemaphore + NMutex + NTask;
\r
142 objectHandleStacks.highestIndexOfClass[0] = NQueue - 1;
\r
143 objectHandleStacks.highestIndexOfClass[1] = NQueue + NSemaphore - 1;
\r
144 objectHandleStacks.highestIndexOfClass[2] = NQueue + NSemaphore + NMutex - 1;
\r
145 objectHandleStacks.highestIndexOfClass[3] = NQueue + NSemaphore + NMutex + NTask - 1;
\r
146 objectHandleStacks.highestIndexOfClass[4] = NQueue + NSemaphore + NMutex + NTask + NISR - 1;
\r
149 /* Returns the "Not enough handles" error message for this object class */
\r
150 const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
\r
152 switch(objectclass)
\r
154 case TRACE_CLASS_TASK:
\r
155 return "Not enough TASK handles - increase NTask in trcConfig.h";
\r
156 case TRACE_CLASS_ISR:
\r
157 return "Not enough ISR handles - increase NISR in trcConfig.h";
\r
158 case TRACE_CLASS_SEMAPHORE:
\r
159 return "Not enough SEMAPHORE handles - increase NSemaphore in trcConfig.h";
\r
160 case TRACE_CLASS_MUTEX:
\r
161 return "Not enough MUTEX handles - increase NMutex in trcConfig.h";
\r
162 case TRACE_CLASS_QUEUE:
\r
163 return "Not enough QUEUE handles - increase NQueue in trcConfig.h";
\r
165 return "pszTraceGetErrorHandles: Invalid objectclass!";
\r
169 /* Returns the exclude state of the object */
\r
170 uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType handle)
\r
172 TRACE_ASSERT(objectclass < TRACE_NCLASSES, "prvTraceIsObjectExcluded: objectclass >= TRACE_NCLASSES", 1);
\r
173 TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "uiTraceIsObjectExcluded: Invalid value for handle", 1);
\r
175 switch(objectclass)
\r
177 case TRACE_CLASS_TASK:
\r
178 return TRACE_GET_TASK_FLAG_ISEXCLUDED(handle);
\r
179 case TRACE_CLASS_SEMAPHORE:
\r
180 return TRACE_GET_SEMAPHORE_FLAG_ISEXCLUDED(handle);
\r
181 case TRACE_CLASS_MUTEX:
\r
182 return TRACE_GET_MUTEX_FLAG_ISEXCLUDED(handle);
\r
183 case TRACE_CLASS_QUEUE:
\r
184 return TRACE_GET_QUEUE_FLAG_ISEXCLUDED(handle);
\r
187 /* Must never reach */
\r