Test-driven development for embedded c

is the title of an excellent book by James Grenning (isbn 978-1-93435-662-3). As usual I'm going to quote from a few pages:
A good design is a testable design.
TDD helps you go faster... Slowing down is exactly what is needed to go fast!
Like TDD, if testing is hard, do it all the time - it gets easier.
Test automation is the gift that keeps on giving.
One test result is worth 1,000 expert opinions [Wernher von Braun]
You get a shot of testability with a portability chaser.
If we can identify a particular code smell, we have a better chance of eliminating the bad smell.
Shifting levels of abstraction should happen for a purpose.
Refactoring should be part of everyday development. It's not on the schedule, and you don't ask for permission to refactor.
The industry norm is for code to incrementally worsen with each change. We need to reverse that.
Dual-targetting, like TDD, has another benefit: it influences your design. Paying attention to the boundaries between software and hardware produces more modular designs.