FerroForge's procedural macros.
Two entry points, and nothing between them, named as RTIC names the same
ideas. #[ferroforge::task] turns a task definition into an ordinary
generic function and a real context type; ferroforge::app! expands a
firmware in place into a real #[rtic::app] whose handlers construct that
context and call the function.
Neither reads the other's crate. app! emits real Rust paths into the task
crates a firmware depends on, so a wrong definition, binding or type is an
ordinary compile error at the authored line.