What is an embedded system?
A general definition of embedded systems is: embedded systems are computing systems with tightly coupled hardware and software integration that are designed to perform a dedicated function. The word embedded reflects the fact that these systems are usually an integral part of a larger system, known as the embedding system. Multiple embedded systems can coexist in an embedding system.
Example of an embedded system
The digital audio/video decoding system, called the A/V decoder, which is an integral part of the DST, is an embedded system. The A/V decoder accepts a single multimedia stream and produces sound and video frames as output. The signals received from the satellite by the DST contain multiple streams or channels. Therefore, the A/V decoder works in conjunction with the transport stream decoder, which is yet another embedded system. The transport stream decoder de-multiplexes the incoming multimedia streams into separate channels and feeds only the selected channel to the A/V decoder.
As shown in Figure, embedded systems in the home assume many forms, including security systems, cable and satellite boxes for televisions, home theater systems, and telephone answering machines. As advances in microprocessors continue to improve the functionality of ordinary products, embedded systems are helping drive the development of additional home-based innovations.
Hardware and Software for Embedded system
Commonly both the hardware and the software for an embedded system are developed in parallel.
The hardware components within an embedded system can only directly transmit, store, and execute machine code, a basic language consisting of ones and zeros. Machine code was used in earlier days to program computer systems, which made creating any complex application a long and tedious ordeal. In order to make programming more efficient, machine code was made visible to programmers through the creation of a hardware-specific set of instructions, where each instruction corresponded to one or more machine code operations. These hardware- specific sets of instructions were referred to as assembly language.
Over time, other programming languages, such as C, C++, Java, etc., evolved with instruction sets that were (among other things) more hardware-independent. These are commonly referred to as highlevel languages because they are semantically further away from machine code, they more resemble human languages, and are typically independent of the hardware. This is in contrast to a low-level language, such as assembly language, which more closely resembles machine code. Unlike high-level languages, low-level languages are hardware dependent, meaning there is a unique instruction set for processors with different architectures.
Machine code is the only language the hardware can directly execute; all other languages need some type of mechanism to generate the corresponding machine code. This mechanism usually includes one or some combination of preprocessing, translation, and interpretation.
Depending on the language, these mechanisms exist on the programmer’s host system (typically a non-embedded development system, such as a PC or Sparc station), or the target system (the embedded system being developed).
Preprocessing is an optional step that occurs before either the translation or interpretation of source code, and whose functionality is commonly implemented by a preprocessor. The preprocessor’s role is to organize and restructure the source code to make translation or interpretation of this code easier. As an example, in languages like C and C++, it is a preprocessor that allows the use of named code fragments, such as macros, that simplify code development by allowing the use of the macro’s name in the code to replace fragments of code. The preprocessor then replaces the macro name with the contents of the macro during preprocessing. The preprocessor can exist as a separate entity, or can be integrated within the translation or interpretation unit.
Many languages convert source code, either directly or after having been preprocessed through use of a compiler, a program that generates a particular target language—such as machine code and Java byte code—from the source language A compiler typically “translates” all of the source code to some target code at one time. As is usually the case in embedded systems, compilers are located on the programmer’s host machine and generate target code for hardware platforms that differ from the platform the compiler is actually running on. These compilers are commonly referred to as cross-compilers.
In the case of assembly language, the compiler is simply a specialized cross-compiler referred to as an assembler, and it always generates machine code. Other high-level language compilers are commonly referred to by the language name plus the term “compiler,” such as “Java compiler” and “C compiler.” High-level language compilers vary widely in terms of what is generated. Some generate machine code, while others generate other high-level code, which then requires what is produced to be run through at least one more compiler or interpreter, as discussed later in this section. Other compilers generate assembly code, which then must be run through an assembler.
After all the compilation on the programmer’s host machine is completed, the remaining target code file is commonly referred to as an object file, and can contain anything from machine code to Java byte code , depending on the programming language used.
As shown in Figure above, after linking this object file to any system libraries required, the object file, commonly referred to as an executable, is then ready to be transferred to the target embedded system’s memory.
Where a compiler usually translates the entire given source code at one time, an interpreter generates (interprets) machine code one source code line at a time.
Want to know the hot topic of next discussion? Visit again…
Ref source : Embedded Systems Architecture by Tammy Noergaard