Trace program flows. More...
Trace program flows.
This module allows recording program flow traces. It is meant for debugging in multi-threaded applications or when ISR's are involved.
trace() function takes an arbitrary (user chosen) uint32 value. Calling the function is safe from anywhere (user code, ISR, ...) and safely logs the function call time and user value in a trace buffer.
At any point,
trace_dump() can be used to print the trace buffer.
The buffer has a default size of 512 entries, which can be overridden by defining CONFIG_TRACE_BUFSIZE. It can be cleared using
trace_reset(). The trace buffer works like a ring-buffer. If it is full, it will start overwriting from the beginning.
Tracing is made thread safe by disabling interrupts for critical sections.
It does incur some overhead (at least a function call, getting the current time, a pair of enable/disable interrupts and a couple of memory accesses).
Execution tracing module API
Definition in file trace.h.
|void||trace (uint32_t val)|
|Add entry to trace buffer. More...|
|Print the current trace buffer. More...|
|Empty the trace buffer. |
Add entry to trace buffer.
Adds the current time (e.g., xtimer_now_usec()) and
val to the trace buffer.
The value parameter is not used by the trace module itself. The caller is supposed to provide a meaningful value. It could be e.g.,
0 at the beginning of a task and
1at the end.
|[in]||val||user defined value|
Print the current trace buffer.
Will print the number of the trace log entry, the timestamp (first entry) or relative time since last entry, and the value supplied to the
trace() call of each entry.
Example output (after adding two traces, 3us apart, with values 0 and 1):
n= 0 t= 1815312 v=0x00000000 n= 1 t=+ 3 v=0x00000001