0740-7475/09/$31.00 © 2009 IEEE
Published by the IEEE Computer Society
Teaching someone to fish
This is a review of Computers as Components: Principles of Embedded Computing System Design, by Wayne Wolf. Suitable for any introductory course in embedded systems design, the book can also serve in a more advanced capacity. The chapters have many worked examples, lists of questions that could serve as assignments and thought-out lab exercises, as well as a useful set of references for further reading and details on specific topics. In addition, a companion site online provides helpful supplemental material, such as PowerPoint slides for lecture preparation, errata, and labs.
It is not often that textbooks cross my desk, and it has been a shockingly long time (more than 30 years) since I last attended university courses. So when a copy of Wayne Wolf's updated Computers as Components (second edition; the first appeared in 2000), I was in a bit of a quandary as to how to review it. Luckily, Wayne's preface to the second edition indicated that this kind of material, once taught at the graduate level, was percolating down through the educational hierarchy and might now be taught in the second or third year of undergraduate computer engineering, computing, or electronics courses.
That gave me a bit of context in which to consider this text. If I were a third-year undergraduate student, how would I react to this book? Would it be a useful adjunct to the professor's lectures? When emerging dazed and confused from a hypothetical class, would recourse to this book help me fill in the gaps? And if I just read the book as an exercise in individual learning without a formal class, would I come away enlightened or unenlightened?
I am happy to report that this textbook succeeds in most ways in achieving its objectives. When learning about embedded systems design, there are two key points to keep in mind. First, one must build up from basic concepts and a basic understanding of various components, to a broader appreciation for the variety of tasks involved in architecting, detailed design, programming, and delivering embedded systems products. Second, embedded systems are nothing if not the practical application of computing and communications system knowledge to product design. Theory helps in very selective parts and in selective ways, but a practical and pragmatic approach to learning about embedded systems design is essential. Examples will trump theories in usefulness in this design domain.
Wayne Wolf's book opens with an overview of embedded computing that covers the major themes of the rest of the book. This includes both the hard topics of components and the characteristics of systems, as well as the softer topics of design process and a motivating example based on a model-train controller. Simplified use of UML diagrams here and in other chapters help in the explanations of the examples—an appendix gives a brief overview of the parts of UML that are relevant to the book.
Chapter 2 introduces computers for embedded systems via their instruction sets and an overview of relevant architectural concepts. Two examples—an ARM RISC processor—and a TI C55x DSP—are used to illustrate two of the key classes of processors in embedded systems, showing how they are similar and where the differences between them lie. Chapter 3 builds from this focus to concentrate on CPUs and their interfaces—programming input and output, exceptions, coprocessors, memory interfaces and caches, and performance and power consumption issues.
In chapter 4 we are introduced to classical bus-based systems and the various devices that are linked to processors using hierarchical buses, with examples of memories, I/O devices (including timers, keyboards, displays, and the like), and then an exposition of system design principles to begin to put these systems together. As with the earlier chapters, smaller worked examples and a major chapter example emphasize the pragmatic trade-offs needed to be successful with embedded designs.
Chapters 5 and 6 move from components and architectures into software, with the first covering program design and analysis, and the second covering processes and real-time operating systems. A little more theory is introduced in these chapters but in light doses as the topics require. The guidelines on program optimization in chapter 5 are well written and clear to read; the use of some of the basic ideas on process scheduling in chapter 6 is a lucid exposition and just enough theory to get the point across.
Chapters 7, 8, and 9 round the book out with a look at multiprocessors, networks, and a deeper look at system design techniques and processes. Chapter 7 has an interesting survey of many consumer-embedded systems that use heterogeneous processors including cell phones, CD/DVD players, audio players, video players, and cameras. Chapter 8 discusses distributed embedded systems and networks in the small and in the larger domain, including in vehicles, on the Internet, and in sensor networks. Chapter 9, on system design, covers processes and methodologies including requirements capture and analysis, system analysis and architecture design, and quality assurance, along with case study descriptions of examples where systems went wrong in terms of design.
The textbook is comprehensive and could be the basis for a variety of courses that emphasize different aspects of embedded computing system design. There are a few things that I wish had been dealt with in more detail. With my own background in application-specific instruction set processors, an example of one—say in the audio or video domain—in chapter 7 would have complemented the approaches discussed. The idea of a network-on-chip or NoC could have been introduced briefly in chapter 8. And a little bit more about multiprocessors—in particular, a brief discussion on where symmetric multiprocessing (SMP) cache-coherent multicore processors might be useful in the control plane of embedded systems as they evolve—would have been a useful update in an area of reasonably rapid development. Anyone wishing to use this text for a course will be able (while using the text as the primary reference) to find many supplementary references and resources that cover these additional areas.
This book is a good textbook for any introductory course in embedded systems design, and it can also serve in a more advanced capacity. Wayne Wolf has also provided many of the normal adjuncts to a modern technical textbook. The chapters have many worked examples, lists of questions that could serve as assignments and thought-out lab exercises, as well as a useful set of references for further reading and details on specific topics. In addition, there is a companion site online ( http://www.waynewolf.us
) that provides a number of items: errata for the book, PowerPoint slides that could be used to help prepare lectures based on the book contents, labs that the author has used in his own courses at Princeton University and Georgia Tech, other useful downloads complementing the book contents, and links to relevant external sites. If you need to teach a course on embedded systems, or if you just want to learn on your own, I recommend taking a good look at this text.