Zephyr is easiest to underrate when it is described as "an open-source RTOS for embedded systems." That is accurate, but it hides the more useful architecture. Zephyr's strongest idea is that firmware should be built against an explicit board contract: the hardware shape lives in devicetree, the software surface is selected with Kconfig, the workspace is coordinated by west, and board support is a named artifact rather than tribal knowledge in a vendor SDK installer.[1][2][4]
That framing matters because embedded software usually fails at the boundaries. The application is portable until a GPIO moves. A driver is reusable until an interrupt line, bus instance, or pinmux assumption is buried in code. A vendor SDK is productive until each product team carries a slightly different zip file, patch stack, toolchain, and board definition. Zephyr does not make those problems disappear. It makes more of them inspectable before they become product folklore.
Image context: the cover uses Nordic's official nRF52840 DK product photograph because Zephyr documents that board as a concrete target, with named LEDs, push buttons, USB, flash/debug runners, and the nrf52840dk/nrf52840 build configuration. The board is not decoration; it is the physical object that the build contract has to describe.[6][8]
The RTOS Is Only The Visible Part
Zephyr's introduction starts with the small-footprint kernel, but the same page quickly widens the scope: multiple CPU architectures, kernel services, power management, networking, Bluetooth, file systems, logging, shell support, and a native simulation path for development on Linux.[1] That breadth is why adopting Zephyr feels different from dropping in a tiny scheduler. You are choosing a firmware platform whose interfaces reach from the board schematic to the application image.
The useful question, then, is not "does Zephyr have the driver?" The better question is "where should this decision live?" If a feature is a real hardware fact, it should not be hidden in application code. If a feature is a software decision, it should not be encoded as a fake hardware node. If the project depends on multiple repositories, it should not be reconstructed from a README and hope.
Zephyr's architecture is opinionated on those points. It wants the hardware description, software configuration, workspace layout, and board support to be separate enough that a change in one layer can be reviewed for what it is. That separation adds learning cost, but it also gives firmware teams a vocabulary for changes that otherwise arrive as mysterious build failures.
Devicetree Describes The Board, Not The Product Strategy
The cleanest split is between devicetree and Kconfig. Zephyr's own guidance says devicetree should describe hardware and boot-time configuration: peripherals on a board, clock frequencies, interrupt lines, radio presence, boot-time radio power, chosen console UARTs, and similar facts. Kconfig should decide which software support is built into the final image, such as networking, drivers, or protocol stacks.[2]
That sounds simple until a product has two nearly identical boards and one awkward difference. Maybe an LED changed pins. Maybe a sensor moved from one I2C bus to another. Maybe the board has two UARTs and only one should be the console. In a vendor SDK, those facts often leak into copied sample projects, private headers, and conditional code paths. In Zephyr, the intended place is the board's devicetree and overlays, with application code referring to named devices rather than scattered electrical assumptions.[2][5]
This is not just cleanliness. It changes the failure mode. If the device tree says a compatible device exists and is enabled, Kconfig can see generated symbols that track that hardware state. Zephyr's docs describe this generated DT_HAS_<compatible>_ENABLED pattern, which lets driver selection depend on whether the current devicetree actually contains an enabled compatible node.[2] The build is still complex, but at least the complexity is moving through documented interfaces.
The boundary condition is equally important. Devicetree is not a product requirements document. It should not become the place where teams stash every feature flag, market SKU, or runtime choice. Its value comes from being the board's hardware memory: concrete enough for drivers and build tools, restrained enough that the application can stay board-aware without becoming board-owned.
Kconfig Keeps The Image Honest
Kconfig is the matching software boundary. Zephyr uses it to adapt the kernel and subsystems at build time without changing source code. Symbols are defined in Kconfig files, dependencies decide which combinations are valid, and the generated autoconf.h header lets unused features be compiled out for resource-constrained systems.[3]
That is not a cosmetic optimization in embedded work. A desktop program can often carry unused code because the host is generous. Firmware does not get that luxury. Flash, RAM, boot time, interrupt latency, stack depth, and power draw all become product constraints. Kconfig is one way Zephyr turns "we might need this someday" into a concrete build choice.
The board-porting guide shows how that contract appears in a board directory. A board can provide Kconfig.plank, Kconfig.defconfig, and qualifier-specific defconfig fragments. The shared board Kconfig selects the SoC and related board or SoC settings; default fragments can set things like GPIO, console, UART console, and serial support; and the guide warns against enabling subsystems in a board defconfig unless they are required for basic board operation.[5]
That warning is the architecture in miniature. The board should say enough for the board to boot and expose its real components. The application should decide which higher-level software it needs. A team that enables every subsystem in the board default has made the board definition convenient for one demo and dangerous for reuse. A team that keeps board defaults narrow makes it easier to build several products from the same hardware base without hauling dead code through each image.
Board Support Is A Directory, Not A Story
The board porting guide is blunt about the minimum shape of board support. A new board needs a board directory; its mandatory files include board.yml for high-level metadata and a *.dts hardware description, while Kconfig files, defconfig fragments, board.cmake, documentation, images, and Twister metadata fill out the operational story.[5]
That structure is worth reading as a checklist for firmware ownership. board.yml names the board, vendor, SoCs, variants, and revisions. The DTS file describes the board hardware in Devicetree Source format: SoC includes, chosen nodes, LEDs, buttons, sensors, buses, and communication peripherals. Kconfig files describe software defaults and constraints. board.cmake participates in flash and debug support. Documentation and a board image matter when the support is contributed upstream because future users need to recognize the physical target.[5]
Zephyr's current hardware model also reflects real-world board messiness. The guide says the model introduced after Zephyr 3.6.0 added support for multi-core and multi-architecture AMP SoCs, multi-SoC boards, reuse of SoC and board Kconfig trees outside the Zephyr build system, and advanced sysbuild use cases.[5] That is not glamorous release-note copy. It is an admission that modern embedded hardware is no longer a single microcontroller plus a blink sample.
The nRF52840 DK page makes the same point in concrete form. Zephyr's board documentation lists on-chip peripherals and bindings, then names LEDs, push buttons, supported flash/debug runners, and the ordinary build command for samples/hello_world using west build -b nrf52840dk/nrf52840 followed by west flash.[6] The board is not just "supported" in the abstract. Its supported state is a bundle of metadata, pin details, drivers, tools, and runner assumptions.
West Is The Distribution Boundary
west is easy to dismiss as a command wrapper until a firmware project has more than one repository. Zephyr describes it as a command-line meta-tool whose built-in commands provide multi-repository management inspired by Google's Repo tool and Git submodules. It is also pluggable, which lets Zephyr add extension commands for building, flashing, debugging, signing binaries, and other workflows.[4]
That matters because embedded SDKs have historically lived as distribution events: download this archive, install this toolchain, copy this example, patch this board package, repeat six months later. Nordic's account of moving to an nRF Connect SDK based on Zephyr is useful here. The company says its older SDK model had become fragmented, with multiple SDKs, release schedules, frameworks, build systems, and manual update paths. In the Zephyr-based model, Nordic reused Devicetree, Kconfig, west, module infrastructure, the kernel, logging, shell, driver model, file systems, protocol stacks, Twister, and ztest, while keeping downstream changes close to upstream where possible.[7]
That is the independent adoption signal for Zephyr's architecture. The same pieces that feel like ceremony in a first tutorial are the pieces a silicon vendor needed to make a multi-product SDK less fragmented. West is not just "the build command." It is the place where the project says which repositories, revisions, modules, and Zephyr extensions make up this firmware universe.[4][7]
The failure mode is workspace drift. If every product line pins its own hidden module set, carries private west manifests without review, or treats upstream Zephyr as a dump of source files rather than a coordinated workspace, the project recreates the zip-file problem with Git syntax. West helps when the manifest is treated as release metadata. It does not help when it becomes another unowned file.
Where Zephyr Fits
Zephyr is strongest when a team needs to carry firmware across boards, SoCs, radio stacks, product variants, and vendor contributions without turning every application into a hardware port. It fits connected devices, industrial sensors, wireless products, wearables, gateways, labs with several evaluation boards, and companies that expect to upstream or reuse board support. It also fits teams that need the source code and build configuration to be auditable, not just reproducible by one engineer's laptop.[1][5][7]
It is weaker when the product is a tiny one-off with one microcontroller, one board revision, no update path, and no expectation of reuse. In that case, Zephyr's split between devicetree, Kconfig, CMake, west, and board metadata may feel heavy. The overhead becomes easier to justify when the second board arrives, when a vendor SDK falls out of maintenance, when certification demands a narrower feature image, or when a product line needs the same application to run on hardware that does not share pins, buses, or flash layout.
The practical adoption rule is to make the first boundary explicit. For a custom board, start by owning the board directory and keeping the devicetree honest. For a product image, keep Kconfig choices reviewed and minimal. For a multi-repository SDK, treat the west manifest as a release artifact. For vendor hardware, prefer board support and drivers that can stay close to upstream rather than living forever in a private fork.[2][4][5][7]
Zephyr's value is not that it makes firmware simple. It makes firmware arguments more precise. A GPIO move is a board fact. A protocol stack is a software build choice. A module version is workspace metadata. A flash/debug path is board support. When those facts have named homes, embedded work stops being a vendor SDK ritual and starts looking like software architecture.
Sources
- Zephyr Project documentation, "Introduction," covering Zephyr's small-footprint kernel, supported architectures, modular subsystems, compile-time resource definition, device driver model, networking, Bluetooth, file systems, logging, shell, and native development support.
- Zephyr Project documentation, "Devicetree versus Kconfig," explaining the split between hardware and boot-time configuration in devicetree and software support selection in Kconfig, plus generated Kconfig symbols from devicetree.
- Zephyr Project documentation, "Configuration System (Kconfig)," covering build-time configuration, symbols, dependencies,
autoconf.h, and compiling out unused features. - Zephyr Project documentation, "West (Zephyr's meta-tool)," covering
westas a multi-repository management tool and pluggable command layer for Zephyr workflows. - Zephyr Project documentation, "Board Porting Guide," covering board directories,
board.yml, devicetree files, Kconfig files, defconfig fragments, hardware model v2, and board-porting recommendations. - Zephyr Project documentation, "nRF52840 DK," covering the
nrf52840dk/nrf52840board configuration, on-board features, LED/button mappings, supported runners, and build/flash examples. - Zephyr Project / Nordic Semiconductor, "Leveraging open source software in your Software Development Kit - Nordic Semiconductor's experience with the Zephyr RTOS," May 12, 2022, covering Nordic's move from fragmented SDKs to a Zephyr-based model using Devicetree, Kconfig, west, upstream board support, and shared infrastructure.
- Nordic Semiconductor, official nRF52840 DK product image used as this article's cover asset.