blob: a69bb136dbc4d2ca91eabaeb847325385f27dbb9 [file]
.. zephyr:code-sample:: instrumentation
:name: Instrumentation
Demonstrate the instrumentation subsystem tracing and profiling features.
Overview
********
This sample shows the instrumentation subsystem tracing and profiling
features. It basically consists of two threads in a ping-pong mode, taking
turns to execute loops that spend some CPU cycles.
Requirements
************
A Linux host and a UART console is required to run this sample.
Building and Running
********************
Build and flash the sample as follows, changing ``mps2/an385`` for your
board.
.. zephyr-app-commands::
:zephyr-app: samples/subsys/instrumentation
:host-os: unix
:board: mps2/an385
:goals: build flash
:compact:
Alternatively you can run this using QEMU:
.. zephyr-app-commands::
:zephyr-app: samples/subsys/instrumentation
:host-os: unix
:board: mps2/an385
:goals: run
:gen-args: '-DQEMU_SOCKET=y'
:compact:
After the sample is flashed to the target (or QEMU is running), it must be possible to
collect and visualize traces and profiling info using the instrumentation CLI
tool, :zephyr_file:`scripts/instrumentation/zaru.py`.
.. note::
Please note, that this subsystem uses the ``retained_mem`` driver, hence it's necessary
to add the proper devicetree overlay for the target board. See
:zephyr_file:`./samples/subsys/instrumentation/boards/mps2_an385.overlay` for an example.
Connect the board's UART port to the host device and
run the :zephyr_file:`scripts/instrumentation/zaru.py` script on the host.
Source the :zephyr_file:`zephyr-env.sh` file to set the ``ZEPHYR_BASE`` variable and get
:zephyr_file:`scripts/instrumentation/zaru.py` in your PATH:
.. code-block:: console
. zephyr-env.sh
Check instrumentation status:
.. code-block:: console
zaru.py status
Set the tracing/profiling trigger; in this sample the function
``get_sem_and_exec_function`` is the one interesting to allow the observation
of context switches:
.. code-block:: console
zaru.py trace -v -c get_sem_and_exec_function
Reboot target so tracing/profiling at the location is effective:
.. code-block:: console
zaru.py reboot
Wait ~2 seconds so the sample finishes 2 rounds of ping-pong between ``main``
and ``thread_A``, and get the traces:
.. code-block:: console
zaru.py trace -v
Get the profile:
.. code-block:: console
zaru.py profile -v -n 10
Or alternatively, export the traces to Perfetto (it's necessary
to reboot because ``zaru.py trace`` dumped the buffer and it's now empty):
.. code-block:: console
zaru.py reboot
zaru.py trace -v --perfetto --output perfetto_zephyr.json
Then, go to http://perfetto.dev, Trace Viewer, and load ``perfetto_zephyr.json``.