Embedded systems are most directly defined as computer systems embedded inside larger systems. But that does not capture the reason these systems have emerged as such active research and commercial targets. By their very nature of being located inside a myriad of systems, embedded systems span a wide range of system requirements. If there is one unifying characteristic, it is that the design goals are often wildly at odds. For example, most portable communication devices require supercomputer-class processing capabilities for audio, imaging, and video processing, but must run on a very limited battery power supply and fit in a pocket-friendly form.
Compounding this are the often tight cost constraints and very aggressive time-to-market requirements. These conflicts are why embedded systems present such interesting research and commercial challenges.
Many embedded systems execute real-time code and have complex hardware accelerators attached. The real-time software often has gaps or holes in its schedule that a programmer can exploit to reimplement the complex hardware accelerators in software. But the gaps are often too fine-grained for a simple, dynamic, process-context-switching solution.