Introduction
ARM DEN0013C Copyright © 2011, 2012 ARM. All rights reserved. 1-4
ID071612 Non-Confidential
1.3 Embedded systems
An embedded system is conventionally defined as a piece of computer hardware running
software designed to perform a specific task. Examples of such systems might be TV set-top
boxes, smartcards, routers, disk drives, printers, automobile engine management systems, MP3
players or photocopiers. These contrast with what is generally considered a computer system,
that is, one that runs a wide range of general purpose software and possesses input and output
devices such as a keyboard, and a graphical display of some kind.
This distinction is becoming increasingly blurred. Consider the cellular or mobile phone. A
basic model might just perform the task of making phone calls, but modern smartphones can run
a complex operating system to which many thousands of applications are available for
download.
Embedded systems can contain very simple 8-bit microprocessors, such as an Intel 8051 or PIC
micro-controllers, or some of the more complex 32 or 64-bit processors, such as the ARM
family that form the subject matter for this book. They need some RAM and some form of
non-volatile storage to hold the program(s) to be executed by the system. Systems will almost
always have additional peripherals, relating to the actual function of the device – typically
including UARTs, interrupt controllers, timers, GPIO controllers, but also potentially quite
complex blocks such as DSPs, GPUs, or DMA controllers.
Software running on such systems is typically grouped into two separate parts: the Operating
System (OS) and applications that run on top of the OS. A wide range of operating systems are
in use, ranging from simple kernels, through complex Real-Time Operating Systems (RTOS), to
full-featured complex operating systems, of the kind that might be found on a desktop computer.
Microsoft Windows or Linux are familiar examples of the latter. In this book, we will
concentrate mainly on examples from Linux. The source code for Linux is readily available for
inspection by the reader and is likely to be familiar to many programmers. Nevertheless, lessons
learned from Linux are equally applicable to other operating systems.
There are many constraints on embedded systems that can make programming them more of a
challenge than writing an application for a general-purpose PC.
Memory Footprint
In many systems, to minimize cost (and power), memory size can be limited. The
programmer could be forced to consider the size of the program and how to
reduce memory usage while it runs.
Real-time behavior
A feature of certain systems is that there are deadlines to respond to external
events. This might be a “hard” requirement (a car braking system must respond
within a certain time) or “soft” requirement (audio processing must complete
within a certain time-frame to avoid a poor user experience – but failure to do so
under rare circumstances may not render the system worthless).
Power In many embedded systems the power source is a battery, and programmers and
hardware designers must take great care to minimize the total energy usage of the
system. This can be done, for example, by slowing the clock, reducing supply
voltage or switching off the processor when there is no work to be done.
Cost Reducing the bill of materials can be a significant constraint on system design.
Time to market
In competitive markets, the time to develop a working product can significantly
impact the success of that product.