| .. _docs-release-notes-2022-jan: |
| |
| =================================== |
| Pigweed: What's New in January 2022 |
| =================================== |
| Happy new year from the Pigweed team! We’re excited to share what we’ve been up |
| to this month and we’re really looking forward to what 2022 will bring to the |
| Pigweed community. |
| |
| :ref:`Pigweed<docs-root>` is a collection of libraries and tools for building |
| robust embedded software, efficiently. Pigweed allows you to write code that |
| runs transparently on both your host machine and tiny 32-bit microcontrollers |
| like those in the :ref:`STM32<target-stm32f429i-disc1>` and |
| :ref:`Arduino<target-arduino>` families, while giving you the comforts of modern |
| software development traditionally lacking in embedded systems, like |
| :ref:`easy unit testing<module-pw_unit_test>`, |
| :ref:`powerful build systems<docs-build-system>`, |
| :ref:`flexible logging<module-pw_log>`, and |
| :ref:`reliable communication<module-pw_rpc>`. |
| |
| .. admonition:: Note |
| :class: warning |
| |
| Many Pigweed modules are already shipping in commercial products, but it is |
| still an early access project. Find out if |
| :ref:`Pigweed is right for you<docs-concepts-right-for-my-project>`. |
| |
| Pigweed is a free and open source project and we welcome contributions! Join us |
| on `Discord <https://discord.gg/M9NSeTA>`_ to share feedback, ask questions, and |
| get involved with the Pigweed community! |
| |
| ------------------------------ |
| Experimental Pigweed framework |
| ------------------------------ |
| .. admonition:: tl;dr |
| :class: checkmark |
| |
| We’re starting the “whole OS” framework version of Pigweed! It’s not ready |
| for use yet but you might want to take a peek. |
| |
| Pigweed is designed to be highly modular—you can use as many or as few of the |
| Pigweed modules as you need for your project, and those modules will work |
| flexibly in any project structure. This works great when you want to add Pigweed |
| super powers like hybrid host/target unit testing or RPC communication to an |
| existing project. While Pigweed gives you nearly all of the tools you need to |
| efficiently build a robust, reliable embedded project, until now we haven’t had |
| a great solution for building a new project on Pigweed. |
| |
| The Pigweed framework assembles an opinionated project structure, build system, |
| and development environment that does three key things: |
| |
| * Takes care of difficult but unproductive project plumbing issues like setting |
| up a target toolchain and providing support for |
| :ref:`OS abstractions<docs-os_abstraction_layers>`. |
| |
| * Configures Pigweed module backends that give you logging, asserts, threads, |
| dynamic memory allocation, and more, that work transparently both on host and |
| on target |
| |
| * Sets up a productive development environment with rich code analysis and |
| powerful device interaction tools |
| |
| You can experiment with this right now by checking out the ``pw_system`` |
| :ref:`documentation<module-pw_system>`. The experimental configuration leverages |
| FreeRTOS and runs on the STM32F429I Discovery board. With a |
| :ref:`few simple commands<target-stm32f429i-disc1-stm32cube>`, you can have a |
| complete embedded development environment set up and focus on building your |
| product. |
| |
| .. warning:: |
| |
| The Pigweed framework is still in very active development and you should |
| expect breaking changes in the future. If you’re experimenting with it, we |
| would love to hear from you! Join us on |
| `Discord <https://discord.gg/M9NSeTA>`_! |
| |
| ------------------------------------- |
| Support for plugins in ``pw_console`` |
| ------------------------------------- |
| Teams that use Pigweed quickly come to rely on the |
| :ref:`console<module-pw_console>` as a vital tool for interacting with their |
| devices via RPC. It’s now possible to tailor the console to meet your project’s |
| specific needs through a new :ref:`plugin interface<module-pw_console-plugins>`. |
| You can build your own menus, window panes, keybindings, and clickable buttons |
| to truly make ``pw_console`` your own. |
| |
| How are you using the Pigweed console in your project? Let us know on |
| `Discord <https://discord.gg/M9NSeTA>`_! |
| |
| ------------------------------------ |
| Expanded support for Bazel and CMake |
| ------------------------------------ |
| Pigweed’s primary build system is |
| `GN (Generate Ninja) <https://gn.googlesource.com/gn>`_, but to make it easier |
| to use Pigweed modules in existing projects, we have been expanding support for |
| the `Bazel <https://bazel.build/>`_ and `CMake <https://cmake.org/>`_ build |
| systems. Right now, the best way to determine which build systems a module |
| supports is to look out for ``BUILD.gn``, ``BUILD.bazel`` and ``CMakeLists.txt`` |
| files (respectively) in module directories. While we work on improving build |
| system support and documentation, check out the |
| :ref:`build system documentation<docs-build-system>` for more detailed |
| information and join us on Discord for support. |
| |
| ---------------------------------------- |
| Changes to the RPC ``ChannelOutput`` API |
| ---------------------------------------- |
| RPC endpoints use :ref:`ChannelOutput<module-pw_rpc-ChannelOutput>` instances to |
| send packets encoding RPC data. To send an encoded RPC packet, we need a buffer |
| containing the packet’s data. In the past, we could request a buffer by doing |
| something like this: |
| |
| .. code-block:: cpp |
| |
| auto buffer = pw::rpc::ChannelOutput::AcquireBuffer(buffer_size) |
| // fill in the buffer here |
| pw::rpc::ChannelOutput::SendAndReleaseBuffer(buffer) |
| |
| The ``ChannelOutput::AcquireBuffer`` and ``ChannelOutput::SendAndReleaseBuffer`` |
| methods are no longer part of ``ChannelOutput``’s public API, making its |
| internal buffer private. Now, we create our own buffer and ``ChannelOutput`` is |
| simply responsible for sending it: |
| |
| .. code-block:: cpp |
| |
| auto buffer = ... // create your own local buffer with RPC packet data |
| pw::rpc::ChannelOutput::Send(buffer) |
| |
| This approach avoids several tricky concurrency issues related to buffer |
| lifetimes, and simplifies the ``ChannelOutput`` API. It also opens up the |
| possibility of projects managing RPC buffers in more flexible ways, e.g. via |
| dynamically-allocated memory or separate shared memory mechanisms. |
| |
| .. warning:: |
| |
| This is a breaking change if you update pw_rpc, but one that can be fixed |
| quickly. |
| |
| We’re actively reviewing the RPC API with a view towards significantly improving |
| it in the future. Share your input with us on |
| `Discord <https://discord.gg/M9NSeTA>`_! |
| |
| ------------ |
| More Updates |
| ------------ |
| * It’s now possible to generate a token database from a list of strings in a |
| JSON file for ``pw_tokenizer``. This can be useful when you need to tokenize |
| strings that can’t be parsed from compiled binaries. |
| |
| * ``pw_assert``‘s new ``pw_assert_tokenized`` backend provides a much more |
| space-efficient implementation compared to using ``pw_assert_log`` with |
| ``pw_log_tokenized``. However, there are trade offs to consider, so check out |
| the :ref:`documentation<module-pw_assert_tokenized>`. |
| |
| * CMake builds now support compile-time module configuration similar to GN |
| through the use of the ``pw_add_module_config`` and ``pw_set_module_config`` |
| functions. |
| |
| * In ``pw_build``, it is now possible to set a specific working directory for |
| :ref:`pw_exec<module-pw_build-pw_exec>` actions. |
| |
| * ``pw_cpu_exception`` now supports the ARMv8M Mainline architecture in |
| ``pw_cpu_exception_cortex_m``. This allows us to take advantage of stack limit |
| boundary features in microcontrollers using that architecture, like Cortex M33 |
| and M35P. |
| |
| ------------ |
| Get Involved |
| ------------ |
| .. tip:: |
| |
| We welcome contributions from the community! Here are just a few |
| opportunities to get involved. |
| |
| * Pigweed now includes GN build files for |
| `TinyUSB <https://github.com/hathach/tinyusb>`_, a popular USB library for |
| embedded systems. Projects can now include it by cloning the TinyUSB |
| repository and configuring GN to build it. But right now, we lack interfaces |
| between TinyUSB and Pigweed abstractions like pw_stream. This is a great |
| opportunity to help get very useful functionality across the finish line. |
| |
| * We’re very interested in supporting the |
| `Raspberry Pi Pico <https://www.raspberrypi.com/products/raspberry-pi-pico/>`_ |
| and the ecosystem of devices using the RP2040 microcontroller. We will be |
| working in earnest on this in the coming months and welcome anyone who wants |
| to lend a helping hand! |
| |
| * Evolving the Pigweed framework from its current experimental state to a |
| relatively complete embedded project platform is one of our major focuses this |
| year, and we want your help. That help can range from providing input on what |
| you’re looking for in a framework, to building small projects with it and |
| providing feedback, up to contributing directly to its development. Join us to |
| talk about it on `Discord <https://discord.gg/M9NSeTA>`_! |