We occasionally have some public `foo.h` header that includes a private
`foo_arch.h` header. Users are expected to include the `foo.h` header
and not the `foo_arch.h`. However, clangd will claim that the `#include`
of `foo.h` is unused if only functions / macros/ types / ... from
`foor_arch.h` is used and nothing from `foo.h`.
This adds the `IWYU pragma: export` comment to the include of
`foo_arch.h` in `foo.h`, so that clangd treats functions / macros /
types provided by `foo_arch.h` as if they were instead provided by
`foo.h`, which fixes the false positives.
The macros CONCAT(), MIN(), and MAX() are defined over and over again in
RIOT's code base. This de-duplicates the code by moving the macros to a
common place.
Update the `atomic_fetch_<OPERATION>_u<WIDTH>()` functions to return the old
value the target contained prior to applying the operation. This makes this
API much more versatile and closer to C11 atomics.
Mark all pointers in the atomic utils API as `volatile` for the following
reasons:
1. The guarantees provided by `volatile` is a subset of the guarantees
provided by the atomic utils. This makes this fact more obvious.
2. Casting `volatile` off is undefined behavior. In order to be able to use
the atomic utils on memory mapped IO (which needs the `volatile` qualifier)
without resorting to undefined behavior, this API change is needed.