As the embedded world expands, developers must have a strong grasp of many complex topics in order to make faster, more efficient and more powerful microprocessors to meet the public's growing demand. "Embedded Software: The Works" covers all the key subjects embedded engineers need to understand in order to succeed, including Design and Development, Programming, Languages including C/C++, and UML, Real Time Operating Systems Considerations, Networking, and much more. New material on Linux, Android, and multi-core gives engineers the up-to-date practical know-how they need in order to succeed. Colin Walls draws upon his experience and insights from working in the industry, and covers the complete cycle of embedded software development: its design, development, management, debugging procedures, licensing, and reuse. For those new to the field, or for experienced engineers looking to expand their skills, Walls provides the reader with detailed tips and techniques, and rigorous explanations of technologies. This title includes: new chapters on Linux, Android, and multi-core - the cutting edge of embedded software development. An introductory roadmap that guides readers through the book provides a route through the separate chapters and showing how they are linked. Accompanying source code and PowerPoint slides provide helpful training material and real-world experience for readers. About the Author: Colin Walls has over twenty-five years experience in the electronics industry, largely dedicated to embedded software. A frequent presenter at conferences and seminars and author of numerous technical articles and two books on embedded software, he is a member of the marketing team of the Mentor Graphics Embedded Software Division. He writes a regular blog on the Mentor website (blogs.mentor.com/colinwalls).
Foreword xix
Preface to the First Edition xxiii
Preface to the Second Edition xxix
What's on the Website? xxxi
Roadmap to Embedded Software Development xxxv
Chapter 1 Embedded Software 1 (46)
1.1 What Makes an Embedded Application 1 (7)
Tick?
1.1.1 Development Challenges 2 (1)
1.1.2 Reusable Software 3 (1)
1.1.3 Real-Time Operating System 4 (1)
1.1.4 File System 5 (1)
1.1.5 USB 5 (1)
1.1.6 Graphics 5 (1)
1.1.7 Networking 6 (2)
1.1.8 Conclusion 8 (1)
1.2 Memory in Embedded Systems 8 (4)
1.2.1 Memory 9 (1)
1.2.1 Implementation Challenges 10 (1)
1.2.3 When All Goes Wrong 11 (1)
1.2.4 When All Goes Right 11 (1)
1.3 Memory Architectures 12 (6)
1.3.1 The Options 12 (1)
1.3.2 Flat Single-Space Memory 13 (1)
1.3.3 Segmented Memory 13 (1)
1.3.4 Bank-Switched Memory 14 (1)
1.3.5 Multiple-Space Memory 15 (2)
1.3.6 Virtual Memory 17 (1)
1.3.7 Cache Memory 17 (1)
1.3.8 Memory Management Units 17 (1)
1.3.9 Conclusions 18 (1)
1.4 How Software Influences Hardware 18 (4)
Design
1.4.1 Who Designs the Hardware? 18 (1)
1.4.2 Software Leading Hardware 19 (1)
1.4.3 Software/Hardware Trade-Offs 19 (1)
1.4.4 Debug Hardware 20 (1)
1.4.5 Self-Test Support 21 (1)
1.4.6 Conclusions 22 (1)
1.5 Migrating Your Software to a New 22 (7)
Processor Architecture
1.5.1 Target Specifics 22 (3)
1.5.2 RTOS Issues 25 (1)
1.5.3 Processor Migration and Open 26 (3)
Standards
1.5.4 Conclusions 29 (1)
1.6 Embedded Software for Transportation 29 (4)
Applications
1.6.1 Introduction 29 (1)
1.6.2 Transportation System 29 (1)
Characteristics
1.6.3 Programming Issues 30 (1)
1.6.4 Real-Time Operating System Factors 31 (1)
1.6.5 Conclusions 32 (1)
1.7 How to Choose a CPU for Your System 33 (3)
on Chip Design
1.7.1 Design Complexity 33 (1)
1.7.2 Design Reuse 33 (1)
1.7.3 Memory Architecture and Protection 34 (1)
1.7.4 CPU Performance 34 (1)
1.7.5 Power Consumption 35 (1)
1.7.6 Costs 35 (1)
1.7.7 Software Issues 35 (1)
1.7.8 Multicore SoCs 35 (1)
1.7.9 Conclusions 36 (1)
1.8 An Introduction to USB Software 36 (4)
1.8.1 What Is USB? 36 (1)
1.8.2 A USB Peripheral 37 (1)
1.8.3 USB Communications 37 (1)
1.8.4 USB Software 38 (1)
1.8.5 USB and Embedded Systems 39 (1)
1.8.6 Conclusions 40 (1)
1.9 Toward USB 3.0 40 (7)
1.9.1 Introduction 41 (1)
1.9.2 Bus Architecture 41 (1)
1.9.3 Cables and Connectors 41 (1)
1.9.4 Packet Routing 41 (1)
1.9.5 Bidirectional Protocol Flow 41 (1)
1.9.6 Bulk Streaming 42 (1)
1.9.7 USB 3.0 Power Management 43 (1)
1.9.8 USB 3.0 Hubs 43 (1)
1.9.9 xHCI---New Host Controller 43 (1)
Interface
1.9.10 Future Applications for USB 43 (1)
1.9.11 Conclusions 44 (1)
Further Reading 45 (2)
Chapter 2 Design and Development 47 (54)
2.1 Emerging Technology for Embedded 47 (7)
Systems Software Development
2.1.1 Microprocessor Device Technology 48 (1)
2.1.2 System Architecture 48 (2)
2.1.3 Design Composition 50 (1)
2.1.4 Software Content 51 (1)
2.1.5 Programming Languages 52 (1)
2.1.6 Software Team Size and 52 (1)
Distribution
2.1.7 UML and Modeling 53 (1)
2.1.8 Key Technologies 53 (1)
2.1.9 Conclusions 54 (1)
2.2 Making Development Tool Choices 54 (11)
2.2.1 The Development Tool Chain 54 (1)
2.2.2 Compiler Features 55 (1)
2.2.3 Extensions for Embedded Systems 56 (2)
2.2.4 Optimizations 58 (1)
2.2.5 Build Tools: Key Issues Recapped 59 (1)
2.2.6 Debugging 59 (4)
2.2.7 Debug Tools: Key Issues Recapped 63 (1)
2.2.8 Standards and Development Tool 63 (1)
Integration
2.2.9 Implications of Selections 64 (1)
2.2.10 Conclusions 65 (1)
2.3 Eclipse---Bringing Embedded Tools 65 (4)
Together
2.3.1 Introduction 65 (1)
2.3.2 Eclipse Platform Philosophy 66 (1)
2.3.3 Platform 66 (1)
2.3.4 How Eclipse Gets Embedded 67 (2)
2.3.5 Conclusions 69 (1)
2.4 A Development System That Crosses 69 (4)
RTOS Boundaries
2.4.1 Are Standards the Solution? 69 (1)
2.4.2 The Eclipse Solution 70 (1)
2.4.3 Eclipse Plug-Ins 70 (1)
2.4.4 Eclipse Licensing 71 (1)
2.4.5 Eclipse User Advantages 71 (1)
2.4.6 Perspectives 71 (1)
2.4.7 Nonembedded Plug-Ins 72 (1)
2.5 Embedded Software and UML 73 (12)
2.5.1 Why Model in UML? 73 (4)
2.5.2 Separating Application from 77 (4)
Architecture
2.5.3 xtUML Code Generation 81 (3)
2.5.4 Conclusions 84 (1)
2.6 User Interface Development 85 (5)
2.6.1 User Interface Diversity 85 (1)
2.6.2 Implementing a User Interface 86 (2)
2.6.3 A Rationalized UI Solution 88 (2)
2.6.4 Conclusions 90 (1)
2.7 Software and Power Consumption 90 (11)
2.7.1 Introduction 90 (2)
2.7.2 Software Issues 92 (2)
2.7.3 Power Control in Software 94 (2)
2.7.4 Multicore 96 (1)
2.7.5 Hardware Issues 97 (2)
2.7.6 Virtual Programming 99 (1)
2.7.7 Conclusions 99 (2)
Chapter 3 Programming 101 (24)
3.1 Programming for Exotic Memories 101 (4)
3.1.1 Exotic Memories 101 (1)
3.1.2 Nonvolatile RAM 102 (2)
3.1.3 Shared Memory 104 (1)
3.1.4 Conclusions 105 (1)
3.2 Self-Testing in Embedded Systems 105 (4)
3.2.1 Memory Testing 105 (3)
3.2.2 Input/Output Devices 108 (1)
3.2.3 Multithreading Issues 108 (1)
3.2.4 Watchdogs 109 (1)
3.2.5 Self-Test Failures 109 (1)
3.2.6 Final Points 109 (1)
3.3 A Command-Line Interpreter 109 (9)
3.3.1 Embedded Systems Diagnostics 110 (1)
3.3.2 An Embedded System Comes Alive 111 (1)
3.3.3 A Command-Line 111 (1)
Interpreter---Requirements
3.3.4 Designing a Command-Line 111 (1)
Interpreter
3.3.5 A CLI Implementation 112 (1)
3.3.6 CLI Prototype Code 113 (5)
3.3.7 Conclusions 118 (1)
3.4 Traffic Lights: An Embedded Software 118 (7)
Application
3.4.1 The Application 119 (1)
3.4.2 Hardware Configuration 119 (1)
3.4.3 Program Implementation 119 (1)
3.4.4 Main Loop 120 (1)
3.4.5 Interrupts 121 (1)
3.4.6 Time Delays 122 (1)
3.4.7 Lights 122 (1)
3.4.8 Using Global Variables 123 (2)
Chapter 4 C Language 125 (52)
4.1 C Common 125 (3)
4.2 Using C Function Prototypes 128 (2)
4.2.1 Before Prototypes 128 (1)
4.2.2 Applying Prototypes 129 (1)
4.2.3 Prototypes in Use 129 (1)
4.3 Interrupt Functions and ANSI Keywords 130 (4)
4.3.1 Interrupt Functions 130 (2)
4.3.2 ANSI C const Keyword 132 (1)
4.3.3 ANSI C Volatile Keyword 133 (1)
4.4 Bit by Bit 134 (4)
4.4.1 Bitwise Operators 135 (1)
4.4.2 Binary Constants 135 (1)
4.4.3 Bit Fields in Structures 135 (1)
4.4.4 Microprocessor Bit-Field 136 (1)
Instructions
4.4.5 I/O Devices and Bit Fields 137 (1)
4.4.6 Conclusions 138 (1)
4.5 Programming Floating-Point 138 (3)
Applications
4.5.1 A Test Case 138 (1)
4.5.2 Running the Test Case 139 (1)
4.5.3 Troubleshooting 140 (1)
4.5.4 Lessons Learned 140 (1)
4.6 Looking at C---A Different Perspective 141 (3)
4.6.1 Static Things 141 (1)
4.6.2 All Those Semicolons 142 (1)
4.6.3 Pointers and Pointer Arithmetic 142 (1)
4.6.4 When Being Clever Is Not Being 142 (1)
Smart
4.6.5 Conclusions 143 (1)
4.7 Reducing Function Call Overhead 144 (4)
4.7.1 Compilers and Structured Code 144 (1)
4.7.2 Inline Functions 145 (1)
4.7.3 Function Calls 145 (1)
4.7.4 Parameter Passing 145 (1)
4.7.5 Local Storage 146 (1)
4.7.6 Stack Frame Generation 146 (2)
4.7.7 Return Values 148 (1)
4.7.8 Conclusions 148 (1)
4.8 Structure Layout---Become an Expert 148 (14)
4.8.1 Key Concepts 149 (4)
4.8.2 Bit Fields 153 (1)
4.8.3 Tips and Techniques 154 (8)
4.9 Memory and Programming in C 162 (2)
4.9.1 Memory 163 (1)
4.9.2 Sections 163 (1)
4.9.3 Conclusions 163 (1)
4.10 Pointers and Arrays in C and C++ 164 (2)
4.10.1 Pointers and Pointer Arithmetic 164 (1)
4.10.2 Arrays and Pointers 165 (1)
4.10.3 Conclusions 166 (1)
4.11 Using Dynamic Memory in C and C++ 166 (11)
4.11.1 C/C++ Memory Spaces 166 (2)
4.11.2 Dynamic Memory in C 168 (1)
4.11.3 Dynamic Memory in C++ 169 (1)
4.11.4 Issues and Problems 170 (1)
4.11.5 Memory Fragmentation 171 (2)
4.11.6 Memory with an RTOS 173 (1)
4.11.7 Real-Time Memory Solutions 174 (1)
4.11.8 Conclusions 175 (2)
Chapter 5 C++ 177 (52)
5.1 C++ in Embedded Systems---A 177 (2)
Management Perspective
5.1.1 Embedded Systems Development Teams 177 (1)
5.1.2 Object-Oriented Programming 178 (1)
5.1.3 Team Management and 178 (1)
Object-Oriented Techniques
5.1.4 C++ as an Object-Oriented Language 178 (1)
5.1.5 Overheads 179 (1)
5.1.6 The Way Forward 179 (1)
5.2 Why Convert from C to C++? 179 (6)
5.2.1 Hide Implementation Details 180 (1)
5.2.2 Reuse Class Code 180 (1)
5.2.3 Reuse Generic Classes 181 (1)
5.2.4 Extend Operators 181 (1)
5.2.5 Derive Classes from Base Classes 181 (1)
5.2.6 Avoid Errors Through Function 182 (1)
Prototyping
5.2.7 Add Parameters Without Changing 182 (1)
Function Calls
5.2.8 Using Safer, Simpler I/O 182 (1)
5.2.9 Improve Performance with Fast 183 (1)
Inline Functions
5.2.10 Overload Function Names 183 (1)
5.2.11 Embedded System Support 184 (1)
5.2.12 Change Involves Effort 184 (1)
5.2.13 Massage C Code into C++ 184 (1)
5.2.14 The Hard Part: Designing Objects 185 (1)
5.2.15 If It Ain't Broke, Don't Fix it 185 (1)
5.3 Clearing the Path to C++ 185 (9)
5.3.1 A Strategy for Transition 186 (1)
5.3.2 Evolutionary Steps 186 (1)
5.3.3 Applying Reusability 186 (1)
5.3.4 Writing Clean C 187 (4)
5.3.5 C+---Nearly C++ 191 (3)
5.3.6 Conclusions---The Path Ahead 194 (1)
5.4 C++ Templates---Benefits and Pitfalls 194 (6)
5.4.1 What Are Templates? 195 (2)
5.4.2 Template Instantiation 197 (1)
5.4.3 Problems with Templates 197 (1)
5.4.4 Multiple Template Parameters 198 (1)
5.4.5 Other Template Applications 199 (1)
5.4.6 Conclusions 199 (1)
5.4.7 Postscript 199 (1)
5.5 Exception Handling in C++ 200 (7)
5.5.1 Error Handling in C 200 (1)
5.5.2 Does Not Involve Interrupts 200 (1)
5.5.3 C++ Exception Handling 201 (2)
5.5.4 Special Cases 203 (3)
5.5.5 EHS and Embedded Systems 206 (1)
5.5.6 Conclusions 206 (1)
5.6 Looking at Code Size and Performance 207 (7)
with C++
5.6.1 How Efficient Is C++ Compared to 207 (1)
C?
5.6.2 How C++ Affects Application 208 (4)
Memory Requirements
5.6.3 Doing C++ Right 212 (1)
5.6.4 Conclusions 213 (1)
5.7 Write-Only Ports in C++ 214 (9)
5.7.1 Encapsulating Expertise 214 (1)
5.7.2 Defining the Problem 214 (2)
5.7.3 A Solution in C 216 (1)
5.7.4 A First Attempt in C++ 216 (1)
5.7.5 Using Overloaded Operators 217 (1)
5.7.6 Enhancing the wop Class 218 (1)
5.7.7 Addressing Reentrancy 219 (2)
5.7.8 Using an RTOS 221 (1)
5.7.9 Expertise Encapsulated 222 (1)
5.7.10 Other Possibilities 223 (1)
5.7.11 The Way Forward 223 (1)
5.8 Using Nonvolatile RAM with C++ 223 (6)
5.8.1 Requirements of Using Nonvolatile 223 (1)
RAM with C++
5.8.2 NVRAM Implementation 224 (1)
5.8.3 A C++ nvram Class 224 (3)
5.8.4 Enhancing the nvram Class 227 (1)
5.8.5 Conclusions 227 (1)
Further Reading 228 (1)
Chapter 6 Real Time 229 (14)
6.1 Real-Time Systems 229 (3)
6.1.1 Implementing an RTS 230 (1)
6.1.2 A Processing Loop 230 (1)
6.1.3 Interrupts 230 (1)
6.1.4 Multitasking 231 (1)
6.1.5 Using an RTOS 232 (1)
6.2 Visualizing Program Models of 232 (4)
Embedded Systems
6.2.1 Which Programming Model Is Best 232 (1)
for Building Real-Time Systems?
6.2.2 What Purpose Do Models Serve for 232 (1)
a Real-Time System?
6.2.3 What Differences Exist Between 233 (1)
Models, and What Gains Require What
Sacrifices?
6.2.4 What Is the Single-Threaded 233 (1)
Programming Model?
6.2.5 What Are the Advantages and 233 (1)
Disadvantages of the Single-Threaded
Programming Model?
6.2.6 Is a Polling Loop a 233 (1)
Single-Threaded Program?
6.2.7 Is a State Machine a 234 (1)
Single-Threaded Program?
6.2.8 What Is a Multi-Threaded System? 234 (1)
6.2.9 What Are the Advantages and 234 (1)
Disadvantages of the Multi-Threaded
Programming Model?
6.2.10 Can Multiple Threads of 235 (1)
Execution Really Run Simultaneously on
One CPU?
6.2.11 How Can a Multi-Threaded 235 (1)
Environment for a Real-Time System Be
Acquired?
6.3 Event Handling in Embedded Systems 236 (3)
6.3.1 What Is an Event? 236 (1)
6.3.2 Is a Signal the Same Thing as an 237 (1)
Event?
6.3.3 What Events Are the Most Time 237 (1)
Critical?
6.3.4 What Does the Microprocessor Do 237 (1)
When it Detects an Exception?
6.3.5 Are All Exceptions the Same? 237 (1)
6.3.6 What Is a Synchronous Exception? 237 (1)
6.3.7 What Is an Asynchronous Exception? 238 (1)
6.3.8 How Do Interrupts Get Generated 238 (1)
and Serviced?
6.3.9 What State Gets Saved by the CPU? 238 (1)
6.3.10 Is the Machine State the Same as 238 (1)
the Thread State?
6.3.11 Should I Write Exception 239 (1)
Handlers in Assembly Language or in C?
6.3.12 How Do I Avoid Doing Work in the 239 (1)
Exception Handler?
6.4 Programming for Interrupts 239 (4)
6.4.1 Setting up Interrupts 240 (1)
6.4.2 Interrupt Service Routines 240 (1)
6.4.3 Interrupt Vector 241 (1)
6.4.4 Initialization 241 (1)
6.4.5 Conclusions 241 (2)
Chapter 7 Real-Time Operating Systems 243 (44)
7.1 Debugging Techniques with an RTOS 243 (11)
7.1.1 Introduction 243 (1)
7.1.2 Multiprocess Concept 244 (1)
7.1.3 Execution Environment 245 (1)
7.1.4 Target Connection 246 (1)
7.1.5 Debugging Modes 247 (1)
7.1.6 RTOS-Aware Debugging Functionality 248 (2)
7.1.7 Shared Code 250 (1)
7.1.8 Task-Aware Breakpoints 250 (1)
7.1.9 Dependent Tasks 251 (1)
7.1.10 Memory Management Units 252 (1)
7.1.11 Multiple Processors 253 (1)
7.1.12 Conclusions 254 (1)
7.2 A Debugging Solution for a Custom 254 (4)
Real-Time Operating System
7.2.1 Implementing Task-Aware Debugging 255 (1)
7.2.2 Task-Awareness Facilities 256 (2)
7.2.3 Conclusions 258 (1)
7.3 Debugging---Stack Overflows 258 (1)
7.3.1 Conclusions 259 (1)
7.4 Bring in the Pros---When to Consider 259 (6)
a Commercial RTOS
7.4.1 Commercial and Custom RTOSes 260 (1)
7.4.2 Advantages of a Commercial RTOS 260 (1)
7.4.3 Commercial RTOS Downsides 260 (1)
7.4.4 Why Write a Custom RTOS? 261 (1)
7.4.5 Reasons Not to Create a Custom 262 (1)
RTOS
7.4.6 Conclusions 263 (2)
7.5 On the Move 265 (6)
7.5.1 Migrating from One RTOS to Another 265 (1)
7.5.2 Code Migration 265 (1)
7.5.3 Wrappers 266 (3)
7.5.4 Drivers and More 269 (1)
7.5.5 Debugging Issues 269 (1)
7.5.6 Conclusions 269 (2)
7.6 Introduction to RTOS Driver 271 (3)
Development
7.6.1 The Two Sides of a Device Driver 272 (1)
7.6.2 Data Corruption 272 (1)
7.6.3 Thread Control 272 (1)
7.6.4 Program Logic 273 (1)
7.6.5 Conclusions 274 (1)
7.7 Scheduling Algorithms and Priority 274 (4)
Inversion
7.7.1 Introduction 274 (1)
7.7.2 Real-Time Requirements 274 (1)
7.7.3 Scheduling Algorithms 275 (1)
7.7.4 Implications for Operating 275 (2)
Systems and Applications
7.7.5 Conclusions 277 (1)
7.8 Time Versus Priority Scheduling 278 (3)
7.8.1 RTOS Scheduling 278 (1)
7.8.2 Perfect World 278 (1)
7.8.3 Real World with Priority 279 (1)
Scheduling
7.8.4 Time Domain Bounded Without 279 (1)
Relinquish
7.8.5 Time Domain Bounded With 280 (1)
Relinquish
7.8.6 Conclusions 280 (1)
7.9 An Embedded File System 281 (2)
7.9.1 Requirements of an Embedded File 282 (1)
System
7.9.2 MS-DOS File System Overview 282 (1)
7.9.3 Long Filenames 283 (1)
7.9.4 Formatting 283 (1)
7.9.5 Partitioning 283 (1)
7.9.6 Devices 283 (1)
7.10 OSEK---An RTOS Standard 283 (4)
7.10.1 About OSEK 284 (1)
7.10.2 OSEK Requirements 284 (1)
7.10.3 OSEK Tasks 285 (1)
7.10.4 Alarms 286 (1)
7.10.5 Error Treatment 286 (1)
Chapter 8 Networking 287 (50)
8.1 What's Wi-Fi? 287 (5)
8.1.1 Wireless Datacom 288 (1)
8.1.2 IEEE 802.11 289 (1)
8.1.3 802.11 Basics 289 (1)
8.1.4 Wi-Fi and Bluetooth 290 (1)
8.1.5 Where Next? 291 (1)
8.2 Who Needs a Web Server? 292 (6)
8.2.1 Introduction 292 (1)
8.2.2 Three Primary Capabilities 292 (2)
8.2.3 Web Servers at Work 294 (2)
8.2.4 Brief Summary of the Web Server's 296 (1)
Capabilities
8.2.5 What Else Should You Consider? 297 (1)
8.2.6 Conclusion 297 (1)
8.3 Introduction to SNMP 298 (4)
8.3.1 Why SNMP? 298 (1)
8.3.2 The Role of Network Manager 299 (1)
8.3.3 Architectural Model 299 (1)
8.3.4 A Common Misperception 299 (1)
8.3.5 Application-Level Manager-Agents 299 (1)
8.3.6 How to Write Your MIB 300 (1)
8.3.7 Terminology 301 (1)
8.3.8 Conclusions 302 (1)
8.4 IPv6---The Next Generation Internet 302 (7)
Protocol
8.4.1 Limitations of the Internet 303 (1)
Protocol
8.4.2 Introduction to IP Version 6 303 (1)
8.4.3 Dual Stack Eases Transition 304 (1)
8.4.4 How IPv6 Works 304 (4)
8.4.5 RFC Support 308 (1)
8.5 The Basics of DHCP 309 (6)
8.5.1 A DHCP Server 309 (1)
8.5.2 Theory of Operation 310 (4)
8.5.3 RFC Support 314 (1)
8.6 NAT Explained 315 (3)
8.6.1 NAT Explained 315 (2)
8.6.2 RFC Support 317 (1)
8.6.3 Protocol Support 317 (1)
8.6.4 Application Level Gateways 318 (1)
8.6.5 The Private Network Address 318 (1)
Assignment
8.7 PPP---Point-to-Point Protocol 318 (6)
8.7.1 Introduction 318 (1)
8.7.2 How PPP Works 319 (2)
8.7.3 PPP Details 321 (3)
8.7.4 RFC Support 324 (1)
8.8 Introduction to SSL 324 (4)
8.8.1 Introduction 325 (1)
8.8.2 How SSL Works 325 (2)
8.8.3 Some SSL Details 327 (1)
8.9 DHCP Debugging Tips 328 (3)
8.10 IP Multicasting 331 (6)
8.10.1 Initializing Multicasting 332 (1)
8.10.2 IGMP Protocol 333 (1)
8.10.3 Implementing Multicasting 333 (2)
8.10.4 Bringing it All Together 335 (2)
Chapter 9 Open Source, Embedded Linux, and 337 (28)
Android
9.1 GNU Toolchain for Embedded 337 (13)
Development: Build or Buy
9.1.1 Introduction 337 (1)
9.1.2 Toolchain Components 338 (2)
9.1.3 Building the Toolchain 340 (4)
9.1.4 Validating the Toolchain 344 (3)
9.1.5 Testing Multiple Options 347 (2)
9.1.6 Conclusions 349 (1)
9.2 Introduction to Linux for Embedded 350 (5)
Systems
9.2.1 Introduction 350 (1)
9.2.2 Challenges Using Open Source 350 (2)
9.2.3 OpenEmbedded 352 (1)
9.2.4 Understanding Metadata 353 (2)
9.2.5 Project Workflow 355 (1)
9.2.6 Summary 355 (1)
9.3 Android Architecture and Deployment 355 (5)
9.3.1 What Is Android? 355 (1)
9.3.2 Android Architecture 356 (1)
9.3.3 Application Development 357 (2)
9.3.4 The Android UI 359 (1)
9.3.5 Extending Android Beyond Mobile 359 (1)
9.3.6 Conclusion 360 (1)
9.4 Android, MeeGo, and Embedded Linux in 360 (5)
Vertical Markets
9.4.1 Introduction 360 (1)
9.4.2 How Vertical Markets Are Different 360 (1)
9.4.3 The Appeal of Android 361 (1)
9.4.4 The Promise of MeeGo 362 (1)
9.4.5 The Versatility of Embedded Linux 363 (1)
9.4.6 Conclusion 363 (2)
Chapter 10 Multicore Embedded Systems 365 (18)
10.1 Introduction to Multicore 365 (2)
10.1.1 System Architecture 365 (1)
10.1.2 Power 366 (1)
10.1.3 Challenges 367 (1)
10.2 Multiple Cores: Multiple Operating 367 (7)
Systems
10.2.1 SMP Hardware for AMP 368 (1)
10.2.2 AMP Hardware Architecture 368 (1)
10.2.3 AMP Software Architecture 369 (1)
10.2.4 The Importance of Inter-Process 370 (1)
Communication
10.2.5 AMP Development Tools 370 (1)
10.2.6 Difficulties 371 (1)
10.2.7 AMP Use Cases 372 (1)
10.2.8 The Use of a Hypervisor 373 (1)
10.2.9 Conclusions 374 (1)
10.3 Selecting Multiple Operating Systems 374 (4)
for Multiple Cores
10.3.1 Introduction 374 (1)
10.3.2 Types of OS 375 (1)
10.3.3 OS Selection 375 (2)
10.3.4 Multicore Systems 377 (1)
10.3.5 Conclusions 378 (1)
10.4 CPU to CPU Communication: MCAPI 378 (5)
10.4.1 Introduction 378 (1)
10.4.2 Multicore 379 (1)
10.4.3 The MCAPI 379 (3)
10.4.4 Conclusion 382 (1)
Afterword 383 (2)
Index 385