The C++ source here is not particularly useful by itself.  I'm including it
mainly as an example of the way I designed the interface between the basic
and C++ side of things.  It's also interesting for anyone wondering how the
sample blending is done.

The compilation is done with commands similar to those below.  I've stripped
most of the warnings I enable and other cruft, but still there is more in these
commands that is not requried.  The linker script I've included is also very
minimal, but I believe it is all that is needed to correctly link a CSUB.

arm-none-eabi-g++ -c
                  -Wall
                  -Werror
                  -fno-common
                  -ffunction-sections
                  -fdata-sections
                  -g3
                  -std=gnu++20
                  -fno-exceptions
                  -ffreestanding
                  -flto
                  -fPIC
                  -fno-exceptions
                  -fno-rtti
                  -Os
                  -mcpu=cortex-m7
                  -mfpu=fpv5-d16
                  -mfloat-abi=hard
                  -mthumb
                  ifs.cpp
                  -o ifs.o

arm-none-eabi-g++ ifs.o
                  -Wall
                  -Werror
                  -fno-common
                  -ffunction-sections
                  -fdata-sections
                  -g3
                  -Wl,--gc-sections
                  -ffreestanding
                  -flto
                  -fPIC
                  -nostdlib
                  -nostartfiles
                  -ecsub
                  -T csub.ld
                  -Os
                  -mcpu=cortex-m7
                  -mfpu=fpv5-d16
                  -mfloat-abi=hard
                  -mthumb
                  -o ifs_csub
