Pigweed#

Pigweed AI summary: Pigweed is an open source collection of embedded-targeted libraries or modules that enable faster and more reliable development on small-footprint microcontrollers. It is currently in early access, but many modules are already shipping in production. If you're interested in using Pigweed, you can reach out in their chat room or on their mailing list. Pigweed offers various modules, including pw_watch, pw_presubmit, pw_env_setup, pw_unit_test, and more. These modules provide features such as

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.

Getting Started#

Pigweed AI summary: The paragraph summarizes the steps to get started with Pigweed, a library for broader projects. It suggests checking out the Pigweed Sample Project to understand how to use Pigweed as a library. It also mentions visiting the Getting Started guide for instructions on setting up a Pigweed environment, building Pigweed, running tests, and more. Additionally, it mentions the option to use Pigweed with Zephyr and provides a reference for getting started with Zephyr and Pigweed.

Check out Pigweed Sample Project to see how to use Pigweed as a library in your broader project.

Visit the Getting Started guide to learn how to bootstrap and activate a Pigweed environment, build Pigweed for a specific host or device, run tests, and more.

Zephyr#

Pigweed AI summary: The paragraph mentions a reference to a document called "Get started with Zephyr and Pigweed" in the Zephyr section.

See Get started with Zephyr and Pigweed.

What does Pigweed offer?#

Pigweed AI summary: Pigweed offers various modules that provide visual output. Some of these modules include pw_watch, which allows for instant compilation, flashing, and running of tests upon saving; pw_presubmit, which provides tools for setting up high-quality presubmit checks for any project; pw_env_setup, which is a cross-platform embedded compiler setup solution; and pw_unit_test, which offers embedded testing for MCUs. Other interesting modules include pw_cpu_exception, pw_polyfill, pw_tokenizer, pw_k

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#

Pigweed AI summary: The Pigweed watcher module allows for instant compilation, flashing, and running of tests upon saving changes in the embedded space. This is similar to file system watchers in web development, but less prevalent in the embedded space. The GN-based build only runs the affected tests, making development faster. The demo shows pw_watch building for a development board, flashing the board with the affected test, and verifying the test runs as expected. Multiple devices can be attached to run tests in a distributed manner to reduce test time

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 watch running on-device tests

pw_presubmit - Vacuum lint on every commit#

Pigweed AI summary: The pw_presubmit module provides tools for setting up high quality presubmit checks for any project, including the pw format tool that automatically formats code in various languages. It leverages existing tools like clang-format and is easy to add support for new languages. A demo of pw_presubmit is shown in an accompanying GIF.

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 presubmit demo

pw_env_setup - Cross platform embedded compiler setup#

Pigweed AI summary: The process of setting up a development environment for embedded systems can be time-consuming and requires multiple tools to be installed, such as a C++ compiler, build systems, code formatting programs, debuggers, and more. Container solutions like Docker or Podman are not always suitable for embedded systems development due to the need for native system resources. pw_env_setup is a solution that works on Mac, Windows, and Linux, leveraging the Chrome Infrastructure Packaging Deployment system to bootstrap a Python installation and create a virtual environment

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 environment setup demo

pw_unit_test - Embedded testing for MCUs#

Pigweed AI summary: The article discusses the importance of unit testing and introduces Pigweed's portable library, pw_unit_test, which is compatible with Google Test but built on embedded-friendly primitives and does not use dynamic memory allocation. It also highlights the ease of porting to new target platforms by implementing the test event handler interface. The article emphasizes that pw_unit_test is designed for use in established codebases with their own build system, but when combined with Pigweed's build, it enables easily developing code on desktop and running the

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.

pw_status test run natively on host

And more!#

Pigweed AI summary: The paragraph summarizes a selection of interesting modules available. These modules include pw_cpu_exception, pw_polyfill, pw_tokenizer, pw_kvs, pw_protobuf, and pw_console. Each module has a brief description of its functionality. The paragraph also mentions that there are more modules available, and directs readers to the Module Guides for the complete list and documentation.

Here is a selection of interesting modules:

pw_cpu_exception

An interface for entering CPU exception handlers. Includes robust low level hardware fault handling for ARM Cortex-M; the handler even has unit tests written in assembly to verify nested-hardware-fault handling!

pw_polyfill

Similar to JavaScript “polyfill” libraries, this module provides selected C++17 standard library components that are compatible with C++14.

pw_tokenizer

Replace string literals from log statements with 32-bit tokens, to reduce flash use, reduce logging bandwidth, and save formatting cycles from log statements at runtime.

pw_kvs

A key-value-store implementation for flash-backed persistent storage with integrated wear levelling. This is a lightweight alternative to a file system for embedded devices.

pw_protobuf

An early preview of our wire-format-oriented protocol buffer implementation. This protobuf compiler makes a different set of implementation tradeoffs than the most popular protocol buffer library in this space, nanopb.

pw_console

Interactive Python repl and log viewer designed to be a a complete solution for interacting with hardware devices using pw_rpc over a pw_hdlc transport.

See the Module Guides for the complete list of modules and their documentation.