Pigweed#
Pigweed is an open source collection of embedded-targeted libraries–or as we like to call them, modules. These modules are building blocks and infrastructure that enable faster and more reliable development on small-footprint MMU-less 32-bit microcontrollers like the STMicroelectronics STM32L452 or the Nordic nRF52832.
Attention
Pigweed is in early access; though many modules are shipping in production already. If you’re interested in using Pigweed, please reach out in our chat room or on the mailing list.
Talk to us at Pigweed Live#
Our next Pigweed Live is Mon Dec 04, 2023 1PM (PST). Please join us to discuss what’s new in Pigweed and anything else Pigweed-related. Or stop in just to say hi and meet the team! You’ll find a link for the meeting in the #pigweed-live channel of our Discord. We meet bi-weekly. The meeting is public. Everyone is welcome to join.
What’s New In Pigweed#
Highlights (Nov 17, 2023 to Dec 1, 2023):
We now have an auto-generated SEED Index that shows you the current status of all SEEDs.
We’ve started implementing a Rust API for pw_log.
The pw_alignment, pw_perf_test, and pw_status docs were refactored to follow our latest Module Docs Guidelines.
See Dec 1, 2023 in our changelog for details.
Getting Started#
Check out our Get Started landing page. We’ve got a guide that shows you how to use Pigweed in a new, Bazel-based project (the recommended path), sample code for GN-based projects, a tutorial on getting set up to contribute to upstream Pigweed, and more.
What does Pigweed offer?#
There are many modules in Pigweed; this section showcases a selection that produce visual output. For more information about the different Pigweed module offerings, refer to Module Guides section.
pw_watch
- Build, flash, run, & test on save#
In the web development space, file system watchers are prevalent. These watchers trigger a web server reload on source change, making development much faster. In the embedded space, file system watchers are less prevalent; however, they are no less useful! The Pigweed watcher module makes it easy to instantly compile, flash, and run tests upon save. Combined with the GN-based build which expresses the full dependency tree, only the exact tests affected by a file change are run on saves.
The demo below shows pw_watch building for a STMicroelectronics STM32F429I-DISC1 development board, flashing the board with the affected test, and verifying the test runs as expected. Once this is set up, you can attach multiple devices to run tests in a distributed manner to reduce the time it takes to run tests.

pw_presubmit
- Vacuum lint on every commit#
Presubmit checks are essential tools, but they take work to set up, and projects don’t always get around to it. The pw_presubmit module provides tools for setting up high quality presubmit checks for any project. We use this framework to run Pigweed’s presubmit on our workstations and in our automated building tools.
The pw_presubmit
module includes pw format
, a tool that provides a
unified interface for automatically formatting code in a variety of languages.
With pw format
, you can format C, C++, Python, GN, and Go code according to
configurations defined by your project. pw format
leverages existing tools
like clang-format
, and it’s simple to add support for new languages.

pw_env_setup
- Cross platform embedded compiler setup#
A classic problem in the embedded space is reducing the time from git clone to having a binary executing on a device. An entire suite of tools is needed for building non-trivial production embedded projects, and need to be installed. For example:
A C++ compiler for your target device, and also for your host
A build system or three; for example, GN, Ninja, CMake, Bazel
A code formatting program like clang-format
A debugger like OpenOCD to flash and debug your embedded device
A known Python version with known modules installed for scripting
A Go compiler for the Go-based command line tools
… and so on
In the server space, container solutions like Docker or Podman solve this; however, container solutions are a mixed bag for embedded systems development where one frequently needs access to native system resources like USB devices, or must operate on Windows.
pw_env_setup is our compromise solution for this problem that works on Mac, Windows, and Linux. It leverages the Chrome Infrastructure Packaging Deployment system (CIPD) to bootstrap a Python installation, which in turn inflates a virtual environment. The tooling is installed into your workspace, and makes no changes to your system. This tooling is designed to be reused by any project.

pw_unit_test
- Embedded testing for MCUs#
Unit testing is important, and Pigweed offers a portable library that’s broadly compatible with Google Test. Unlike Google Test, pw_unit_test is built on top of embedded friendly primitives; for example, it does not use dynamic memory allocation. Additionally, it is easy to port to new target platforms by implementing the test event handler interface.
Like other modules in Pigweed, pw_unit_test
is designed for use in
established codebases with their own build system, without the rest of Pigweed
or the Pigweed integrated GN build. However, when combined with Pigweed’s
build, the result is a flexible and powerful setup that enables easily
developing code on your desktop (with tests), then running the same tests
on-device.

And more!#
Here is a selection of interesting modules:
See the Module Guides for the complete list of modules and their documentation.