]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/FreeRTOS-Plus-Trace/trcKernelPort.c
ff0b427a8a9a5379a42d1d46ae30cf1840dbc38a
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-Trace / trcKernelPort.c
1 /*******************************************************************************\r
2  * Tracealyzer v2.7.0 Recorder Library\r
3  * Percepio AB, www.percepio.com\r
4  *\r
5  * trcKernelPort.c\r
6  *\r
7  * Kernel-specific functionality for FreeRTOS, used by the recorder library.\r
8  * \r
9  * Terms of Use\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
18  *\r
19  * Disclaimer \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
33  *\r
34  * Tabs are used for indent in this file (1 tab = 4 spaces)\r
35  *\r
36  * Copyright Percepio AB, 2014.\r
37  * www.percepio.com\r
38  ******************************************************************************/\r
39 \r
40 #include "trcKernelPort.h"\r
41 \r
42 #if (USE_TRACEALYZER_RECORDER == 1)\r
43 \r
44 #include <stdint.h>\r
45 \r
46 #include "task.h"\r
47 \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
51         TRACE_CLASS_QUEUE,\r
52         TRACE_CLASS_MUTEX,\r
53         TRACE_CLASS_SEMAPHORE,\r
54         TRACE_CLASS_SEMAPHORE,\r
55         TRACE_CLASS_MUTEX\r
56 };\r
57 \r
58 int uiInEventGroupSetBitsFromISR = 0;\r
59 \r
60 extern unsigned char ucQueueGetQueueType(void*);\r
61 \r
62 #if (FREERTOS_VERSION < FREERTOS_VERSION_8_0_OR_LATER)\r
63 \r
64 extern portBASE_TYPE ucQueueGetQueueNumber(void*);\r
65 \r
66 objectHandleType prvTraceGetObjectNumber(void* handle)\r
67 {\r
68         return (objectHandleType) ucQueueGetQueueNumber(handle);\r
69 }\r
70 \r
71 #else\r
72 \r
73 extern portBASE_TYPE uxQueueGetQueueNumber(void*);\r
74 \r
75 objectHandleType prvTraceGetObjectNumber(void* handle)\r
76 {\r
77         return (objectHandleType) uxQueueGetQueueNumber(handle);\r
78 }\r
79 \r
80 #endif\r
81 \r
82 unsigned char prvTraceGetObjectType(void* handle)\r
83 {\r
84         return ucQueueGetQueueType(handle);\r
85 }\r
86 \r
87 objectHandleType prvTraceGetTaskNumber(void* handle)\r
88 {\r
89         return (objectHandleType)uxTaskGetTaskNumber(handle);\r
90 }\r
91 \r
92 unsigned char prvTraceIsSchedulerActive()\r
93 {\r
94         return xTaskGetSchedulerState() == taskSCHEDULER_RUNNING;\r
95 }\r
96 \r
97 unsigned char prvTraceIsSchedulerSuspended()\r
98 {\r
99         return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED;\r
100 }\r
101 \r
102 unsigned char prvTraceIsSchedulerStarted()\r
103 {\r
104         return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED;\r
105 }\r
106 \r
107 void* prvTraceGetCurrentTaskHandle()\r
108 {\r
109         return xTaskGetCurrentTaskHandle();\r
110 }\r
111 \r
112 /* Initialization of the object property table */\r
113 void vTraceInitObjectPropertyTable()\r
114 {\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
145 }\r
146 \r
147 /* Initialization of the handle mechanism, see e.g, xTraceGetObjectHandle */\r
148 void vTraceInitObjectHandleStack()\r
149 {\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
157 \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
165 }\r
166         \r
167 /* Returns the "Not enough handles" error message for this object class */\r
168 const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)\r
169 {\r
170         switch(objectclass)\r
171         {\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
186         default:\r
187                 return "pszTraceGetErrorHandles: Invalid objectclass!";\r
188         }\r
189 }\r
190 \r
191 /* Returns the exclude state of the object */\r
192 uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType handle)\r
193 {\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
196         \r
197         switch(objectclass)\r
198         {\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
211         }\r
212         \r
213         vTraceError("Invalid object class ID in uiTraceIsObjectExcluded!");\r
214         \r
215         /* Must never reach */\r
216         return 1;\r
217 }\r
218 \r
219 #endif