Functional memory-mapped register I/O using modern C++.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Clyne 2a5fe35aee Merge pull request 'external-register' (#1) from external-register into master
Reviewed-on: #1
2 years ago update documentation 2 years ago
LICENSE Initial commit 2 years ago update documentation 2 years ago
funreg.hpp add guide; couple small fixes 2 years ago

funreg: Functional Register I/O using modern C++

funreg provides a functional approach to interacting with registers. The library includes support for memory-mapped registers; however, other types of registers can be supported through creating a simple access interface.

A unique feature of this library is its ability to handle multiple register operations with a single function call; these operations will be merged together so that the register is only read and written once.

Registers may also be organized into groups. These groups can similarly receive a list of operations, which will be directed the to the appropriate registers for the same single-read-single-write process.

For example, LEDs can be controlled by a microcontroller with a single call:

LEDS::modify<LED1::set, LED2::clear, LED3::set>(); matter if the LEDs use different registers, or if any of them are controlled by an external circuit rather than a built-in IO peripheral.

See for a walk-through of the available functionality.

Feature overview

  • Define registers of any size, at any address, with optional custom access interface
  • Define register masks to name the bits of registers
  • Define register groups so ease programming (e.g. define an RTC group to work with all real-time clock registers at once)
  • Make modifications through groups, masks, or the registers directly


  • C++20
  • GCC or Clang with some optimization enabled (O1, O2, O3, Os).