1.. zephyr:code-sample:: latmon-client 2 :name: Latmon Client 3 :relevant-api: latmon 4 5 Measures delta time between GPIO events and reports the latency metrics via latmon to the latmus 6 service executing on the SUT. 7 8Overview 9******** 10 11This project provides tools to measure the worst-case response time of a system under test (SUT) to 12GPIO events using: 13 14- **Latmon**: 15 16 Runs on a Zephyr-based board to generate and monitor GPIO events while collecting metrics 17 18- **Latmus**: 19 20 Runs on the SUT to respond to the falling edge of input GPIO event, displaying the latency metrics 21 and generate histogram data. 22 23This project is part of the open-source initiative 24`EVL Project - Latmus GPIO Response Time <https://evlproject.org/core/benchmarks/#latmus-gpio-response-time>`_. 25 26The main program is designed to monitor latency using GPIO pins on a Zephyr-based system. It generates a 27pulse signal on a GPIO pin and measures the time it takes for the SUT (executing Latmus) to respond to 28it. 29 30The SUT must be running Latmus to capture the latency metrics and histogram information reported over the 31network. The program uses LEDs to indicate the different states, such as DHCP binding(red), waiting for the 32Latmus connection (blue) and sampling (green). 33 34Why Not Just Use a Timer? 35========================= 36 37Timer tests miss external factors like GPIO signals, hardware, and interrupt handling. 38Latmon and Latmus simulate real-world scenarios, capturing end-to-end latency metrics. 39This ensures accurate assessment of real-time responsiveness across the entire system. 40 41- **Real-Time Thread Testing**: 42 43 Evaluates how a user-space thread processes external interrupts. 44 45- **End-to-End Latency Measurement**: 46 47 Captures delays from hardware, drivers, and user-space threads. 48 49- **Versatile Platform Support**: 50 51 Works on EVL, PREEMPT_RT, and other platforms. 52 53Code Structure 54============== 55 56The Latmon sample application is divided into two main components: 57 58- **Application Logic** (:zephyr_file:`samples/net/latmon/src/main.c`): 59 60 This file contains the application logic for Latmon. 61 It initializes networking, provides the instrumentation mechanism and handles LED indicators for the 62 different states. 63 64- **Library** (:zephyr_file:`subsys/net/lib/latmon/latmon.c`): 65 66 This file provides reusable functions and abstractions for latency monitoring via Latmus. 67 It includes the core logic for reporting latency metrics and histogram data. 68 69Requirements 70************ 71 72- **Zephyr-Compatible Board**: 73 74 A board with external GPIO support and an IPv4 network interface (e.g., FRDM-K64F). 75 76- **System under Test**: 77 78 A system with external GPIO pins running the Latmus service and an IPv4 network interface. 79 80- **Network Connection**: 81 82 A DHCP server for IP assignment. 83 84- **Physical Connection**: 85 86 GPIO wires connecting the Zephyr board to the SUT and both systems connected to the network. 87 88Setup and Usage 89*************** 90 91- **Flash Latmon onto the Zephyr board**: 92 93 The application will connect to the network and wait for a connection from the SUT. The application 94 will use DHCP to obtain an IPv4 address. 95 96- **Connect GPIO pins for transmit (Zephyr to SUT) and receive (SUT to Zephyr)** 97 98 On **FRDM-K64F**, the sample code uses the **Arduino header J2**, ``pin 20`` for transmit the pulse to 99 the SUT and ``pin 18`` to receive the acknowledgment from the SUT. 100 101- **Run Latmus on the SUT** 102 103 Request the appropriate options with `Latmus <https://evlproject.org/core/testing/#latmus-program>`_. Users 104 can for example modify the sampling period with the ``-p`` option or generate historgram data for 105 postprocessing with the ``-g`` option, 106 107- **Monitor results from the SUT** 108 109 Latmus will report latency figures and, if requested, generate the histogram data file. 110 111- **Calibrating the Latmus latencies: CONFIG_LATMON_LOOPBACK_CALIBRATION**: 112 113 Users can connect the GPIO pins in loopback mode (transmit to ack) and build the Latmon sample application with 114 CONFIG_LATMON_LOOPBACK_CALIBRATION enabled. When connecting to Latmus in this configuration, Latmus is providing 115 a calibration value that can be used to adjust the final latencies. 116 117Example 118======= 119 120On the host and to build and flash the Zephyr FRDM-K64F board with the Latmon sample: 121 122.. code-block:: console 123 124 user@host:~$ west build -b frdm_k64f samples/net/latmon 125 user@host:~$ west flash 126 127On the SUT running on Linux, latmus **MUST** track the falling edge of the signal: 128 129.. code-block:: console 130 131 root@target:~$ latmus -I gpiochip2,23,falling-edge -O gpiochip2,21 -z -g"histogram" "broadcast" 132 133Monitoring both consoles, you should see the following: 134 135.. code-block:: console 136 137 [00:00:03.311,000] <inf> phy_mc_ksz8081: PHY 0 is up 138 [00:00:03.311,000] <inf> phy_mc_ksz8081: PHY (0) Link speed 100 Mb, full duplex 139 [00:00:03.312,000] <inf> eth_nxp_enet_mac: Link is up 140 *** Booting Zephyr OS build v4.1.0-3337-g886443a190b1 *** 141 [00:00:03.313,000] <inf> sample_latmon: DHCPv4: binding... 142 [00:00:03.313,000] <inf> latmon: Latmon server thread priority: 14 143 [00:00:10.964,000] <inf> net_dhcpv4: Received: 192.168.1.58 144 [00:00:10.964,000] <inf> sample_latmon: Listening on 192.168.1.58 145 [00:00:30.966,000] <inf> latmon: Waiting for Latmus ... 146 [00:00:31.356,000] <inf> latmon: Monitor thread priority: -16 147 [00:00:31.356,000] <inf> latmon: monitoring started: 148 [00:00:31.356,000] <inf> latmon: - samples per period: 1000 149 [00:00:31.356,000] <inf> latmon: - period: 1000 usecs 150 [00:00:31.356,000] <inf> latmon: - histogram cells: 200 151 [00:00:31.393,000] <inf> latmon: Transfer thread priority: 14 152 153.. code-block:: console 154 155 root@target:~$ latmus -I gpiochip2,23,falling-edge -O gpiochip2,21 -Z -g"histogram" broadcast 156 Received broadcast message: 192.168.1.58 157 warming up on CPU0 (not isolated)... 158 connecting to latmon at 192.168.1.58:2306... 159 RTT| 00:00:16 (oob-gpio, 1000 us period, priority 98, CPU0-noisol) 160 RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst 161 RTD| 26.375| 30.839| 33.508| 0| 0| 26.375| 33.508 162 RTD| 26.333| 30.801| 37.633| 0| 0| 26.333| 37.633 163 RTD| 26.375| 30.801| 31.966| 0| 0| 26.333| 37.633 164 RTD| 26.375| 30.911| 49.675| 0| 0| 26.333| 49.675 165 RTD| 26.333| 30.830| 41.658| 0| 0| 26.333| 49.675 166 RTD| 26.375| 31.107| 59.216| 0| 0| 26.333| 59.216 167 RTD| 26.333| 30.767| 30.925| 0| 0| 26.333| 59.216 168 RTD| 26.333| 30.781| 41.616| 0| 0| 26.333| 59.216 169 RTD| 26.375| 30.768| 32.925| 0| 0| 26.333| 59.216 170 RTD| 26.375| 30.768| 37.633| 0| 0| 26.333| 59.216 171 172On completion and from your host, retrieve the histogram file from the SUT, and generate a plot (a PNG file) using 173gnuplot: 174 175.. code-block:: console 176 177 user@host:~$ gnuplot plot_data.gp 178 179The ``plot_data.gp`` script should look like this for a file named ``histogram``: 180 181.. code-block:: gnuplot 182 183 set terminal pngcairo size 800,600 184 set output 'plot.png' 185 set title "Data Plot" 186 set xlabel "Latency (usec)" 187 set ylabel "Sample Count" 188 set grid 189 set style data linespoints 190 plot 'histogram' using 1:2 with linespoints title "Data Points" 191