]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/FreeRTOS-Plus-Trace/trcKernelPort.c
Update the ucQueueNumber member of the queue structure (used with FreeRTOS+Trace...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-Trace / trcKernelPort.c
1 /*******************************************************************************\r
2  * Tracealyzer v2.5.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 traceObjectClass TraceObjectClassTable[5] = {\r
47         TRACE_CLASS_QUEUE,\r
48         TRACE_CLASS_MUTEX,\r
49         TRACE_CLASS_SEMAPHORE,\r
50         TRACE_CLASS_SEMAPHORE,\r
51         TRACE_CLASS_MUTEX\r
52 };\r
53 \r
54 extern unsigned char ucQueueGetQueueType(void*);\r
55 extern unsigned portBASE_TYPE uxQueueGetQueueNumber(void*);\r
56 \r
57 objectHandleType prvTraceGetObjectNumber(void* handle)\r
58 {\r
59         return uxQueueGetQueueNumber(handle);   \r
60 }\r
61 \r
62 unsigned char prvTraceGetObjectType(void* handle)\r
63 {\r
64         return ucQueueGetQueueType(handle);\r
65 }\r
66 \r
67 objectHandleType prvTraceGetTaskNumber(void* handle)\r
68 {\r
69         return (objectHandleType)uxTaskGetTaskNumber(handle);\r
70 }\r
71 \r
72 void prvTraceEnterCritical()\r
73 {\r
74         taskENTER_CRITICAL();\r
75 }\r
76 \r
77 void prvTraceExitCritical()\r
78 {\r
79         taskEXIT_CRITICAL();\r
80 }\r
81 \r
82 unsigned char prvTraceIsSchedulerActive()\r
83 {\r
84         return xTaskGetSchedulerState() == taskSCHEDULER_RUNNING;\r
85 }\r
86 \r
87 unsigned char prvTraceIsSchedulerSuspended()\r
88 {\r
89         return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED;\r
90 }\r
91 \r
92 unsigned char prvTraceIsSchedulerStarted()\r
93 {\r
94         return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED;\r
95 }\r
96 \r
97 void* prvTraceGetCurrentTaskHandle()\r
98 {\r
99         return xTaskGetCurrentTaskHandle();\r
100 }\r
101 \r
102 /* Initialization of the object property table */\r
103 void vTraceInitObjectPropertyTable()\r
104 {\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
127 }\r
128 \r
129 /* Initialization of the handle mechanism, see e.g, xTraceGetObjectHandle */\r
130 void vTraceInitObjectHandleStack()\r
131 {\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
147 }\r
148         \r
149 /* Returns the "Not enough handles" error message for this object class */\r
150 const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)\r
151 {\r
152         switch(objectclass)\r
153         {\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
164         default:\r
165                 return "pszTraceGetErrorHandles: Invalid objectclass!";\r
166         }\r
167 }\r
168 \r
169 /* Returns the exclude state of the object */\r
170 uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, objectHandleType handle)\r
171 {\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
174         \r
175         switch(objectclass)\r
176         {\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
185         }\r
186         \r
187         /* Must never reach */\r
188         return 1;\r
189 }\r
190 \r
191 #endif