1 /*******************************************************************************
\r
2 * Tracealyzer v2.6.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 /* For classes implemented as FreeRTOS Queues:
\r
47 This translates queue.type to the corresponding trace object class. */
\r
48 traceObjectClass TraceObjectClassTable[5] = {
\r
51 TRACE_CLASS_SEMAPHORE,
\r
52 TRACE_CLASS_SEMAPHORE,
\r
56 int uiInEventGroupSetBitsFromISR = 0;
\r
58 extern unsigned char ucQueueGetQueueType(void*);
\r
59 extern BaseType_t uxQueueGetQueueNumber(void*);
\r
61 objectHandleType prvTraceGetObjectNumber(void* handle)
\r
63 return ( objectHandleType ) uxQueueGetQueueNumber(handle);
\r
66 unsigned char prvTraceGetObjectType(void* handle)
\r
68 return ucQueueGetQueueType(handle);
\r
71 objectHandleType prvTraceGetTaskNumber(void* handle)
\r
73 return (objectHandleType)uxTaskGetTaskNumber(handle);
\r
76 unsigned char prvTraceIsSchedulerActive()
\r
78 return xTaskGetSchedulerState() == taskSCHEDULER_RUNNING;
\r
81 unsigned char prvTraceIsSchedulerSuspended()
\r
83 return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED;
\r
86 unsigned char prvTraceIsSchedulerStarted()
\r
88 return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED;
\r
91 void* prvTraceGetCurrentTaskHandle()
\r
93 return xTaskGetCurrentTaskHandle();
\r
96 /* Initialization of the object property table */
\r
97 void vTraceInitObjectPropertyTable()
\r
99 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectClasses = TRACE_NCLASSES;
\r
100 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[0] = NQueue;
\r
101 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[1] = NSemaphore;
\r
102 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[2] = NMutex;
\r
103 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[3] = NTask;
\r
104 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = NISR;
\r
105 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[5] = NTimer;
\r
106 RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[6] = NEventGroup;
\r
107 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = NameLenQueue;
\r
108 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = NameLenSemaphore;
\r
109 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = NameLenMutex;
\r
110 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[3] = NameLenTask;
\r
111 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = NameLenISR;
\r
112 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[5] = NameLenTimer;
\r
113 RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[6] = NameLenEventGroup;
\r
114 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue;
\r
115 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore;
\r
116 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex;
\r
117 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[3] = PropertyTableSizeTask;
\r
118 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[4] = PropertyTableSizeISR;
\r
119 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[5] = PropertyTableSizeTimer;
\r
120 RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[6] = PropertyTableSizeEventGroup;
\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.StartIndexOfClass[5] = StartIndexTimer;
\r
127 RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[6] = StartIndexEventGroup;
\r
128 RecorderDataPtr->ObjectPropertyTable.ObjectPropertyTableSizeInBytes = TRACE_OBJECT_TABLE_SIZE;
\r
131 /* Initialization of the handle mechanism, see e.g, xTraceGetObjectHandle */
\r
132 void vTraceInitObjectHandleStack()
\r
134 objectHandleStacks.indexOfNextAvailableHandle[0] = objectHandleStacks.lowestIndexOfClass[0] = 0;
\r
135 objectHandleStacks.indexOfNextAvailableHandle[1] = objectHandleStacks.lowestIndexOfClass[1] = NQueue;
\r
136 objectHandleStacks.indexOfNextAvailableHandle[2] = objectHandleStacks.lowestIndexOfClass[2] = NQueue + NSemaphore;
\r
137 objectHandleStacks.indexOfNextAvailableHandle[3] = objectHandleStacks.lowestIndexOfClass[3] = NQueue + NSemaphore + NMutex;
\r
138 objectHandleStacks.indexOfNextAvailableHandle[4] = objectHandleStacks.lowestIndexOfClass[4] = NQueue + NSemaphore + NMutex + NTask;
\r
139 objectHandleStacks.indexOfNextAvailableHandle[5] = objectHandleStacks.lowestIndexOfClass[5] = NQueue + NSemaphore + NMutex + NTask + NISR;
\r
140 objectHandleStacks.indexOfNextAvailableHandle[6] = objectHandleStacks.lowestIndexOfClass[6] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer;
\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
147 objectHandleStacks.highestIndexOfClass[5] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer - 1;
\r
148 objectHandleStacks.highestIndexOfClass[6] = NQueue + NSemaphore + NMutex + NTask + NISR + NTimer + NEventGroup - 1;
\r
151 /* Returns the "Not enough handles" error message for this object class */
\r
152 const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
\r
154 switch(objectclass)
\r
156 case TRACE_CLASS_TASK:
\r
157 return "Not enough TASK handles - increase NTask in trcConfig.h";
\r
158 case TRACE_CLASS_ISR:
\r
159 return "Not enough ISR handles - increase NISR in trcConfig.h";
\r
160 case TRACE_CLASS_SEMAPHORE:
\r
161 return "Not enough SEMAPHORE handles - increase NSemaphore in trcConfig.h";
\r
162 case TRACE_CLASS_MUTEX:
\r
163 return "Not enough MUTEX handles - increase NMutex in trcConfig.h";
\r
164 case TRACE_CLASS_QUEUE:
\r
165 return "Not enough QUEUE handles - increase NQueue in trcConfig.h";
\r
166 case TRACE_CLASS_TIMER:
\r
167 return "Not enough TIMER handles - increase NTimer in trcConfig.h";
\r
168 case TRACE_CLASS_EVENTGROUP:
\r
169 return "Not enough EVENTGROUP handles - increase NEventGroup in trcConfig.h";
\r
171 return "pszTraceGetErrorHandles: Invalid objectclass!";
\r
175 /* Returns the exclude state of the object */
\r
176 uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType handle)
\r
178 TRACE_ASSERT(objectclass < TRACE_NCLASSES, "prvTraceIsObjectExcluded: objectclass >= TRACE_NCLASSES", 1);
\r
179 TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "uiTraceIsObjectExcluded: Invalid value for handle", 1);
\r
181 switch(objectclass)
\r
183 case TRACE_CLASS_TASK:
\r
184 return TRACE_GET_TASK_FLAG_ISEXCLUDED(handle);
\r
185 case TRACE_CLASS_SEMAPHORE:
\r
186 return TRACE_GET_SEMAPHORE_FLAG_ISEXCLUDED(handle);
\r
187 case TRACE_CLASS_MUTEX:
\r
188 return TRACE_GET_MUTEX_FLAG_ISEXCLUDED(handle);
\r
189 case TRACE_CLASS_QUEUE:
\r
190 return TRACE_GET_QUEUE_FLAG_ISEXCLUDED(handle);
\r
191 case TRACE_CLASS_TIMER:
\r
192 return TRACE_GET_TIMER_FLAG_ISEXCLUDED(handle);
\r
193 case TRACE_CLASS_EVENTGROUP:
\r
194 return TRACE_GET_EVENTGROUP_FLAG_ISEXCLUDED(handle);
\r
197 vTraceError("Invalid object class ID in uiTraceIsObjectExcluded!");
\r
199 /* Must never reach */
\r