I worked hard on my previous project to achieve a 5sec build-run-test cycle for a medium-sized embedded C project (we don't have monster workstations, just some i7-10xxx/16GiB PCs).
Thinking about proper modularization, runtime code (hot-re)loading, and eliminating single-point-of-recompilation for header files goes a long way.
The gamedev industry figured this out a long time ago, see Handmade Hero's Hot reloading[0].
Also, an interactive shell (we use IPython) with all of the compiling and debugging utilities you need is easily a 5x efficiency boost, e.g. I can run `./devshell.py <NAME_OF_TARGET>`, then `run('foo', 'bar')` and the script will compile, upload, and re-execute the `foo` and `bar` modules. Makes onboarding much easier too.
Thinking about proper modularization, runtime code (hot-re)loading, and eliminating single-point-of-recompilation for header files goes a long way.
The gamedev industry figured this out a long time ago, see Handmade Hero's Hot reloading[0].
Also, an interactive shell (we use IPython) with all of the compiling and debugging utilities you need is easily a 5x efficiency boost, e.g. I can run `./devshell.py <NAME_OF_TARGET>`, then `run('foo', 'bar')` and the script will compile, upload, and re-execute the `foo` and `bar` modules. Makes onboarding much easier too.
[0]: https://www.youtube.com/watch?v=Pax5jIz6m_Q