]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/FreeRTOS-Plus-Trace/trcKernelPort.c
166dbcc3460b72e81b0672a65b2d418921622445
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-Trace / trcKernelPort.c
1 /*******************************************************************************\r
2  * Tracealyzer v2.6.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  * Copyright Percepio AB, 2013.\r
35  * www.percepio.com\r
36  ******************************************************************************/\r
37 \r
38 #include "trcKernelPort.h"\r
39 \r
40 #if (USE_TRACEALYZER_RECORDER == 1)\r
41 \r
42 #include <stdint.h>\r
43 \r
44 #include "task.h"\r
45 \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
49         TRACE_CLASS_QUEUE,\r
50         TRACE_CLASS_MUTEX,\r
51         TRACE_CLASS_SEMAPHORE,\r
52         TRACE_CLASS_SEMAPHORE,\r
53         TRACE_CLASS_MUTEX\r
54 };\r
55 \r
56 int uiInEventGroupSetBitsFromISR = 0;\r
57 \r
58 extern unsigned char ucQueueGetQueueType(void*);\r
59 extern portBASE_TYPE uxQueueGetQueueNumber(void*);\r
60 \r
61 objectHandleType prvTraceGetObjectNumber(void* handle)\r
62 {\r
63         return ( objectHandleType ) uxQueueGetQueueNumber(handle);      \r
64 }\r
65 \r
66 unsigned char prvTraceGetObjectType(void* handle)\r
67 {\r
68         return ucQueueGetQueueType(handle);\r
69 }\r
70 \r
71 objectHandleType prvTraceGetTaskNumber(void* handle)\r
72 {\r
73         return (objectHandleType)uxTaskGetTaskNumber(handle);\r
74 }\r
75 \r
76 unsigned char prvTraceIsSchedulerActive()\r
77 {\r
78         return xTaskGetSchedulerState() == taskSCHEDULER_RUNNING;\r
79 }\r
80 \r
81 unsigned char prvTraceIsSchedulerSuspended()\r
82 {\r
83         return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED;\r
84 }\r
85 \r
86 unsigned char prvTraceIsSchedulerStarted()\r
87 {\r
88         return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED;\r
89 }\r
90 \r
91 void* prvTraceGetCurrentTaskHandle()\r
92 {\r
93         return xTaskGetCurrentTaskHandle();\r
94 }\r
95 \r
96 /* Initialization of the object property table */\r
97 void vTraceInitObjectPropertyTable()\r
98 {\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
129 }\r
130 \r
131 /* Initialization of the handle mechanism, see e.g, xTraceGetObjectHandle */\r
132 void vTraceInitObjectHandleStack()\r
133 {\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
141 \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
149 }\r
150         \r
151 /* Returns the "Not enough handles" error message for this object class */\r
152 const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)\r
153 {\r
154         switch(objectclass)\r
155         {\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
170         default:\r
171                 return "pszTraceGetErrorHandles: Invalid objectclass!";\r
172         }\r
173 }\r
174 \r
175 /* Returns the exclude state of the object */\r
176 uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType handle)\r
177 {\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
180         \r
181         switch(objectclass)\r
182         {\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
195         }\r
196         \r
197         vTraceError("Invalid object class ID in uiTraceIsObjectExcluded!");\r
198         \r
199         /* Must never reach */\r
200         return 1;\r
201 }\r
202 \r
203 #endif