1 /*
2  * Trace Recorder for Tracealyzer v4.8.1
3  * Copyright 2023 Percepio AB
4  * www.percepio.com
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  *
8  * Configuration parameters for trace recorder library in snapshot mode.
9  * Read more at http://percepio.com/2016/10/05/rtos-tracing/
10  */
11 
12 #ifndef TRC_SNAPSHOT_CONFIG_H
13 #define TRC_SNAPSHOT_CONFIG_H
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 /**
20  * @def TRC_CFG_SNAPSHOT_MODE
21  * @brief Macro which should be defined as one of:
22  * - TRC_SNAPSHOT_MODE_RING_BUFFER
23  * - TRC_SNAPSHOT_MODE_STOP_WHEN_FULL
24  * Default is TRC_SNAPSHOT_MODE_RING_BUFFER.
25  *
26  * With TRC_CFG_SNAPSHOT_MODE set to TRC_SNAPSHOT_MODE_RING_BUFFER, the
27  * events are stored in a ring buffer, i.e., where the oldest events are
28  * overwritten when the buffer becomes full. This allows you to get the last
29  * events leading up to an interesting state, e.g., an error, without having
30  * to store the whole run since startup.
31  *
32  * When TRC_CFG_SNAPSHOT_MODE is TRC_SNAPSHOT_MODE_STOP_WHEN_FULL, the
33  * recording is stopped when the buffer becomes full. This is useful for
34  * recording events following a specific state, e.g., the startup sequence.
35  */
36 #define TRC_CFG_SNAPSHOT_MODE TRC_SNAPSHOT_MODE_RING_BUFFER
37 
38 /**
39  * @def TRC_CFG_EVENT_BUFFER_SIZE
40  * @brief Macro which should be defined as an integer value.
41  *
42  * This defines the capacity of the event buffer, i.e., the number of records
43  * it may store. Most events use one record (4 byte), although some events
44  * require multiple 4-byte records. You should adjust this to the amount of RAM
45  * available in the target system.
46  *
47  * Default value is 1000, which means that 4000 bytes is allocated for the
48  * event buffer.
49  */
50 #define TRC_CFG_EVENT_BUFFER_SIZE 1000
51 
52 /**
53  * @def TRC_CFG_INCLUDE_FLOAT_SUPPORT
54  * @brief Macro which should be defined as either zero (0) or one (1).
55  *
56  * If this is zero (0), the support for logging floating point values in
57  * vTracePrintF is stripped out, in case floating point values are not used or
58  * supported by the platform used.
59  *
60  * Floating point values are only used in vTracePrintF and its subroutines, to
61  * allow for storing float (%f) or double (%lf) arguments.
62  *
63  * vTracePrintF can be used with integer and string arguments in either case.
64  *
65  * Default value is 0.
66  */
67 #define TRC_CFG_INCLUDE_FLOAT_SUPPORT 0
68 
69 /**
70  * @def TRC_CFG_SYMBOL_TABLE_SIZE
71  * @brief Macro which should be defined as an integer value.
72  *
73  * This defines the capacity of the symbol table, in bytes. This symbol table
74  * stores User Events labels and names of deleted tasks, queues, or other kernel
75  * objects. If you don't use User Events or delete any kernel
76  * objects you set this to a very low value. The minimum recommended value is 4.
77  * A size of zero (0) is not allowed since a zero-sized array may result in a
78  * 32-bit pointer, i.e., using 4 bytes rather than 0.
79  *
80  * Default value is 800.
81  */
82 #define TRC_CFG_SYMBOL_TABLE_SIZE 800
83 
84 #if (TRC_CFG_SYMBOL_TABLE_SIZE == 0)
85 #error "TRC_CFG_SYMBOL_TABLE_SIZE may not be zero!"
86 #endif
87 
88 /******************************************************************************
89  *** ADVANCED SETTINGS ********************************************************
90  ******************************************************************************
91  * The remaining settings are not necessary to modify but allows for optimizing
92  * the recorder setup for your specific needs, e.g., to exclude events that you
93  * are not interested in, in order to get longer traces.
94  *****************************************************************************/
95 
96 /**
97  * @def TRC_CFG_HEAP_SIZE_BELOW_16M
98  * @brief An integer constant that can be used to reduce the buffer usage of memory
99  * allocation events (malloc/free). This value should be 1 if the heap size is
100  * below 16 MB (2^24 byte), and you can live with reported addresses showing the
101  * lower 24 bits only. If 0, you get the full 32-bit addresses.
102  *
103  * Default value is 0.
104  */
105 #define TRC_CFG_HEAP_SIZE_BELOW_16M 0
106 
107 /**
108  * @def TRC_CFG_USE_IMPLICIT_IFE_RULES
109  * @brief Macro which should be defined as either zero (0) or one (1).
110  * Default is 1.
111  *
112  * Tracealyzer groups the events into "instances" based on Instance Finish
113  * Events (IFEs), produced either by default rules or calls to the recorder
114  * functions xTraceTaskInstanceFinishedNow and xTraceTaskInstanceFinishedNext.
115  *
116  * If TRC_CFG_USE_IMPLICIT_IFE_RULES is one (1), the default IFE rules is
117  * used, resulting in a "typical" grouping of events into instances.
118  * If these rules don't give appropriate instances in your case, you can
119  * override the default rules using xTraceTaskInstanceFinishedNow/Next for one
120  * or several tasks. The default IFE rules are then disabled for those tasks.
121  *
122  * If TRC_CFG_USE_IMPLICIT_IFE_RULES is zero (0), the implicit IFE rules are
123  * disabled globally. You must then call xTraceTaskInstanceFinishedNow or
124  * xTraceTaskInstanceFinishedNext to manually group the events into instances,
125  * otherwise the tasks will appear a single long instance.
126  *
127  * The default IFE rules count the following events as "instance finished":
128  * - Task delay, delay until
129  * - Task suspend
130  * - Blocking on "input" operations, i.e., when the task is waiting for the
131  *   next a message/signal/event. But only if this event is blocking.
132  */
133 #define TRC_CFG_USE_IMPLICIT_IFE_RULES 1
134 
135 /**
136  * @def TRC_CFG_USE_16BIT_OBJECT_HANDLES
137  * @brief Macro which should be defined as either zero (0) or one (1).
138  *
139  * If set to 0 (zero), the recorder uses 8-bit handles to identify kernel
140  * objects such as tasks and queues. This limits the supported number of
141  * concurrently active objects to 255 of each type (tasks, queues, mutexes,
142  * etc.) Note: 255, not 256, since handle 0 is reserved.
143  *
144  * If set to 1 (one), the recorder uses 16-bit handles to identify kernel
145  * objects such as tasks and queues. This limits the supported number of
146  * concurrent objects to 65535 of each type (object class). However, since the
147  * object property table is limited to 64 KB, the practical limit is about
148  * 3000 objects in total.
149  *
150  * Default is 0 (8-bit handles)
151  *
152  * NOTE: An object with handle above 255 will use an extra 4-byte record in
153  * the event buffer whenever the object is referenced. Moreover, some internal
154  * tables in the recorder gets slightly larger when using 16-bit handles.
155  */
156 #define TRC_CFG_USE_16BIT_OBJECT_HANDLES 0
157 
158 /**
159  * @def TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER
160  * @brief Macro which should be defined as an integer value.
161  *
162  * Set TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER to 1 to enable the
163  * separate user event buffer (UB).
164  * In this mode, user events are stored separately from other events,
165  * e.g., RTOS events. Thereby you can get a much longer history of
166  * user events as they don't need to share the buffer space with more
167  * frequent events.
168  *
169  * The UB is typically used with the snapshot ring-buffer mode, so the
170  * recording can continue when the main buffer gets full. And since the
171  * main buffer then overwrites the earliest events, Tracealyzer displays
172  * "Unknown Actor" instead of task scheduling for periods with UB data only.
173  *
174  * In UB mode, user events are structured as UB channels, which contains
175  * a channel name and a default format string. Register a UB channel using
176  * xTraceRegisterUBChannel.
177  *
178  * Events and data arguments are written using vTraceUBEvent and
179  * vTraceUBData. They are designed to provide efficient logging of
180  * repeating events, using the same format string within each channel.
181  *
182  * Examples:
183  *  TraceStringHandle_t chn1;
184  *  TraceStringHandle_t fmt1;
185  *  xTraceStringRegister("Channel 1", &chn1);
186  *  xTraceStringRegister("Event!", &fmt1);
187  *  traceUBChannel UBCh1 = xTraceRegisterUBChannel(chn1, fmt1);
188  *
189  *  TraceStringHandle_t chn2;
190  *  TraceStringHandle_t fmt2;
191  *  xTraceStringRegister("Channel 2", &chn2);
192  *  xTraceStringRegister("X: %d, Y: %d", &fmt2);
193  *  traceUBChannel UBCh2 = xTraceRegisterUBChannel(chn2, fmt2);
194  *
195  *  // Result in "[Channel 1] Event!"
196  *	vTraceUBEvent(UBCh1);
197  *
198  *  // Result in "[Channel 2] X: 23, Y: 19"
199  *	vTraceUBData(UBCh2, 23, 19);
200  *
201  * You can also use the other user event functions, like xTracePrintF.
202  * as they are then rerouted to the UB instead of the main event buffer.
203  * vTracePrintF then looks up the correct UB channel based on the
204  * provided channel name and format string, or creates a new UB channel
205  * if no match is found. The format string should therefore not contain
206  * "random" messages but mainly format specifiers. Random strings should
207  * be stored using %s and with the string as an argument.
208  *
209  *  // Creates a new UB channel ("Channel 2", "%Z: %d")
210  *  xTracePrintF(chn2, "%Z: %d", value1);
211  *
212  *  // Finds the existing UB channel
213  *  xTracePrintF(chn2, "%Z: %d", value2);
214  */
215 #define TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER 0
216 
217 /**
218  * @def TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE
219  * @brief Macro which should be defined as an integer value.
220  *
221  * This defines the capacity of the user event buffer (UB), in number of slots.
222  * A single user event can use multiple slots, depending on the arguments.
223  *
224  * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1.
225  */
226 #define TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE 200
227 
228 /**
229  * @def TRC_CFG_UB_CHANNELS
230  * @brief Macro which should be defined as an integer value.
231  *
232  * This defines the number of User Event Buffer Channels (UB channels).
233  * These are used to structure the events when using the separate user
234  * event buffer, and contains both a User Event Channel (the name) and
235  * a default format string for the channel.
236  *
237  * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1.
238  */
239 #define TRC_CFG_UB_CHANNELS 32
240 
241 #ifdef __cplusplus
242 }
243 #endif
244 
245 #endif /*TRC_SNAPSHOT_CONFIG_H*/
246