1 /* 2 * Trace Recorder for Tracealyzer v4.5.1 3 * Copyright 2021 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 #define TRC_SNAPSHOT_MODE_RING_BUFFER (0x01) 16 #define TRC_SNAPSHOT_MODE_STOP_WHEN_FULL (0x02) 17 18 /****************************************************************************** 19 * TRC_CFG_SNAPSHOT_MODE 20 * 21 * 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 * TRC_CFG_EVENT_BUFFER_SIZE 40 * 41 * Macro which should be defined as an integer value. 42 * 43 * This defines the capacity of the event buffer, i.e., the number of records 44 * it may store. Most events use one record (4 byte), although some events 45 * require multiple 4-byte records. You should adjust this to the amount of RAM 46 * available in the target system. 47 * 48 * Default value is 1000, which means that 4000 bytes is allocated for the 49 * event buffer. 50 ******************************************************************************/ 51 #define TRC_CFG_EVENT_BUFFER_SIZE 1000 52 53 /******************************************************************************* 54 * TRC_CFG_NTASK, TRC_CFG_NISR, TRC_CFG_NQUEUE, TRC_CFG_NSEMAPHORE... 55 * 56 * A group of macros which should be defined as integer values, zero or larger. 57 * 58 * These define the capacity of the Object Property Table, i.e., the maximum 59 * number of objects active at any given point, within each object class (e.g., 60 * task, queue, semaphore, ...). 61 * 62 * If tasks or other objects are deleted in your system, this 63 * setting does not limit the total amount of objects created, only the number 64 * of objects that have been successfully created but not yet deleted. 65 * 66 * Using too small values will cause vTraceError to be called, which stores an 67 * error message in the trace that is shown when opening the trace file. The 68 * error message can also be retrieved using xTraceGetLastError. 69 * 70 * It can be wise to start with large values for these constants, 71 * unless you are very confident on these numbers. Then do a recording and 72 * check the actual usage by selecting View menu -> Trace Details -> 73 * Resource Usage -> Object Table. 74 ******************************************************************************/ 75 #define TRC_CFG_NTASK 15 76 #define TRC_CFG_NISR 5 77 #define TRC_CFG_NQUEUE 10 78 #define TRC_CFG_NSEMAPHORE 10 79 #define TRC_CFG_NMUTEX 10 80 #define TRC_CFG_NFLAG 5 81 #define TRC_CFG_NMEM 5 82 #define TRC_CFG_NTASK_SEM TRC_CFG_NTASK 83 #define TRC_CFG_NTASK_Q TRC_CFG_NTASK 84 85 /****************************************************************************** 86 * TRC_CFG_INCLUDE_FLOAT_SUPPORT 87 * 88 * Macro which should be defined as either zero (0) or one (1). 89 * 90 * If this is zero (0), the support for logging floating point values in 91 * vTracePrintF is stripped out, in case floating point values are not used or 92 * supported by the platform used. 93 * 94 * Floating point values are only used in vTracePrintF and its subroutines, to 95 * allow for storing float (%f) or double (%lf) arguments. 96 * 97 * vTracePrintF can be used with integer and string arguments in either case. 98 * 99 * Default value is 0. 100 *****************************************************************************/ 101 #define TRC_CFG_INCLUDE_FLOAT_SUPPORT 0 102 103 /******************************************************************************* 104 * TRC_CFG_SYMBOL_TABLE_SIZE 105 * 106 * Macro which should be defined as an integer value. 107 * 108 * This defines the capacity of the symbol table, in bytes. This symbol table 109 * stores User Events labels and names of deleted tasks, queues, or other kernel 110 * objects. If you don't use User Events or delete any kernel 111 * objects you set this to a very low value. The minimum recommended value is 4. 112 * A size of zero (0) is not allowed since a zero-sized array may result in a 113 * 32-bit pointer, i.e., using 4 bytes rather than 0. 114 * 115 * Default value is 800. 116 ******************************************************************************/ 117 #define TRC_CFG_SYMBOL_TABLE_SIZE 800 118 119 #if (TRC_CFG_SYMBOL_TABLE_SIZE == 0) 120 #error "TRC_CFG_SYMBOL_TABLE_SIZE may not be zero!" 121 #endif 122 123 /****************************************************************************** 124 * TRC_CFG_NAME_LEN_TASK, TRC_CFG_NAME_LEN_QUEUE, ... 125 * 126 * Macros that specify the maximum lengths (number of characters) for names of 127 * kernel objects, such as tasks and queues. If longer names are used, they will 128 * be truncated when stored in the recorder. 129 *****************************************************************************/ 130 #define TRC_CFG_NAME_LEN_TASK 15 131 #define TRC_CFG_NAME_LEN_ISR 15 132 #define TRC_CFG_NAME_LEN_QUEUE 15 133 #define TRC_CFG_NAME_LEN_SEMAPHORE 15 134 #define TRC_CFG_NAME_LEN_MUTEX 15 135 #define TRC_CFG_NAME_LEN_FLAG 32 136 #define TRC_CFG_NAME_LEN_MEM 32 137 #define TRC_CFG_NAME_LEN_TASK_SEM 32 138 #define TRC_CFG_NAME_LEN_TASK_Q 32 139 140 /****************************************************************************** 141 *** ADVANCED SETTINGS ******************************************************** 142 ****************************************************************************** 143 * The remaining settings are not necessary to modify but allows for optimizing 144 * the recorder setup for your specific needs, e.g., to exclude events that you 145 * are not interested in, in order to get longer traces. 146 *****************************************************************************/ 147 148 /****************************************************************************** 149 * TRC_CFG_HEAP_SIZE_BELOW_16M 150 * 151 * An integer constant that can be used to reduce the buffer usage of memory 152 * allocation events (malloc/free). This value should be 1 if the heap size is 153 * below 16 MB (2^24 byte), and you can live with reported addresses showing the 154 * lower 24 bits only. If 0, you get the full 32-bit addresses. 155 * 156 * Default value is 0. 157 ******************************************************************************/ 158 #define TRC_CFG_HEAP_SIZE_BELOW_16M 0 159 160 /****************************************************************************** 161 * TRC_CFG_USE_IMPLICIT_IFE_RULES 162 * 163 * Macro which should be defined as either zero (0) or one (1). 164 * Default is 1. 165 * 166 * Tracealyzer groups the events into "instances" based on Instance Finish 167 * Events (IFEs), produced either by default rules or calls to the recorder 168 * functions vTraceInstanceFinishedNow and vTraceInstanceFinishedNext. 169 * 170 * If TRC_CFG_USE_IMPLICIT_IFE_RULES is one (1), the default IFE rules is 171 * used, resulting in a "typical" grouping of events into instances. 172 * If these rules don't give appropriate instances in your case, you can 173 * override the default rules using vTraceInstanceFinishedNow/Next for one 174 * or several tasks. The default IFE rules are then disabled for those tasks. 175 * 176 * If TRC_CFG_USE_IMPLICIT_IFE_RULES is zero (0), the implicit IFE rules are 177 * disabled globally. You must then call vTraceInstanceFinishedNow or 178 * vTraceInstanceFinishedNext to manually group the events into instances, 179 * otherwise the tasks will appear a single long instance. 180 * 181 * The default IFE rules count the following events as "instance finished": 182 * - Task delay, delay until 183 * - Task suspend 184 * - Blocking on "input" operations, i.e., when the task is waiting for the 185 * next a message/signal/event. But only if this event is blocking. 186 * 187 * For details, see trcSnapshotKernelPort.h and look for references to the 188 * macro trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED. 189 *****************************************************************************/ 190 #define TRC_CFG_USE_IMPLICIT_IFE_RULES 1 191 192 /****************************************************************************** 193 * TRC_CFG_USE_16BIT_OBJECT_HANDLES 194 * 195 * Macro which should be defined as either zero (0) or one (1). 196 * 197 * If set to 0 (zero), the recorder uses 8-bit handles to identify kernel 198 * objects such as tasks and queues. This limits the supported number of 199 * concurrently active objects to 255 of each type (tasks, queues, mutexes, 200 * etc.) Note: 255, not 256, since handle 0 is reserved. 201 * 202 * If set to 1 (one), the recorder uses 16-bit handles to identify kernel 203 * objects such as tasks and queues. This limits the supported number of 204 * concurrent objects to 65535 of each type (object class). However, since the 205 * object property table is limited to 64 KB, the practical limit is about 206 * 3000 objects in total. 207 * 208 * Default is 0 (8-bit handles) 209 * 210 * NOTE: An object with handle above 255 will use an extra 4-byte record in 211 * the event buffer whenever the object is referenced. Moreover, some internal 212 * tables in the recorder gets slightly larger when using 16-bit handles. 213 *****************************************************************************/ 214 #define TRC_CFG_USE_16BIT_OBJECT_HANDLES 0 215 216 /****************************************************************************** 217 * TRC_CFG_USE_TRACE_ASSERT 218 * 219 * Macro which should be defined as either zero (0) or one (1). 220 * Default is 1. 221 * 222 * If this is one (1), the TRACE_ASSERT macro (used at various locations in the 223 * trace recorder) will verify that a relevant condition is true. 224 * If the condition is false, prvTraceError() will be called, which stops the 225 * recording and stores an error message that is displayed when opening the 226 * trace in Tracealyzer. 227 * 228 * This is used on several places in the recorder code for sanity checks on 229 * parameters. Can be switched off to reduce the footprint of the tracing, but 230 * we recommend to have it enabled initially. 231 *****************************************************************************/ 232 #define TRC_CFG_USE_TRACE_ASSERT 1 233 234 /******************************************************************************* 235 * TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER 236 * 237 * Macro which should be defined as an integer value. 238 * 239 * Set TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER to 1 to enable the 240 * separate user event buffer (UB). 241 * In this mode, user events are stored separately from other events, 242 * e.g., RTOS events. Thereby you can get a much longer history of 243 * user events as they don't need to share the buffer space with more 244 * frequent events. 245 * 246 * The UB is typically used with the snapshot ring-buffer mode, so the 247 * recording can continue when the main buffer gets full. And since the 248 * main buffer then overwrites the earliest events, Tracealyzer displays 249 * "Unknown Actor" instead of task scheduling for periods with UB data only. 250 * 251 * In UB mode, user events are structured as UB channels, which contains 252 * a channel name and a default format string. Register a UB channel using 253 * xTraceRegisterUBChannel. 254 * 255 * Events and data arguments are written using vTraceUBEvent and 256 * vTraceUBData. They are designed to provide efficient logging of 257 * repeating events, using the same format string within each channel. 258 * 259 * Examples: 260 * 261 * traceString chn1 = xTraceRegisterString("Channel 1"); 262 * traceString fmt1 = xTraceRegisterString("Event!"); 263 * traceUBChannel UBCh1 = xTraceRegisterUBChannel(chn1, fmt1); 264 * 265 * traceString chn2 = xTraceRegisterString("Channel 2"); 266 * traceString fmt2 = xTraceRegisterString("X: %d, Y: %d"); 267 * traceUBChannel UBCh2 = xTraceRegisterUBChannel(chn2, fmt2); 268 * 269 * // Result in "[Channel 1] Event!" 270 * vTraceUBEvent(UBCh1); 271 * 272 * // Result in "[Channel 2] X: 23, Y: 19" 273 * vTraceUBData(UBCh2, 23, 19); 274 * 275 * You can also use the other user event functions, like vTracePrintF. 276 * as they are then rerouted to the UB instead of the main event buffer. 277 * vTracePrintF then looks up the correct UB channel based on the 278 * provided channel name and format string, or creates a new UB channel 279 * if no match is found. The format string should therefore not contain 280 * "random" messages but mainly format specifiers. Random strings should 281 * be stored using %s and with the string as an argument. 282 * 283 * // Creates a new UB channel ("Channel 2", "%Z: %d") 284 * vTracePrintF(chn2, "%Z: %d", value1); 285 * 286 * // Finds the existing UB channel 287 * vTracePrintF(chn2, "%Z: %d", value2); 288 289 ******************************************************************************/ 290 #define TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER 0 291 292 /******************************************************************************* 293 * TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE 294 * 295 * Macro which should be defined as an integer value. 296 * 297 * This defines the capacity of the user event buffer (UB), in number of slots. 298 * A single user event can use multiple slots, depending on the arguments. 299 * 300 * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1. 301 ******************************************************************************/ 302 #define TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE 200 303 304 /******************************************************************************* 305 * TRC_CFG_UB_CHANNELS 306 * 307 * Macro which should be defined as an integer value. 308 * 309 * This defines the number of User Event Buffer Channels (UB channels). 310 * These are used to structure the events when using the separate user 311 * event buffer, and contains both a User Event Channel (the name) and 312 * a default format string for the channel. 313 * 314 * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1. 315 ******************************************************************************/ 316 #define TRC_CFG_UB_CHANNELS 32 317 318 /******************************************************************************* 319 * TRC_CFG_ISR_TAILCHAINING_THRESHOLD 320 * 321 * Macro which should be defined as an integer value. 322 * 323 * If tracing multiple ISRs, this setting allows for accurate display of the 324 * context-switching also in cases when the ISRs execute in direct sequence. 325 * 326 * vTraceStoreISREnd normally assumes that the ISR returns to the previous 327 * context, i.e., a task or a preempted ISR. But if another traced ISR 328 * executes in direct sequence, Tracealyzer may incorrectly display a minimal 329 * fragment of the previous context in between the ISRs. 330 * 331 * By using TRC_CFG_ISR_TAILCHAINING_THRESHOLD you can avoid this. This is 332 * however a threshold value that must be measured for your specific setup. 333 * See http://percepio.com/2014/03/21/isr_tailchaining_threshold/ 334 * 335 * The default setting is 0, meaning "disabled" and that you may get an 336 * extra fragments of the previous context in between tail-chained ISRs. 337 * 338 * Note: This setting has separate definitions in trcSnapshotConfig.h and 339 * trcStreamingConfig.h, since it is affected by the recorder mode. 340 ******************************************************************************/ 341 #define TRC_CFG_ISR_TAILCHAINING_THRESHOLD 0 342 343 #endif /*TRC_SNAPSHOT_CONFIG_H*/ 344