For those in the industry this won’t come as a surprise. Embedded systems empower every aspect of modern life. Within those systems there are now hundreds of millions of lines of code, each of which has been optimised for a specific hardware platform and debugged to ensure reliability, security and safety. Developing embedded software is rapidly becoming the single largest risk and cost in product development, so choosing the right tools for the job is now fundamental to success.
The Software Development Paradigm
Embedded software programming was once a matter of manually transposing an intention expressed using mnemonics into machine code (normally represented using hexadecimal or binary values) and putting those values into a persistent storage device, readable by a microprocessor. Things have changes a lot in the last 40 years or so.
The third generation of programming languages saw high-level, platform-independent languages emerge and, with them, productivity increase. With abstraction came the ability to manage complexity which, as a result, has increased in line with processing performance. The two have provided mutual motivation ever since.
Today, developing embedded software is still platform-dependent but the balance of that dependence is changing. Increasingly higher levels of abstraction mean code is more transportable but is still reliant on the underlying hardware features. Uniquely in the embedded domain, the intrinsic link between hardware and software remains as important today as it ever has, but overall system functionality now relies more heavily on the software.
This makes software development the single most important or, at least, influential element of product development. Without embedded software, no end product would function, and without the ability to develop embedded software efficiently and reliably the overall cost of product development would become untenable, threatening innovation and progress.
The System-Level View
Software can broadly be categorised as high-level or low-level; high-level can be written to execute on a system (such as PC or Server) after the system has been fully developed, while low-level software is written to create the system. Embedded software is where the operating system, middleware (such as communication protocols and drivers) and the application code come together to interact directly with the underlying hardware (see the next section for more details), while high-level software is more dependent on the operating system and can be largely hardware-agnostic.
Developing a system architecture requires an appreciation of these two domains and how they must inevitably interact. It also requires an understanding of how software in the two domains is developed.
A relatively new trend within high-level software development involves fast and frequent iterations. This so-called Agile approach to software development is intended to accelerate development by quickly evolving a software platform against requirements that can also change or evolve in parallel with development.