Developing an embedded system is hard work. Reliability is essential; indeed, embedded software may control a safety- or security-critical system where an error can have catastrophic consequences. New requirements will almost surely pop up, so the software must be maintain- able. Real-time constraints and memory limitations make time and space predictability and run-time performance important.