]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/FreeRTOS-Plus-Trace(streaming)/trcKernelPort.h
554cabcd09e0fb4089c7b8e6781ec7f06eb23440
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-Trace(streaming) / trcKernelPort.h
1 /*******************************************************************************\r
2  * Trace Recorder Library for Tracealyzer v3.0.2\r
3  * Percepio AB, www.percepio.com\r
4  *\r
5  * trcKernelPort.h\r
6  *\r
7  * The kernel-specific definitions for FreeRTOS.\r
8  *\r
9  * Terms of Use\r
10  * This software (the "Tracealyzer Recorder Library") is the intellectual\r
11  * property of Percepio AB and may not be sold or in other ways commercially\r
12  * redistributed without explicit written permission by Percepio AB.\r
13  *\r
14  * Separate conditions applies for the SEGGER branded source code included.\r
15  *\r
16  * The recorder library is free for use together with Percepio products.\r
17  * You may distribute the recorder library in its original form, but public\r
18  * distribution of modified versions require approval by Percepio AB.\r
19  *\r
20  * Disclaimer\r
21  * The trace tool and recorder library is being delivered to you AS IS and\r
22  * Percepio AB makes no warranty as to its use or performance. Percepio AB does\r
23  * not and cannot warrant the performance or results you may obtain by using the\r
24  * software or documentation. Percepio AB make no warranties, express or\r
25  * implied, as to noninfringement of third party rights, merchantability, or\r
26  * fitness for any particular purpose. In no event will Percepio AB, its\r
27  * technology partners, or distributors be liable to you for any consequential,\r
28  * incidental or special damages, including any lost profits or lost savings,\r
29  * even if a representative of Percepio AB has been advised of the possibility\r
30  * of such damages, or for any claim by any third party. Some jurisdictions do\r
31  * not allow the exclusion or limitation of incidental, consequential or special\r
32  * damages, or the exclusion of implied warranties or limitations on how long an\r
33  * implied warranty may last, so the above limitations may not apply to you.\r
34  *\r
35  * Tabs are used for indent in this file (1 tab = 4 spaces)\r
36  *\r
37  * Copyright Percepio AB, 2015.\r
38  * www.percepio.com\r
39  ******************************************************************************/\r
40 \r
41 \r
42 #ifndef TRC_KERNEL_PORT_H\r
43 #define TRC_KERNEL_PORT_H\r
44 \r
45 #ifdef __cplusplus\r
46 extern \93C\94 {\r
47 #endif\r
48 \r
49 #include "FreeRTOS.h"   /* Defines configUSE_TRACE_FACILITY */\r
50 #include "trcConfig.h"\r
51 #include "trcHardwarePort.h"\r
52 \r
53 extern int uiInEventGroupSetBitsFromISR;\r
54 \r
55 #define USE_TRACEALYZER_RECORDER configUSE_TRACE_FACILITY\r
56 \r
57 #if (USE_TRACEALYZER_RECORDER == 1)\r
58 \r
59 /*******************************************************************************\r
60  * Trace_Init\r
61  *\r
62  * The main initalization routine for the embOS-Trace recorder. Configures RTT,\r
63  * activates the PTRACE instrumentation in embOS and the TzCtrl task.\r
64  * Also sets up the diagnostic User Event channels used by TzCtrl task.\r
65  *\r
66  * Settings used by the trace recorder are found in these header files:\r
67  *  - SEGGER_RTT_Conf.h: settings for SEGGER Real-Time Terminal (RTT) which is\r
68  *    used for the trace streaming.\r
69  *  - trcKernelPort.h: RTT related settings for the trace streaming.\r
70  *  - trcRecorder.h - settings for allocation of internal recorder tables.\r
71  *  - trcHardwarePort.h - hardware-specific configuration (timestamping).\r
72  ******************************************************************************/\r
73 void Trace_Init(void);\r
74 \r
75 /*******************************************************************************\r
76  * vTraceOnTraceBegin\r
77  *\r
78  * Called on trace begin.\r
79  ******************************************************************************/\r
80 void vTraceOnTraceBegin(void);\r
81 \r
82 /*******************************************************************************\r
83  * vTraceOnTraceEnd\r
84  *\r
85  * Called on trace end.\r
86  ******************************************************************************/\r
87 void vTraceOnTraceEnd(void);\r
88 \r
89 #include "trcRecorder.h"\r
90 \r
91 /* Defines that must be set for the recorder to work properly */\r
92 #define KERNEL_ID 0x1AA1\r
93 #define TRACE_TICK_RATE_HZ configTICK_RATE_HZ /* Defined in "FreeRTOS.h" */\r
94 #define TRACE_CPU_CLOCK_HZ configCPU_CLOCK_HZ /* Defined in "FreeRTOSConfig.h" */\r
95 \r
96 #if (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_ARM_Cortex_M)\r
97         \r
98         /* Uses CMSIS API. Must be #included in trcConfig.h. */\r
99         #define TRACE_ALLOC_CRITICAL_SECTION() int __irq_status;\r
100         #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = __get_PRIMASK(); __set_PRIMASK(1);}\r
101         #define TRACE_EXIT_CRITICAL_SECTION() {__set_PRIMASK(__irq_status);}\r
102 \r
103 #endif\r
104 \r
105 #if ((TRC_RECORDER_HARDWARE_PORT == TRC_PORT_ARM_CORTEX_A9) || (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_Renesas_RX600))\r
106         #define TRACE_ALLOC_CRITICAL_SECTION() int __irq_status;\r
107         #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = portSET_INTERRUPT_MASK_FROM_ISR();}\r
108         #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR(__irq_status);}\r
109 #endif\r
110 \r
111 #ifndef TRACE_ENTER_CRITICAL_SECTION\r
112         #error "This port has no valid definition for critical sections! See http://percepio.com/2014/10/27/how-to-define-critical-sections-for-the-recorder/"\r
113 #endif\r
114 \r
115 void* prvTraceGetCurrentTaskHandle(void);\r
116 uint32_t prvIsNewTCB(void* pNewTCB);\r
117 \r
118 #define OS_IS_SWITCH_FROM_INT_REQUIRED() 0\r
119 #define TRACE_GET_CURRENT_TASK() prvTraceGetCurrentTaskHandle()\r
120 \r
121 /*************************************************************************/\r
122 /* KERNEL SPECIFIC OBJECT CONFIGURATION                                                                  */\r
123 /*************************************************************************/\r
124 \r
125 /*******************************************************************************\r
126  * The event codes - should match the offline config file.\r
127  *\r
128  * Some sections below are encoded to allow for constructions like:\r
129  *\r
130  * vTraceStoreKernelCall(EVENTGROUP_CREATE + objectclass, ...\r
131  *\r
132  * The object class ID is given by the three LSB bits, in such cases. Since each\r
133  * object class has a separate object property table, the class ID is needed to\r
134  * know what section in the object table to use for getting an object name from\r
135  * an object handle.\r
136  ******************************************************************************/\r
137 \r
138 #define PSF_EVENT_NULL_EVENT                                                            0x00\r
139 \r
140 /* PSF event codes */\r
141 #define PSF_EVENT_TRACE_START                                                           0x01\r
142 #define PSF_EVENT_TS_CONFIG                                                                     0x02\r
143 #define PSF_EVENT_OBJ_NAME                                                                      0x03\r
144 #define PSF_EVENT_TASK_PRIORITY                                                         0x04\r
145 #define PSF_EVENT_TASK_PRIO_INHERIT                                                     0x05\r
146 #define PSF_EVENT_TASK_PRIO_DISINHERIT                                          0x06\r
147 #define PSF_EVENT_DEFINE_ISR                                                            0x07\r
148 \r
149 #define PSF_EVENT_TASK_CREATE                                                           0x10\r
150 #define PSF_EVENT_QUEUE_CREATE                                                          0x11\r
151 #define PSF_EVENT_SEMAPHORE_BINARY_CREATE                                       0x12\r
152 #define PSF_EVENT_MUTEX_CREATE                                                          0x13\r
153 #define PSF_EVENT_TIMER_CREATE                                                          0x14\r
154 #define PSF_EVENT_EVENTGROUP_CREATE                                                     0x15\r
155 #define PSF_EVENT_SEMAPHORE_COUNTING_CREATE                                     0x16\r
156 #define PSF_EVENT_MUTEX_RECURSIVE_CREATE                                        0x17\r
157 \r
158 #define PSF_EVENT_TASK_DELETE                                                           0x20\r
159 #define PSF_EVENT_QUEUE_DELETE                                                          0x21\r
160 #define PSF_EVENT_SEMAPHORE_DELETE                                                      0x22\r
161 #define PSF_EVENT_MUTEX_DELETE                                                          0x23\r
162 #define PSF_EVENT_TIMER_DELETE                                                          0x24\r
163 #define PSF_EVENT_EVENTGROUP_DELETE                                                     0x25\r
164 \r
165 #define PSF_EVENT_TASK_READY                                                            0x30\r
166 #define PSF_EVENT_NEW_TIME                                                                      0x31\r
167 #define PSF_EVENT_NEW_TIME_SCHEDULER_SUSPENDED                          0x32\r
168 #define PSF_EVENT_ISR_BEGIN                                                                     0x33\r
169 #define PSF_EVENT_ISR_RESUME                                                            0x34\r
170 #define PSF_EVENT_TS_BEGIN                                                                      0x35\r
171 #define PSF_EVENT_TS_RESUME                                                                     0x36\r
172 #define PSF_EVENT_TASK_ACTIVATE                                                         0x37\r
173 \r
174 #define PSF_EVENT_MALLOC                                                                        0x38\r
175 #define PSF_EVENT_FREE                                                                          0x39\r
176 \r
177 #define PSF_EVENT_LOWPOWER_BEGIN                                                        0x3A\r
178 #define PSF_EVENT_LOWPOWER_END                                                          0x3B\r
179 \r
180 #define PSF_EVENT_IFE_NEXT                                                                      0x3C\r
181 #define PSF_EVENT_IFE_DIRECT                                                            0x3D\r
182 \r
183 #define PSF_EVENT_TASK_CREATE_FAILED                                            0x40\r
184 #define PSF_EVENT_QUEUE_CREATE_FAILED                                           0x41\r
185 #define PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED                        0x42\r
186 #define PSF_EVENT_MUTEX_CREATE_FAILED                                           0x43\r
187 #define PSF_EVENT_TIMER_CREATE_FAILED                                           0x44\r
188 #define PSF_EVENT_EVENTGROUP_CREATE_FAILED                                      0x45\r
189 #define PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED                      0x46\r
190 #define PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED                         0x47\r
191 \r
192 #define PSF_EVENT_TIMER_DELETE_FAILED                                           0x48\r
193 \r
194 #define PSF_EVENT_QUEUE_SEND                                                            0x50\r
195 #define PSF_EVENT_SEMAPHORE_GIVE                                                        0x51\r
196 #define PSF_EVENT_MUTEX_GIVE                                                            0x52\r
197 \r
198 #define PSF_EVENT_QUEUE_SEND_FAILED                                                     0x53\r
199 #define PSF_EVENT_SEMAPHORE_GIVE_FAILED                                         0x54\r
200 #define PSF_EVENT_MUTEX_GIVE_FAILED                                                     0x55\r
201 \r
202 #define PSF_EVENT_QUEUE_SEND_BLOCK                                                      0x56\r
203 #define PSF_EVENT_SEMAPHORE_GIVE_BLOCK                                          0x57\r
204 #define PSF_EVENT_MUTEX_GIVE_BLOCK                                                      0x58\r
205 \r
206 #define PSF_EVENT_QUEUE_SEND_FROMISR                                            0x59\r
207 #define PSF_EVENT_SEMAPHORE_GIVE_FROMISR                                        0x5A\r
208 \r
209 #define PSF_EVENT_QUEUE_SEND_FROMISR_FAILED                                     0x5C\r
210 #define PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED                         0x5D\r
211 \r
212 #define PSF_EVENT_QUEUE_RECEIVE                                                         0x60\r
213 #define PSF_EVENT_SEMAPHORE_TAKE                                                        0x61\r
214 #define PSF_EVENT_MUTEX_TAKE                                                            0x62\r
215 \r
216 #define PSF_EVENT_QUEUE_RECEIVE_FAILED                                          0x63\r
217 #define PSF_EVENT_SEMAPHORE_TAKE_FAILED                                         0x64\r
218 #define PSF_EVENT_MUTEX_TAKE_FAILED                                                     0x65\r
219 \r
220 #define PSF_EVENT_QUEUE_RECEIVE_BLOCK                                           0x66\r
221 #define PSF_EVENT_SEMAPHORE_TAKE_BLOCK                                          0x67\r
222 #define PSF_EVENT_MUTEX_TAKE_BLOCK                                                      0x68\r
223 \r
224 #define PSF_EVENT_QUEUE_RECEIVE_FROMISR                                         0x69\r
225 #define PSF_EVENT_SEMAPHORE_TAKE_FROMISR                                        0x6A\r
226 \r
227 #define PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED                          0x6C\r
228 #define PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED                         0x6D\r
229 \r
230 #define PSF_EVENT_QUEUE_PEEK                                                            0x70\r
231 #define PSF_EVENT_SEMAPHORE_PEEK                                                        0x71    /* Will never be used */\r
232 #define PSF_EVENT_MUTEX_PEEK                                                            0x72    /* Will never be used */\r
233 \r
234 #define PSF_EVENT_QUEUE_PEEK_FAILED                                                     0x73\r
235 #define PSF_EVENT_SEMAPHORE_PEEK_FAILED                                         0x74    /* Will never be used */\r
236 #define PSF_EVENT_MUTEX_PEEK_FAILED                                                     0x75    /* Will never be used */\r
237 \r
238 #define PSF_EVENT_QUEUE_PEEK_BLOCK                                                      0x76\r
239 #define PSF_EVENT_SEMAPHORE_PEEK_BLOCK                                          0x77    /* Will never be used */\r
240 #define PSF_EVENT_MUTEX_PEEK_BLOCK                                                      0x78    /* Will never be used */\r
241 \r
242 #define PSF_EVENT_TASK_DELAY_UNTIL                                                      0x79\r
243 #define PSF_EVENT_TASK_DELAY                                                            0x7A\r
244 #define PSF_EVENT_TASK_SUSPEND                                                          0x7B\r
245 #define PSF_EVENT_TASK_RESUME                                                           0x7C\r
246 #define PSF_EVENT_TASK_RESUME_FROMISR                                           0x7D\r
247 \r
248 #define PSF_EVENT_TIMER_PENDFUNCCALL                                            0x80\r
249 #define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR                            0x81\r
250 #define PSF_EVENT_TIMER_PENDFUNCCALL_FAILED                                     0x82\r
251 #define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED                     0x83\r
252 \r
253 #define PSF_EVENT_USER_EVENT                                                            0x90\r
254 \r
255 #define PSF_EVENT_TIMER_START                                                           0xA0\r
256 #define PSF_EVENT_TIMER_RESET                                                           0xA1\r
257 #define PSF_EVENT_TIMER_STOP                                                            0xA2\r
258 #define PSF_EVENT_TIMER_CHANGEPERIOD                                            0xA3\r
259 #define PSF_EVENT_TIMER_START_FROMISR                                           0xA4\r
260 #define PSF_EVENT_TIMER_RESET_FROMISR                                           0xA5\r
261 #define PSF_EVENT_TIMER_STOP_FROMISR                                            0xA6\r
262 #define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR                            0xA7\r
263 #define PSF_EVENT_TIMER_START_FAILED                                            0xA8\r
264 #define PSF_EVENT_TIMER_RESET_FAILED                                            0xA9\r
265 #define PSF_EVENT_TIMER_STOP_FAILED                                                     0xAA\r
266 #define PSF_EVENT_TIMER_CHANGEPERIOD_FAILED                                     0xAB\r
267 #define PSF_EVENT_TIMER_START_FROMISR_FAILED                            0xAC\r
268 #define PSF_EVENT_TIMER_RESET_FROMISR_FAILED                            0xAD\r
269 #define PSF_EVENT_TIMER_STOP_FROMISR_FAILED                                     0xAE\r
270 #define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED                     0xAF\r
271 \r
272 #define PSF_EVENT_EVENTGROUP_SYNC                                                       0xB0\r
273 #define PSF_EVENT_EVENTGROUP_WAITBITS                                           0xB1\r
274 #define PSF_EVENT_EVENTGROUP_CLEARBITS                                          0xB2\r
275 #define PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR                          0xB3\r
276 #define PSF_EVENT_EVENTGROUP_SETBITS                                            0xB4\r
277 #define PSF_EVENT_EVENTGROUP_SETBITS_FROMISR                            0xB5\r
278 #define PSF_EVENT_EVENTGROUP_SYNC_BLOCK                                         0xB6\r
279 #define PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK                                     0xB7\r
280 #define PSF_EVENT_EVENTGROUP_SYNC_FAILED                                        0xB8\r
281 #define PSF_EVENT_EVENTGROUP_WAITBITS_FAILED                            0xB9\r
282 \r
283 #define PSF_EVENT_QUEUE_SEND_FRONT                                                      0xC0\r
284 #define PSF_EVENT_QUEUE_SEND_FRONT_FAILED                                       0xC1\r
285 #define PSF_EVENT_QUEUE_SEND_FRONT_BLOCK                                        0xC2\r
286 #define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR                                      0xC3\r
287 #define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED                       0xC4\r
288 #define PSF_EVENT_MUTEX_GIVE_RECURSIVE                                          0xC5\r
289 #define PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED                           0xC6\r
290 #define PSF_EVENT_MUTEX_TAKE_RECURSIVE                                          0xC7\r
291 #define PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED                           0xC8\r
292 \r
293 #define PSF_EVENT_TASK_NOTIFY                                                           0xC9\r
294 #define PSF_EVENT_TASK_NOTIFY_TAKE                                                      0xCA\r
295 #define PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK                                        0xCB\r
296 #define PSF_EVENT_TASK_NOTIFY_TAKE_FAILED                                       0xCC\r
297 #define PSF_EVENT_TASK_NOTIFY_WAIT                                                      0xCD\r
298 #define PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK                                        0xCE\r
299 #define PSF_EVENT_TASK_NOTIFY_WAIT_FAILED                                       0xCF\r
300 #define PSF_EVENT_TASK_NOTIFY_FROM_ISR                                          0xD0\r
301 #define PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR                                     0xD1\r
302 \r
303 #define TRACE_GET_OS_TICKS() (uiTraceTickCount)\r
304 \r
305 /************************************************************************/\r
306 /* KERNEL SPECIFIC DATA AND FUNCTIONS NEEDED TO PROVIDE THE                             */\r
307 /* FUNCTIONALITY REQUESTED BY THE TRACE RECORDER                                                */\r
308 /************************************************************************/\r
309 \r
310 #if (configUSE_TIMERS == 1)\r
311 #undef INCLUDE_xTimerGetTimerDaemonTaskHandle\r
312 #define INCLUDE_xTimerGetTimerDaemonTaskHandle 1\r
313 #endif\r
314 \r
315 /************************************************************************/\r
316 /* KERNEL SPECIFIC MACROS USED BY THE TRACE RECORDER                                    */\r
317 /************************************************************************/\r
318 \r
319 #define TRACE_MALLOC(size) pvPortMalloc(size)\r
320 \r
321 /************************************************************************/\r
322 /* KERNEL SPECIFIC WRAPPERS THAT SHOULD BE CALLED BY THE KERNEL          */\r
323 /************************************************************************/\r
324 \r
325 #if (configUSE_TICKLESS_IDLE != 0)\r
326 \r
327 #undef traceLOW_POWER_IDLE_BEGIN\r
328 #define traceLOW_POWER_IDLE_BEGIN() \\r
329         { \\r
330                 vTraceStoreEvent0(PSF_EVENT_LOWPOWER_BEGIN); \\r
331         }\r
332 \r
333 #undef traceLOW_POWER_IDLE_END\r
334 #define traceLOW_POWER_IDLE_END() \\r
335         { \\r
336                 vTraceStoreEvent0(PSF_EVENT_LOWPOWER_END); \\r
337         }\r
338 \r
339 #endif\r
340 \r
341 /* A macro that will update the tick count when returning from tickless idle */\r
342 #undef traceINCREASE_TICK_COUNT\r
343 /* Note: This can handle time adjustments of max 2^32 ticks, i.e., 35 seconds at 120 MHz. Thus, tick-less idle periods longer than 2^32 ticks will appear "compressed" on the time line.*/\r
344 #define traceINCREASE_TICK_COUNT( xCount ) \r
345 \r
346 /* Called for each task that becomes ready */\r
347 #undef traceMOVED_TASK_TO_READY_STATE\r
348 #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \\r
349         vTraceStoreEvent1(PSF_EVENT_TASK_READY, (uint32_t)pxTCB);\r
350 \r
351 /* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */\r
352 #undef traceTASK_INCREMENT_TICK\r
353 #if (TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_7_3_OR_7_4)\r
354 \r
355 #define traceTASK_INCREMENT_TICK( xTickCount ) \\r
356         if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxMissedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \\r
357         if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { vTraceStoreEvent1(PSF_EVENT_NEW_TIME, (xTickCount + 1)); }\r
358 \r
359 #else\r
360 \r
361 #define traceTASK_INCREMENT_TICK( xTickCount ) \\r
362         if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxPendedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \\r
363         if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { vTraceStoreEvent1(PSF_EVENT_NEW_TIME, (xTickCount + 1)); }\r
364 \r
365 #endif\r
366 \r
367 /* Called on each task-switch */\r
368 #undef traceTASK_SWITCHED_IN\r
369 #define traceTASK_SWITCHED_IN() \\r
370         if (prvIsNewTCB(pxCurrentTCB)) \\r
371         { \\r
372                 vTraceStoreEvent2(PSF_EVENT_TASK_ACTIVATE, (uint32_t)pxCurrentTCB, pxCurrentTCB->uxPriority); \\r
373         }\r
374 \r
375 /* Called on vTaskSuspend */\r
376 #undef traceTASK_SUSPEND\r
377 #define traceTASK_SUSPEND( pxTaskToSuspend ) \\r
378         vTraceStoreEvent1(PSF_EVENT_TASK_SUSPEND, (uint32_t)pxTaskToSuspend);\r
379 \r
380 /* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */\r
381 #undef traceTASK_DELAY\r
382 #define traceTASK_DELAY() \\r
383         vTraceStoreEvent1(PSF_EVENT_TASK_DELAY, xTicksToDelay);\r
384 \r
385 /* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */\r
386 #undef traceTASK_DELAY_UNTIL\r
387 #define traceTASK_DELAY_UNTIL() \\r
388         vTraceStoreEvent1(PSF_EVENT_TASK_DELAY_UNTIL, xTimeToWake);\r
389 \r
390 /* Called on vTaskDelete */\r
391 #undef traceTASK_DELETE\r
392 #define traceTASK_DELETE( pxTaskToDelete ) \\r
393         vTraceStoreEvent2(PSF_EVENT_TASK_DELETE, (uint32_t)pxTaskToDelete, (pxTaskToDelete != NULL) ? (pxTaskToDelete->uxPriority) : 0);\r
394 \r
395 /* Called on vQueueDelete */\r
396 #undef traceQUEUE_DELETE\r
397 #define traceQUEUE_DELETE( pxQueue ) \\r
398         switch (pxQueue->ucQueueType) \\r
399         { \\r
400                 case queueQUEUE_TYPE_BASE: \\r
401                         vTraceStoreEvent2(PSF_EVENT_QUEUE_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \\r
402                         break; \\r
403                 case queueQUEUE_TYPE_MUTEX: \\r
404                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
405                         vTraceStoreEvent2(PSF_EVENT_MUTEX_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \\r
406                         break; \\r
407                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
408                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
409                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \\r
410                         break; \\r
411         }\r
412 \r
413 /* Called on vTaskCreate */\r
414 #undef traceTASK_CREATE\r
415 #define traceTASK_CREATE(pxNewTCB) \\r
416         if (pxNewTCB != NULL) \\r
417         { \\r
418                 vTraceSaveSymbol(pxNewTCB, (const char*)pcName); \\r
419                 vTraceSaveObjectData(pxNewTCB, uxPriority); \\r
420                 vTraceStoreStringEvent(1, PSF_EVENT_OBJ_NAME, pcName, pxNewTCB); \\r
421                 vTraceStoreEvent2(PSF_EVENT_TASK_CREATE, (uint32_t)pxNewTCB, uxPriority); \\r
422         }\r
423 \r
424 /* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */\r
425 #undef traceTASK_CREATE_FAILED\r
426 #define traceTASK_CREATE_FAILED() \\r
427         vTraceStoreEvent0(PSF_EVENT_TASK_CREATE_FAILED);\r
428 \r
429 /* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */\r
430 #undef traceQUEUE_CREATE\r
431 #define traceQUEUE_CREATE( pxNewQueue )\\r
432         switch (pxNewQueue->ucQueueType) \\r
433         { \\r
434                 case queueQUEUE_TYPE_BASE: \\r
435                         vTraceStoreEvent2(PSF_EVENT_QUEUE_CREATE, (uint32_t)pxNewQueue, pxNewQueue->uxLength); \\r
436                         break; \\r
437                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
438                         vTraceStoreEvent1(PSF_EVENT_SEMAPHORE_BINARY_CREATE, (uint32_t)pxNewQueue); \\r
439                         break; \\r
440         }\r
441 \r
442 /* Called in xQueueCreate, if the queue creation fails */\r
443 #undef traceQUEUE_CREATE_FAILED\r
444 #define traceQUEUE_CREATE_FAILED( queueType ) \\r
445         switch (queueType) \\r
446         { \\r
447                 case queueQUEUE_TYPE_BASE: \\r
448                         vTraceStoreEvent0(PSF_EVENT_QUEUE_CREATE_FAILED); \\r
449                         break; \\r
450                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
451                         vTraceStoreEvent0(PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED); \\r
452                         break; \\r
453         }\r
454 \r
455 /* Called in xQueueCreateCountingSemaphore, if the queue creation fails */\r
456 #undef traceCREATE_COUNTING_SEMAPHORE\r
457 #if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
458 #define traceCREATE_COUNTING_SEMAPHORE() \\r
459         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)xHandle, ((Queue_t *) xHandle)->uxMessagesWaiting);\r
460 #else\r
461 #define traceCREATE_COUNTING_SEMAPHORE() \\r
462         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)pxHandle, pxHandle->uxMessagesWaiting);\r
463 #endif\r
464 \r
465 #undef traceCREATE_COUNTING_SEMAPHORE_FAILED\r
466 #define traceCREATE_COUNTING_SEMAPHORE_FAILED() \\r
467         vTraceStoreEvent0(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED);\r
468 \r
469 /* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */\r
470 #undef traceCREATE_MUTEX\r
471 #define traceCREATE_MUTEX( pxNewQueue ) \\r
472         switch (ucQueueType) \\r
473         { \\r
474                 case queueQUEUE_TYPE_MUTEX: \\r
475                         vTraceStoreEvent1(PSF_EVENT_MUTEX_CREATE, (uint32_t)pxNewQueue); \\r
476                         break; \\r
477                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
478                         vTraceStoreEvent1(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (uint32_t)pxNewQueue); \\r
479                         break; \\r
480         }\r
481 \r
482 /* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */\r
483 #undef traceCREATE_MUTEX_FAILED\r
484 #define traceCREATE_MUTEX_FAILED() \\r
485         switch (ucQueueType) \\r
486         { \\r
487                 case queueQUEUE_TYPE_MUTEX: \\r
488                         vTraceStoreEvent0(PSF_EVENT_MUTEX_CREATE_FAILED); \\r
489                         break; \\r
490                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
491                         vTraceStoreEvent0(PSF_EVENT_MUTEX_CREATE_FAILED); \\r
492                         break; \\r
493         }\r
494 \r
495 /* Called when a message is sent to a queue */  /* CS IS NEW ! */\r
496 #undef traceQUEUE_SEND\r
497 #define traceQUEUE_SEND( pxQueue ) \\r
498         switch (pxQueue->ucQueueType) \\r
499         { \\r
500                 case queueQUEUE_TYPE_BASE: \\r
501                         vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND : PSF_EVENT_QUEUE_SEND_FRONT, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
502                         break; \\r
503                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
504                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
505                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
506                         break; \\r
507                 case queueQUEUE_TYPE_MUTEX: \\r
508                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
509                         vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE, (uint32_t)pxQueue); \\r
510                         break; \\r
511         }\r
512 \r
513 /* Called when a message failed to be sent to a queue (timeout) */\r
514 #undef traceQUEUE_SEND_FAILED\r
515 #define traceQUEUE_SEND_FAILED( pxQueue ) \\r
516         switch (pxQueue->ucQueueType) \\r
517         { \\r
518                 case queueQUEUE_TYPE_BASE: \\r
519                         vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
520                         break; \\r
521                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
522                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
523                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
524                         break; \\r
525                 case queueQUEUE_TYPE_MUTEX: \\r
526                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
527                         vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_FAILED, (uint32_t)pxQueue); \\r
528                         break; \\r
529         }\r
530 \r
531         /*trcKERNEL_HOOKS_KERNEL_SERVICE(SEND, FAILED, UNUSED, pxQueue);*/\r
532 \r
533 /* Called when the task is blocked due to a send operation on a full queue */\r
534 #undef traceBLOCKING_ON_QUEUE_SEND\r
535 #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \\r
536         switch (pxQueue->ucQueueType) \\r
537         { \\r
538                 case queueQUEUE_TYPE_BASE: \\r
539                         vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_BLOCK : PSF_EVENT_QUEUE_SEND_FRONT_BLOCK, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
540                         break; \\r
541                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
542                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
543                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_BLOCK, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
544                         break; \\r
545                 case queueQUEUE_TYPE_MUTEX: \\r
546                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
547                         vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_BLOCK, (uint32_t)pxQueue); \\r
548                         break; \\r
549         }\r
550 \r
551 /* Called for Recursive Mutex */\r
552 #undef traceGIVE_MUTEX_RECURSIVE\r
553 #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) \\r
554         vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_RECURSIVE, (uint32_t)pxMutex);\r
555 \r
556 /* Called for Recursive Mutex */\r
557 #undef traceGIVE_MUTEX_RECURSIVE_FAILED\r
558 #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) \\r
559         vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED, (uint32_t)pxMutex);\r
560 \r
561 /**************************************************************************/\r
562 /* Hack to make sure xQueueGiveFromISR also has a xCopyPosition parameter */\r
563 /**************************************************************************/\r
564 /* Helpers needed to correctly expand names */\r
565 #define TZ__CAT2(a,b) a ## b\r
566 #define TZ__CAT(a,b) TZ__CAT2(a, b)\r
567 \r
568 /* Expands name if this header is included... uxQueueType must be a macro that only exists in queue.c or whatever, and it must expand to nothing or to something that's valid in identifiers */\r
569 #define xQueueGiveFromISR(a,b) TZ__CAT(xQueueGiveFromISR__, uxQueueType) (a,b)\r
570 \r
571 /* If in queue.c, the "uxQueueType" macro expands to "pcHead". queueSEND_TO_BACK is the value we need to send in */\r
572 #define xQueueGiveFromISR__pcHead(__a, __b) MyWrapper(__a, __b, const BaseType_t xCopyPosition); \\r
573 BaseType_t xQueueGiveFromISR(__a, __b) { return MyWrapper(xQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK); } \\r
574 BaseType_t MyWrapper(__a, __b, const BaseType_t xCopyPosition)\r
575 \r
576 /* If not in queue.c, "uxQueueType" isn't expanded */\r
577 #define xQueueGiveFromISR__uxQueueType(__a, __b) xQueueGiveFromISR(__a,__b)\r
578 \r
579 /**************************************************************************/\r
580 /* End of xQueueGiveFromISR hack                                          */\r
581 /**************************************************************************/\r
582 \r
583 /* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */\r
584 #undef traceQUEUE_SEND_FROM_ISR\r
585 #define traceQUEUE_SEND_FROM_ISR( pxQueue ) \\r
586         switch (pxQueue->ucQueueType) \\r
587         { \\r
588                 case queueQUEUE_TYPE_BASE: \\r
589                         vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
590                         break; \\r
591                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
592                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
593                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
594                         break; \\r
595         }\r
596 \r
597 /* Called when a message send from interrupt context fails (since the queue was full) */\r
598 #undef traceQUEUE_SEND_FROM_ISR_FAILED\r
599 #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \\r
600         switch (pxQueue->ucQueueType) \\r
601         { \\r
602                 case queueQUEUE_TYPE_BASE: \\r
603                         vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
604                         break; \\r
605                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
606                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
607                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
608                         break; \\r
609         }\r
610 \r
611 /* Called when a message is received from a queue */\r
612 #undef traceQUEUE_RECEIVE\r
613 #define traceQUEUE_RECEIVE( pxQueue ) \\r
614         switch (pxQueue->ucQueueType) \\r
615         { \\r
616                 case queueQUEUE_TYPE_BASE: \\r
617                         vTraceStoreEvent3(PSF_EVENT_QUEUE_RECEIVE, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \\r
618                         break; \\r
619                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
620                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
621                         vTraceStoreEvent3(PSF_EVENT_SEMAPHORE_TAKE, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \\r
622                         break; \\r
623                 case queueQUEUE_TYPE_MUTEX: \\r
624                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
625                         vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE, (uint32_t)pxQueue, xTicksToWait); \\r
626                         break; \\r
627         }\r
628 \r
629 /* Called when a receive operation on a queue fails (timeout) */\r
630 #undef traceQUEUE_RECEIVE_FAILED\r
631 #define traceQUEUE_RECEIVE_FAILED( pxQueue ) \\r
632         switch (pxQueue->ucQueueType) \\r
633         { \\r
634                 case queueQUEUE_TYPE_BASE: \\r
635                         vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_QUEUE_RECEIVE_FAILED : PSF_EVENT_QUEUE_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
636                         break; \\r
637                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
638                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
639                         vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_SEMAPHORE_TAKE_FAILED : PSF_EVENT_SEMAPHORE_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
640                         break; \\r
641                 case queueQUEUE_TYPE_MUTEX: \\r
642                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
643                         vTraceStoreEvent2(xJustPeeking == pdFALSE ? PSF_EVENT_MUTEX_TAKE_FAILED : PSF_EVENT_MUTEX_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait); \\r
644                         break; \\r
645         }\r
646 \r
647 /* Called when the task is blocked due to a receive operation on an empty queue */\r
648 #undef traceBLOCKING_ON_QUEUE_RECEIVE\r
649 #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \\r
650         switch (pxQueue->ucQueueType) \\r
651         { \\r
652                 case queueQUEUE_TYPE_BASE: \\r
653                         vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_QUEUE_RECEIVE_BLOCK : PSF_EVENT_QUEUE_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
654                         break; \\r
655                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
656                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
657                         vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_SEMAPHORE_TAKE_BLOCK : PSF_EVENT_SEMAPHORE_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
658                         break; \\r
659                 case queueQUEUE_TYPE_MUTEX: \\r
660                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
661                         vTraceStoreEvent2(xJustPeeking == pdFALSE ? PSF_EVENT_MUTEX_TAKE_BLOCK : PSF_EVENT_MUTEX_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait); \\r
662                         break; \\r
663         }\r
664                 \r
665 #undef traceTAKE_MUTEX_RECURSIVE\r
666 #if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
667 #define traceTAKE_MUTEX_RECURSIVE( pxQueue ) \\r
668         vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE, (uint32_t)pxQueue, xTicksToWait);\r
669 #else\r
670 #define traceTAKE_MUTEX_RECURSIVE( pxQueue ) \\r
671         vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE, (uint32_t)pxQueue, xBlockTime);\r
672 #endif\r
673 \r
674 #undef traceTAKE_MUTEX_RECURSIVE_FAILED\r
675 #if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
676 #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxQueue ) \\r
677 vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED, (uint32_t)pxQueue, xTicksToWait);\r
678 #else\r
679 #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxQueue ) \\r
680 vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED, (uint32_t)pxQueue, xBlockTime);\r
681 #endif\r
682 \r
683 /* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */\r
684 #undef traceQUEUE_RECEIVE_FROM_ISR\r
685 #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \\r
686 switch (pxQueue->ucQueueType) \\r
687         { \\r
688                 case queueQUEUE_TYPE_BASE: \\r
689                         vTraceStoreEvent2(PSF_EVENT_QUEUE_RECEIVE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting - 1); \\r
690                         break; \\r
691                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
692                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
693                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting - 1); \\r
694                         break; \\r
695         }\r
696 \r
697 /* Called when a message receive from interrupt context fails (since the queue was empty) */\r
698 #undef traceQUEUE_RECEIVE_FROM_ISR_FAILED\r
699 #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \\r
700         switch (pxQueue->ucQueueType) \\r
701         { \\r
702                 case queueQUEUE_TYPE_BASE: \\r
703                         vTraceStoreEvent2(PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
704                         break; \\r
705                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
706                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
707                         vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
708                         break; \\r
709         }\r
710 \r
711 /* Called on xQueuePeek */\r
712 #undef traceQUEUE_PEEK\r
713 #define traceQUEUE_PEEK( pxQueue ) \\r
714         switch (pxQueue->ucQueueType) \\r
715         { \\r
716                 case queueQUEUE_TYPE_BASE: \\r
717                         vTraceStoreEvent3(PSF_EVENT_QUEUE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
718                         break; \\r
719                 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
720                 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
721                         vTraceStoreEvent3(PSF_EVENT_SEMAPHORE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
722                         break; \\r
723                 case queueQUEUE_TYPE_MUTEX: \\r
724                 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
725                         vTraceStoreEvent1(PSF_EVENT_MUTEX_PEEK, (uint32_t)pxQueue); \\r
726                         break; \\r
727         }\r
728 \r
729 /* Called in vTaskPrioritySet */\r
730 #undef traceTASK_PRIORITY_SET\r
731 #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \\r
732         vTraceStoreEvent2(PSF_EVENT_TASK_PRIORITY, (uint32_t)pxTask, uxNewPriority);\r
733         \r
734 /* Called in vTaskPriorityInherit, which is called by Mutex operations */\r
735 #undef traceTASK_PRIORITY_INHERIT\r
736 #define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \\r
737         vTraceStoreEvent2(PSF_EVENT_TASK_PRIO_INHERIT, (uint32_t)pxTask, uxNewPriority);\r
738 \r
739 /* Called in vTaskPriorityDisinherit, which is called by Mutex operations */\r
740 #undef traceTASK_PRIORITY_DISINHERIT\r
741 #define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \\r
742         vTraceStoreEvent2(PSF_EVENT_TASK_PRIO_DISINHERIT, (uint32_t)pxTask, uxNewPriority);\r
743 \r
744 /* Called in vTaskResume */\r
745 #undef traceTASK_RESUME\r
746 #define traceTASK_RESUME( pxTaskToResume ) \\r
747         vTraceStoreEvent1(PSF_EVENT_TASK_RESUME, (uint32_t)pxTaskToResume);\r
748 \r
749 /* Called in vTaskResumeFromISR */\r
750 #undef traceTASK_RESUME_FROM_ISR\r
751 #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \\r
752         vTraceStoreEvent1(PSF_EVENT_TASK_RESUME_FROMISR, (uint32_t)pxTaskToResume);\r
753 \r
754 #undef traceMALLOC\r
755 #define traceMALLOC( pvAddress, uiSize ) \\r
756         vTraceStoreEvent2(PSF_EVENT_MALLOC, (uint32_t)pvAddress, (int32_t)uiSize);\r
757 \r
758 #undef traceFREE\r
759 #define traceFREE( pvAddress, uiSize ) \\r
760         vTraceStoreEvent2(PSF_EVENT_FREE, (uint32_t)pvAddress, (int32_t)(-uiSize));\r
761 \r
762 /* Called in timer.c - xTimerCreate */\r
763 #undef traceTIMER_CREATE\r
764 #define traceTIMER_CREATE(tmr) \\r
765         vTraceStoreEvent2(PSF_EVENT_TIMER_CREATE, (uint32_t)tmr, tmr->xTimerPeriodInTicks);\r
766 \r
767 #undef traceTIMER_CREATE_FAILED\r
768 #define traceTIMER_CREATE_FAILED() \\r
769         vTraceStoreEvent0(PSF_EVENT_TIMER_CREATE_FAILED);\r
770 \r
771 #if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
772 #define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \\r
773         case tmrCOMMAND_RESET: \\r
774                 vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET : PSF_EVENT_TIMER_RESET_FAILED, (uint32_t)tmr, xOptionalValue); \\r
775                 break; \\r
776         case tmrCOMMAND_START_FROM_ISR: \\r
777                 vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_START_FROMISR : PSF_EVENT_TIMER_START_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
778                 break; \\r
779         case tmrCOMMAND_RESET_FROM_ISR: \\r
780                 vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET_FROMISR : PSF_EVENT_TIMER_RESET_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
781                 break; \\r
782         case tmrCOMMAND_STOP_FROM_ISR: \\r
783                 vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_STOP_FROMISR : PSF_EVENT_TIMER_STOP_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
784                 break; \\r
785         case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: \\r
786                 vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR : PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
787                 break;\r
788 #else\r
789 #define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \r
790 #endif\r
791 \r
792 /* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */\r
793 #undef traceTIMER_COMMAND_SEND\r
794 #define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \\r
795         switch(xCommandID) \\r
796         { \\r
797                 case tmrCOMMAND_START: \\r
798                         break; \\r
799                 case tmrCOMMAND_STOP: \\r
800                         break; \\r
801                 case tmrCOMMAND_CHANGE_PERIOD: \\r
802                         vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD : PSF_EVENT_TIMER_CHANGEPERIOD_FAILED, (uint32_t)tmr, xOptionalValue); \\r
803                         break; \\r
804                 case tmrCOMMAND_DELETE: \\r
805                         vTraceStoreEvent1((xReturn == pdPASS) ? PSF_EVENT_TIMER_DELETE : PSF_EVENT_TIMER_DELETE_FAILED, (uint32_t)tmr); \\r
806                         break; \\r
807                 traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \\r
808         }\r
809 \r
810 #undef tracePEND_FUNC_CALL\r
811 #define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \\r
812         vTraceStoreEvent1((ret == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL : PSF_EVENT_TIMER_PENDFUNCCALL_FAILED, (uint32_t)func);\r
813 \r
814 #undef tracePEND_FUNC_CALL_FROM_ISR\r
815 #define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \\r
816         vTraceStoreEvent1((ret == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR : PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED, (uint32_t)func);\r
817 \r
818 #undef traceEVENT_GROUP_CREATE\r
819 #define traceEVENT_GROUP_CREATE(eg) \\r
820         vTraceStoreEvent1(PSF_EVENT_EVENTGROUP_CREATE, (uint32_t)eg);\r
821 \r
822 #undef traceEVENT_GROUP_DELETE\r
823 #define traceEVENT_GROUP_DELETE(eg) \\r
824         vTraceStoreEvent1(PSF_EVENT_EVENTGROUP_DELETE, (uint32_t)eg);\r
825 \r
826 #undef traceEVENT_GROUP_CREATE_FAILED\r
827 #define traceEVENT_GROUP_CREATE_FAILED() \\r
828         vTraceStoreEvent0(PSF_EVENT_EVENTGROUP_CREATE_FAILED);\r
829 \r
830 #undef traceEVENT_GROUP_SYNC_BLOCK\r
831 #define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \\r
832         vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SYNC_BLOCK, (uint32_t)eg, bitsToWaitFor);\r
833 \r
834 #undef traceEVENT_GROUP_SYNC_END\r
835 #define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \\r
836         vTraceStoreEvent2((wasTimeout != pdTRUE) ? PSF_EVENT_EVENTGROUP_SYNC : PSF_EVENT_EVENTGROUP_SYNC_FAILED, (uint32_t)eg, bitsToWaitFor);\r
837 \r
838 #undef traceEVENT_GROUP_WAIT_BITS_BLOCK\r
839 #define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \\r
840         vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK, (uint32_t)eg, bitsToWaitFor);\r
841 \r
842 #undef traceEVENT_GROUP_WAIT_BITS_END\r
843 #define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \\r
844         vTraceStoreEvent2((wasTimeout != pdTRUE) ? PSF_EVENT_EVENTGROUP_WAITBITS : PSF_EVENT_EVENTGROUP_WAITBITS_FAILED, (uint32_t)eg, bitsToWaitFor);\r
845 \r
846 #undef traceEVENT_GROUP_CLEAR_BITS\r
847 #define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \\r
848         vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_CLEARBITS, (uint32_t)eg, bitsToClear);\r
849 \r
850 #undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR\r
851 #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \\r
852         vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR, (uint32_t)eg, bitsToClear);\r
853 \r
854 #undef traceEVENT_GROUP_SET_BITS\r
855 #define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \\r
856         vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SETBITS, (uint32_t)eg, bitsToSet);\r
857 \r
858 #undef traceEVENT_GROUP_SET_BITS_FROM_ISR\r
859 #define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \\r
860         vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SETBITS_FROMISR, (uint32_t)eg, bitsToSet);\r
861 \r
862 #undef traceTASK_NOTIFY_TAKE\r
863 #define traceTASK_NOTIFY_TAKE() \\r
864         if (pxCurrentTCB->eNotifyState == eNotified) \\r
865                 vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE, (uint32_t)pxCurrentTCB, xTicksToWait); \\r
866         else \\r
867                 vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);\r
868 \r
869 #undef traceTASK_NOTIFY_TAKE_BLOCK\r
870 #define traceTASK_NOTIFY_TAKE_BLOCK() \\r
871         vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait);\r
872 \r
873 #undef traceTASK_NOTIFY_WAIT\r
874 #define traceTASK_NOTIFY_WAIT() \\r
875         if (pxCurrentTCB->eNotifyState == eNotified) \\r
876                 vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT, (uint32_t)pxCurrentTCB, xTicksToWait); \\r
877         else \\r
878                 vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);\r
879 \r
880 #undef traceTASK_NOTIFY_WAIT_BLOCK\r
881 #define traceTASK_NOTIFY_WAIT_BLOCK() \\r
882         vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait);\r
883 \r
884 #undef traceTASK_NOTIFY\r
885 #define traceTASK_NOTIFY() \\r
886         vTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY, (uint32_t)xTaskToNotify);\r
887 \r
888 #undef traceTASK_NOTIFY_FROM_ISR\r
889 #define traceTASK_NOTIFY_FROM_ISR() \\r
890         vTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (uint32_t)xTaskToNotify);\r
891         \r
892 #undef traceTASK_NOTIFY_GIVE_FROM_ISR\r
893 #define traceTASK_NOTIFY_GIVE_FROM_ISR() \\r
894         vTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR, (uint32_t)xTaskToNotify);\r
895 \r
896 /************************************************************************/\r
897 /* KERNEL SPECIFIC MACROS TO NAME OBJECTS, IF NECESSARY                          */\r
898 /************************************************************************/\r
899 #define vTraceSetQueueName(object, name) \\r
900 vTraceStoreKernelObjectName(object, name);\r
901 \r
902 #define vTraceSetSemaphoreName(object, name) \\r
903 vTraceStoreKernelObjectName(object, name);\r
904 \r
905 #define vTraceSetMutexName(object, name) \\r
906 vTraceStoreKernelObjectName(object, name);\r
907 \r
908 #define vTraceSetEventGroupName(object, name) \\r
909 vTraceStoreKernelObjectName(object, name);\r
910 \r
911 #else /*(USE_TRACEALYZER_RECORDER == 1)*/\r
912 \r
913 #define vTraceSetQueueName(object, name)\r
914 \r
915 #define vTraceSetSemaphoreName(object, name)\r
916 \r
917 #define vTraceSetMutexName(object, name)\r
918 \r
919 #define vTraceSetEventGroupName(object, name)\r
920 \r
921 #define Trace_Init() \r
922 \r
923 #endif /*(USE_TRACEALYZER_RECORDER == 1)*/\r
924 \r
925 #ifdef __cplusplus\r
926 }\r
927 #endif\r
928 \r
929 #endif /* TRC_KERNEL_PORT_H */\r