1 /*******************************************************************************
\r
2 * Tracealyzer v2.7.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 * Tabs are used for indent in this file (1 tab = 4 spaces)
\r
36 * Copyright Percepio AB, 2014.
\r
38 ******************************************************************************/
\r
40 #include "trcKernelPort.h"
\r
42 #if (USE_TRACEALYZER_RECORDER == 1)
\r
48 /* For classes implemented as FreeRTOS Queues:
\r
49 This translates queue.type to the corresponding trace object class. */
\r
50 traceObjectClass TraceObjectClassTable[5] = {
\r
53 TRACE_CLASS_SEMAPHORE,
\r
54 TRACE_CLASS_SEMAPHORE,
\r
58 int uiInEventGroupSetBitsFromISR = 0;
\r
60 extern unsigned char ucQueueGetQueueType(void*);
\r
62 #if (FREERTOS_VERSION < FREERTOS_VERSION_8_0_OR_LATER)
\r
64 extern portBASE_TYPE ucQueueGetQueueNumber(void*);
\r
66 objectHandleType prvTraceGetObjectNumber(void* handle)
\r
68 return (objectHandleType) ucQueueGetQueueNumber(handle);
\r
73 extern portBASE_TYPE uxQueueGetQueueNumber(void*);
\r
75 objectHandleType prvTraceGetObjectNumber(void* handle)
\r
77 return (objectHandleType) uxQueueGetQueueNumber(handle);
\r
82 unsigned char prvTraceGetObjectType(void* handle)
\r
84 return ucQueueGetQueueType(handle);
\r
87 objectHandleType prvTraceGetTaskNumber(void* handle)
\r
89 return (objectHandleType)uxTaskGetTaskNumber(handle);
\r
92 unsigned char prvTraceIsSchedulerActive()
\r
94 return xTaskGetSchedulerState() == taskSCHEDULER_RUNNING;
\r
97 unsigned char prvTraceIsSchedulerSuspended()
\r
99 return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED;
\r
102 unsigned char prvTraceIsSchedulerStarted()
\r
104 return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED;
\r
107 void* prvTraceGetCurrentTaskHandle()
\r
109 return xTaskGetCurrentTaskHandle();
\r
112 /* Initialization of the object property table */
\r
113 void vTraceInitObjectPropertyTable()
\r
115 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectClasses = TRACE_NCLASSES;
\r
116 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[0] = NQueue;
\r
117 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[1] = NSemaphore;
\r
118 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[2] = NMutex;
\r
119 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[3] = NTask;
\r
120 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = NISR;
\r
121 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[5] = NTimer;
\r
122 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[6] = NEventGroup;
\r
123 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = NameLenQueue;
\r
124 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = NameLenSemaphore;
\r
125 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = NameLenMutex;
\r
126 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[3] = NameLenTask;
\r
127 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = NameLenISR;
\r
128 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[5] = NameLenTimer;
\r
129 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[6] = NameLenEventGroup;
\r
130 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue;
\r
131 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore;
\r
132 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex;
\r
133 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[3] = PropertyTableSizeTask;
\r
134 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[4] = PropertyTableSizeISR;
\r
135 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[5] = PropertyTableSizeTimer;
\r
136 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[6] = PropertyTableSizeEventGroup;
\r
137 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[0] = StartIndexQueue;
\r
138 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[1] = StartIndexSemaphore;
\r
139 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[2] = StartIndexMutex;
\r
140 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[3] = StartIndexTask;
\r
141 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[4] = StartIndexISR;
\r
142 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[5] = StartIndexTimer;
\r
143 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[6] = StartIndexEventGroup;
\r
144 RecorderDataPtr->ObjectPropertyTable.ObjectPropertyTableSizeInBytes = TRACE_OBJECT_TABLE_SIZE;
\r
147 /* Initialization of the handle mechanism, see e.g, xTraceGetObjectHandle */
\r
148 void vTraceInitObjectHandleStack()
\r
150 objectHandleStacks.indexOfNextAvailableHandle[0] = objectHandleStacks.lowestIndexOfClass[0] = 0;
\r
151 objectHandleStacks.indexOfNextAvailableHandle[1] = objectHandleStacks.lowestIndexOfClass[1] = NQueue;
\r
152 objectHandleStacks.indexOfNextAvailableHandle[2] = objectHandleStacks.lowestIndexOfClass[2] = NQueue + NSemaphore;
\r
153 objectHandleStacks.indexOfNextAvailableHandle[3] = objectHandleStacks.lowestIndexOfClass[3] = NQueue + NSemaphore + NMutex;
\r
154 objectHandleStacks.indexOfNextAvailableHandle[4] = objectHandleStacks.lowestIndexOfClass[4] = NQueue + NSemaphore + NMutex + NTask;
\r
155 objectHandleStacks.indexOfNextAvailableHandle[5] = objectHandleStacks.lowestIndexOfClass[5] = NQueue + NSemaphore + NMutex + NTask + NISR;
\r
156 objectHandleStacks.indexOfNextAvailableHandle[6] = objectHandleStacks.lowestIndexOfClass[6] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer;
\r
158 objectHandleStacks.highestIndexOfClass[0] = NQueue - 1;
\r
159 objectHandleStacks.highestIndexOfClass[1] = NQueue + NSemaphore - 1;
\r
160 objectHandleStacks.highestIndexOfClass[2] = NQueue + NSemaphore + NMutex - 1;
\r
161 objectHandleStacks.highestIndexOfClass[3] = NQueue + NSemaphore + NMutex + NTask - 1;
\r
162 objectHandleStacks.highestIndexOfClass[4] = NQueue + NSemaphore + NMutex + NTask + NISR - 1;
\r
163 objectHandleStacks.highestIndexOfClass[5] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer - 1;
\r
164 objectHandleStacks.highestIndexOfClass[6] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer + NEventGroup - 1;
\r
167 /* Returns the "Not enough handles" error message for this object class */
\r
168 const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
\r
170 switch(objectclass)
\r
172 case TRACE_CLASS_TASK:
\r
173 return "Not enough TASK handles - increase NTask in trcConfig.h";
\r
174 case TRACE_CLASS_ISR:
\r
175 return "Not enough ISR handles - increase NISR in trcConfig.h";
\r
176 case TRACE_CLASS_SEMAPHORE:
\r
177 return "Not enough SEMAPHORE handles - increase NSemaphore in trcConfig.h";
\r
178 case TRACE_CLASS_MUTEX:
\r
179 return "Not enough MUTEX handles - increase NMutex in trcConfig.h";
\r
180 case TRACE_CLASS_QUEUE:
\r
181 return "Not enough QUEUE handles - increase NQueue in trcConfig.h";
\r
182 case TRACE_CLASS_TIMER:
\r
183 return "Not enough TIMER handles - increase NTimer in trcConfig.h";
\r
184 case TRACE_CLASS_EVENTGROUP:
\r
185 return "Not enough EVENTGROUP handles - increase NEventGroup in trcConfig.h";
\r
187 return "pszTraceGetErrorHandles: Invalid objectclass!";
\r
191 /* Returns the exclude state of the object */
\r
192 uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType handle)
\r
194 TRACE_ASSERT(objectclass < TRACE_NCLASSES, "prvTraceIsObjectExcluded: objectclass >= TRACE_NCLASSES", 1);
\r
195 TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "uiTraceIsObjectExcluded: Invalid value for handle", 1);
\r
197 switch(objectclass)
\r
199 case TRACE_CLASS_TASK:
\r
200 return TRACE_GET_TASK_FLAG_ISEXCLUDED(handle);
\r
201 case TRACE_CLASS_SEMAPHORE:
\r
202 return TRACE_GET_SEMAPHORE_FLAG_ISEXCLUDED(handle);
\r
203 case TRACE_CLASS_MUTEX:
\r
204 return TRACE_GET_MUTEX_FLAG_ISEXCLUDED(handle);
\r
205 case TRACE_CLASS_QUEUE:
\r
206 return TRACE_GET_QUEUE_FLAG_ISEXCLUDED(handle);
\r
207 case TRACE_CLASS_TIMER:
\r
208 return TRACE_GET_TIMER_FLAG_ISEXCLUDED(handle);
\r
209 case TRACE_CLASS_EVENTGROUP:
\r
210 return TRACE_GET_EVENTGROUP_FLAG_ISEXCLUDED(handle);
\r
213 vTraceError("Invalid object class ID in uiTraceIsObjectExcluded!");
\r
215 /* Must never reach */
\r