Embedded systems testing on real hardware

Midair runs the same test suite on every board, build and network setup you have, and keeps the evidence of each run.

The failures that matter in embedded systems appear on one board revision, after one update or under one load. Midair finds where.

fw-smoke on four targetsExample
fw 2.3.0fw 2.4.0fw 2.4.1board rev Aboard rev Bboard rev CQEMU aarch64
board rev A · fw 2.3.0 12 as expected boot/time_to_shell PASSED 6.1 s update/keep_config PASSED
board rev A · fw 2.4.0 12 as expected boot/time_to_shell PASSED 6.1 s update/keep_config PASSED
board rev A · fw 2.4.1 12 as expected boot/time_to_shell PASSED 6.1 s update/keep_config PASSED
board rev B · fw 2.3.0 12 as expected boot/time_to_shell PASSED 6.4 s update/keep_config PASSED
board rev B · fw 2.4.0 12 as expected boot/time_to_shell PASSED 6.4 s update/keep_config PASSED
board rev B · fw 2.4.1 11 as expected, 1 unexpected update/keep_config FAILED expected PASSED console Kernel panic - not syncing after the update
board rev C · fw 2.3.0 12 as expected boot/time_to_shell PASSED 6.4 s update/keep_config PASSED
board rev C · fw 2.4.0 12 as expected boot/time_to_shell PASSED 6.4 s update/keep_config PASSED
board rev C · fw 2.4.1 12 as expected boot/time_to_shell PASSED 6.4 s update/keep_config PASSED
QEMU aarch64 · fw 2.3.0 12 as expected boot/time_to_shell PASSED 2.9 s peripheral tests skipped: no hardware on this target
QEMU aarch64 · fw 2.4.0 12 as expected boot/time_to_shell PASSED 2.9 s peripheral tests skipped: no hardware on this target
QEMU aarch64 · fw 2.4.1 12 as expected boot/time_to_shell PASSED 2.9 s peripheral tests skipped: no hardware on this target

What embedded systems testing is.Software, tested with its hardware.

Embedded systems testing checks software together with the hardware it runs on: the board, its peripherals, the operating system, the network and the other devices around it.

Firmware testing is one part of it. Embedded systems testing also covers how drivers, services and applications behave on the device, and how a fleet of devices behaves in the field.

Results depend on the board revision, the build, the timing and the state the device is in. So a useful test records all of that next to the verdict.

Our guide covers methods and common mistakes in more depth: How to test embedded systems.

Test levels.From one workstation to a fleet.

Each level finds failures the level before it cannot see. Choose one to see what it catches and how Midair handles it.

On a workstation

Catches
Logic errors, parsing mistakes, wrong arithmetic and broken contracts.
Misses
Timing, peripherals and anything the real board does differently.
In Midair
Visao analyzes the same sources with your cross toolchain before anything runs, and reports MISRA C:2012 rule numbers if you use that profile.
Read more

In an emulator

Catches
Boot problems, OS integration and services that fail to start.
Misses
Real peripherals, analog behavior and exact timing.
In Midair
The same suite runs on QEMU with snapshots, so tests exist before the board is on the desk.
Read more

On one board

Catches
Peripheral bugs, timing, power loss and recovery after a fault.
Misses
Problems that need other devices or a network around the board.
In Midair
A host next to the board controls power, flashing, the serial console and JTAG for the test.
Read more

With the hardware around it

Catches
Protocol errors, start-up order, drivers that meet real devices.
Misses
Rare failures that show up only across many units.
In Midair
Test Environment coordinates agents on several hosts in one run, so the board, the network and the peers are part of the test.
Read more

Across a fleet

Catches
Configuration drift, one unit that differs from the rest, changes after an update.
Misses
Whether the whole product does its job for the user.
In Midair
Delta compares each device with a baseline and points out the outliers in a fleet.
Read more

As a whole system

Catches
Behavior of the complete product in its real environment.
Misses
Nothing a single level can replace: it builds on the others.
In Midair
One record per run keeps the code findings, the test verdicts and the device evidence together.
Read more

Why embedded is harder to test.Five reasons.

  1. The result depends on the hardware

    The same build can pass on one board revision and fail on another.

  2. Timing decides

    A response that comes late is a defect, and it may come late only under load.

  3. The device shows little

    There is often no debugger at hand, only a console and a few logs.

  4. State carries over

    A previous test, a long uptime or a half-finished update changes what the next test sees.

  5. Late failures cost the most

    A bug found after hardware integration can mean a new board spin or a delayed release.

How Midair tests embedded systems.Four steps, one record.

  1. 1
    Visao

    Check the code first

    Visao analyzes C, C++ and assembly with your cross toolchain, including bare-metal targets. Against a baseline, it reports only new findings.

    visao · arm-none-eabi-gcc · baseline: main
    otp.cpp:20:20  error  arithm/integer/overflow        MISRA 12.4
    otp.cpp:31:5   error  cpp/string/no_null_terminator  MISRA 21.17
    2 new findings, 0 fixed since the baseline
  2. 2
    Test Environment

    Run one suite on every target

    Agents on the test hosts run the same suite on each board, build and network setup. Each test has an expected verdict, so a regression stands out.

    fw-smoke · fw 2.4.1 · 4 targets
    board rev A    12 as expected
    board rev B    11 as expected, 1 unexpected
    board rev C    12 as expected
    QEMU aarch64   12 as expected
    update/keep_config fails on rev B only
  3. 3
    Delta

    Look at the device itself

    Delta inspects the running system or the firmware root file system: ports, persistence files, binaries and their hardening. It reports the differences from a baseline.

    delta · board rev B · baseline golden.json
    appeared  /etc/cron.d/backup   mode 0666  T1053.003
    appeared  tcp 0.0.0.0:2375     dockerd
    missing   stack canary in /usr/bin/agent
    3 differences from the baseline
  4. 4
    Midair

    Read the failure in context

    Midair keeps each run with its configuration, logs and verdicts, and never writes over it. An AI assistant connected through MCP reads the same failures and logs.

    mcp · midair_run_failures
    update/keep_config   board rev B   FAILED   expected PASSED
    mcp · midair_get_log
    console  config v3 found, reader expects v4
    console  Kernel panic - not syncing

Questions.Short answers.

What is embedded systems testing?

Embedded systems testing checks software together with the hardware it runs on: the board, its peripherals, the operating system, the network and the devices around it.

What are the levels of embedded testing?

Unit tests on a workstation, tests in an emulator, tests on one board (hardware-in-the-loop), integration with the hardware around it, tests across a fleet and validation of the whole system.

How is it different from firmware testing?

Firmware testing focuses on the software inside one device: flashing, boot, peripherals and recovery. Embedded systems testing also covers the applications on the device, the network and fleets of devices.

Can we test before the hardware is ready?

Yes, in part. Visao analyzes the source without running it, tests can run on QEMU, and Delta can inspect a firmware root file system offline.

Which boards and systems does Midair work with?

Tests reach the board through a host next to it, so the board needs no agent. Delta runs on embedded Linux on x86_64, AArch64, ARMv7, RISC-V and MIPS. Visao analyzes code built with cross toolchains, including bare-metal targets.

Does it fit our CI?

Yes. Runs start from your CI, for example with the Jenkins plugin, and an AI assistant can start runs and read failures through MCP.

Start with one board and one suite.Then add the rest of the lab.

Compare the plans on the pricing page. Prices are monthly, in euros.

Start your pilot