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 Tick? |
|
|
1 | (7) |
|
1.1.1 Development Challenges |
|
|
2 | (1) |
|
|
3 | (1) |
|
1.1.3 Real-Time Operating System |
|
|
4 | (1) |
|
|
5 | (1) |
|
|
5 | (1) |
|
|
5 | (1) |
|
|
6 | (2) |
|
|
8 | (1) |
|
1.2 Memory in Embedded Systems |
|
|
8 | (4) |
|
|
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) |
|
|
12 | (6) |
|
|
12 | (1) |
|
1.3.2 Flat Single-Space Memory |
|
|
13 | (1) |
|
|
13 | (1) |
|
1.3.4 Bank-Switched Memory |
|
|
14 | (1) |
|
1.3.5 Multiple-Space Memory |
|
|
15 | (2) |
|
|
17 | (1) |
|
|
17 | (1) |
|
1.3.8 Memory Management Units |
|
|
17 | (1) |
|
|
18 | (1) |
|
1.4 How Software Influences Hardware Design |
|
|
18 | (4) |
|
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) |
|
|
20 | (1) |
|
|
21 | (1) |
|
|
22 | (1) |
|
1.5 Migrating Your Software to a New Processor Architecture |
|
|
22 | (7) |
|
|
22 | (3) |
|
|
25 | (1) |
|
1.5.3 Processor Migration and Open Standards |
|
|
26 | (3) |
|
|
29 | (1) |
|
1.6 Embedded Software for Transportation Applications |
|
|
29 | (4) |
|
|
29 | (1) |
|
1.6.2 Transportation System Characteristics |
|
|
29 | (1) |
|
|
30 | (1) |
|
1.6.4 Real-Time Operating System Factors |
|
|
31 | (1) |
|
|
32 | (1) |
|
1.7 How to Choose a CPU for Your System on Chip Design |
|
|
33 | (3) |
|
|
33 | (1) |
|
|
33 | (1) |
|
1.7.3 Memory Architecture and Protection |
|
|
34 | (1) |
|
|
34 | (1) |
|
|
35 | (1) |
|
|
35 | (1) |
|
|
35 | (1) |
|
|
35 | (1) |
|
|
36 | (1) |
|
1.8 An Introduction to USB Software |
|
|
36 | (4) |
|
|
36 | (1) |
|
|
37 | (1) |
|
|
37 | (1) |
|
|
38 | (1) |
|
1.8.5 USB and Embedded Systems |
|
|
39 | (1) |
|
|
40 | (1) |
|
|
40 | (7) |
|
|
41 | (1) |
|
|
41 | (1) |
|
1.9.3 Cables and Connectors |
|
|
41 | (1) |
|
|
41 | (1) |
|
1.9.5 Bidirectional Protocol Flow |
|
|
41 | (1) |
|
|
42 | (1) |
|
1.9.7 USB 3.0 Power Management |
|
|
43 | (1) |
|
|
43 | (1) |
|
1.9.9 xHCI---New Host Controller Interface |
|
|
43 | (1) |
|
1.9.10 Future Applications for USB |
|
|
43 | (1) |
|
|
44 | (1) |
|
|
45 | (2) |
|
Chapter 2 Design and Development |
|
|
47 | (54) |
|
2.1 Emerging Technology for Embedded Systems Software Development |
|
|
47 | (7) |
|
2.1.1 Microprocessor Device Technology |
|
|
48 | (1) |
|
2.1.2 System Architecture |
|
|
48 | (2) |
|
|
50 | (1) |
|
|
51 | (1) |
|
2.1.5 Programming Languages |
|
|
52 | (1) |
|
2.1.6 Software Team Size and Distribution |
|
|
52 | (1) |
|
|
53 | (1) |
|
|
53 | (1) |
|
|
54 | (1) |
|
2.2 Making Development Tool Choices |
|
|
54 | (11) |
|
2.2.1 The Development Tool Chain |
|
|
54 | (1) |
|
|
55 | (1) |
|
2.2.3 Extensions for Embedded Systems |
|
|
56 | (2) |
|
|
58 | (1) |
|
2.2.5 Build Tools: Key Issues Recapped |
|
|
59 | (1) |
|
|
59 | (4) |
|
2.2.7 Debug Tools: Key Issues Recapped |
|
|
63 | (1) |
|
2.2.8 Standards and Development Tool Integration |
|
|
63 | (1) |
|
2.2.9 Implications of Selections |
|
|
64 | (1) |
|
|
65 | (1) |
|
2.3 Eclipse---Bringing Embedded Tools Together |
|
|
65 | (4) |
|
|
65 | (1) |
|
2.3.2 Eclipse Platform Philosophy |
|
|
66 | (1) |
|
|
66 | (1) |
|
2.3.4 How Eclipse Gets Embedded |
|
|
67 | (2) |
|
|
69 | (1) |
|
2.4 A Development System That Crosses RTOS Boundaries |
|
|
69 | (4) |
|
2.4.1 Are Standards the Solution? |
|
|
69 | (1) |
|
2.4.2 The Eclipse Solution |
|
|
70 | (1) |
|
|
70 | (1) |
|
|
71 | (1) |
|
2.4.5 Eclipse User Advantages |
|
|
71 | (1) |
|
|
71 | (1) |
|
2.4.7 Nonembedded Plug-Ins |
|
|
72 | (1) |
|
2.5 Embedded Software and UML |
|
|
73 | (12) |
|
|
73 | (4) |
|
2.5.2 Separating Application from Architecture |
|
|
77 | (4) |
|
2.5.3 xtUML Code Generation |
|
|
81 | (3) |
|
|
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) |
|
|
90 | (1) |
|
2.7 Software and Power Consumption |
|
|
90 | (11) |
|
|
90 | (2) |
|
|
92 | (2) |
|
2.7.3 Power Control in Software |
|
|
94 | (2) |
|
|
96 | (1) |
|
|
97 | (2) |
|
2.7.6 Virtual Programming |
|
|
99 | (1) |
|
|
99 | (2) |
|
|
101 | (24) |
|
3.1 Programming for Exotic Memories |
|
|
101 | (4) |
|
|
101 | (1) |
|
|
102 | (2) |
|
|
104 | (1) |
|
|
105 | (1) |
|
3.2 Self-Testing in Embedded Systems |
|
|
105 | (4) |
|
|
105 | (3) |
|
3.2.2 Input/Output Devices |
|
|
108 | (1) |
|
3.2.3 Multithreading Issues |
|
|
108 | (1) |
|
|
109 | (1) |
|
|
109 | (1) |
|
|
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 Interpreter---Requirements |
|
|
111 | (1) |
|
3.3.4 Designing a Command-Line Interpreter |
|
|
111 | (1) |
|
3.3.5 A CLI Implementation |
|
|
112 | (1) |
|
|
113 | (5) |
|
|
118 | (1) |
|
3.4 Traffic Lights: An Embedded Software Application |
|
|
118 | (7) |
|
|
119 | (1) |
|
3.4.2 Hardware Configuration |
|
|
119 | (1) |
|
3.4.3 Program Implementation |
|
|
119 | (1) |
|
|
120 | (1) |
|
|
121 | (1) |
|
|
122 | (1) |
|
|
122 | (1) |
|
3.4.8 Using Global Variables |
|
|
123 | (2) |
|
|
125 | (52) |
|
|
125 | (3) |
|
4.2 Using C Function Prototypes |
|
|
128 | (2) |
|
|
128 | (1) |
|
4.2.2 Applying Prototypes |
|
|
129 | (1) |
|
|
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) |
|
|
134 | (4) |
|
|
135 | (1) |
|
|
135 | (1) |
|
4.4.3 Bit Fields in Structures |
|
|
135 | (1) |
|
4.4.4 Microprocessor Bit-Field Instructions |
|
|
136 | (1) |
|
4.4.5 I/O Devices and Bit Fields |
|
|
137 | (1) |
|
|
138 | (1) |
|
4.5 Programming Floating-Point Applications |
|
|
138 | (3) |
|
|
138 | (1) |
|
4.5.2 Running the Test Case |
|
|
139 | (1) |
|
|
140 | (1) |
|
|
140 | (1) |
|
4.6 Looking at C---A Different Perspective |
|
|
141 | (3) |
|
|
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 Smart |
|
|
142 | (1) |
|
|
143 | (1) |
|
4.7 Reducing Function Call Overhead |
|
|
144 | (4) |
|
4.7.1 Compilers and Structured Code |
|
|
144 | (1) |
|
|
145 | (1) |
|
|
145 | (1) |
|
|
145 | (1) |
|
|
146 | (1) |
|
4.7.6 Stack Frame Generation |
|
|
146 | (2) |
|
|
148 | (1) |
|
|
148 | (1) |
|
4.8 Structure Layout---Become an Expert |
|
|
148 | (14) |
|
|
149 | (4) |
|
|
153 | (1) |
|
4.8.3 Tips and Techniques |
|
|
154 | (8) |
|
4.9 Memory and Programming in C |
|
|
162 | (2) |
|
|
163 | (1) |
|
|
163 | (1) |
|
|
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) |
|
|
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) |
|
|
175 | (2) |
|
|
177 | (52) |
|
5.1 C++ in Embedded Systems---A Management Perspective |
|
|
177 | (2) |
|
5.1.1 Embedded Systems Development Teams |
|
|
177 | (1) |
|
5.1.2 Object-Oriented Programming |
|
|
178 | (1) |
|
5.1.3 Team Management and Object-Oriented Techniques |
|
|
178 | (1) |
|
5.1.4 C++ as an Object-Oriented Language |
|
|
178 | (1) |
|
|
179 | (1) |
|
|
179 | (1) |
|
5.2 Why Convert from C to C++? |
|
|
179 | (6) |
|
5.2.1 Hide Implementation Details |
|
|
180 | (1) |
|
|
180 | (1) |
|
5.2.3 Reuse Generic Classes |
|
|
181 | (1) |
|
|
181 | (1) |
|
5.2.5 Derive Classes from Base Classes |
|
|
181 | (1) |
|
5.2.6 Avoid Errors Through Function Prototyping |
|
|
182 | (1) |
|
5.2.7 Add Parameters Without Changing Function Calls |
|
|
182 | (1) |
|
5.2.8 Using Safer, Simpler I/O |
|
|
182 | (1) |
|
5.2.9 Improve Performance with Fast Inline Functions |
|
|
183 | (1) |
|
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) |
|
|
186 | (1) |
|
5.3.3 Applying Reusability |
|
|
186 | (1) |
|
|
187 | (4) |
|
|
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) |
|
|
199 | (1) |
|
|
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) |
|
|
203 | (3) |
|
5.5.5 EHS and Embedded Systems |
|
|
206 | (1) |
|
|
206 | (1) |
|
5.6 Looking at Code Size and Performance with C++ |
|
|
207 | (7) |
|
5.6.1 How Efficient Is C++ Compared to C? |
|
|
207 | (1) |
|
5.6.2 How C++ Affects Application Memory Requirements |
|
|
208 | (4) |
|
|
212 | (1) |
|
|
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) |
|
|
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) |
|
|
221 | (1) |
|
5.7.9 Expertise Encapsulated |
|
|
222 | (1) |
|
5.7.10 Other Possibilities |
|
|
223 | (1) |
|
|
223 | (1) |
|
5.8 Using Nonvolatile RAM with C++ |
|
|
223 | (6) |
|
5.8.1 Requirements of Using Nonvolatile RAM with C++ |
|
|
223 | (1) |
|
5.8.2 NVRAM Implementation |
|
|
224 | (1) |
|
|
224 | (3) |
|
5.8.4 Enhancing the nvram Class |
|
|
227 | (1) |
|
|
227 | (1) |
|
|
228 | (1) |
|
|
229 | (14) |
|
|
229 | (3) |
|
6.1.1 Implementing an RTS |
|
|
230 | (1) |
|
|
230 | (1) |
|
|
230 | (1) |
|
|
231 | (1) |
|
|
232 | (1) |
|
6.2 Visualizing Program Models of Embedded Systems |
|
|
232 | (4) |
|
6.2.1 Which Programming Model Is Best for Building Real-Time Systems? |
|
|
232 | (1) |
|
6.2.2 What Purpose Do Models Serve for a Real-Time System? |
|
|
232 | (1) |
|
6.2.3 What Differences Exist Between Models, and What Gains Require What Sacrifices? |
|
|
233 | (1) |
|
6.2.4 What Is the Single-Threaded Programming Model? |
|
|
233 | (1) |
|
6.2.5 What Are the Advantages and Disadvantages of the Single-Threaded Programming Model? |
|
|
233 | (1) |
|
6.2.6 Is a Polling Loop a Single-Threaded Program? |
|
|
233 | (1) |
|
6.2.7 Is a State Machine a Single-Threaded Program? |
|
|
234 | (1) |
|
6.2.8 What Is a Multi-Threaded System? |
|
|
234 | (1) |
|
6.2.9 What Are the Advantages and Disadvantages of the Multi-Threaded Programming Model? |
|
|
234 | (1) |
|
6.2.10 Can Multiple Threads of Execution Really Run Simultaneously on One CPU? |
|
|
235 | (1) |
|
6.2.11 How Can a Multi-Threaded Environment for a Real-Time System Be Acquired? |
|
|
235 | (1) |
|
6.3 Event Handling in Embedded Systems |
|
|
236 | (3) |
|
|
236 | (1) |
|
6.3.2 Is a Signal the Same Thing as an Event? |
|
|
237 | (1) |
|
6.3.3 What Events Are the Most Time Critical? |
|
|
237 | (1) |
|
6.3.4 What Does the Microprocessor Do When it Detects an Exception? |
|
|
237 | (1) |
|
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 and Serviced? |
|
|
238 | (1) |
|
6.3.9 What State Gets Saved by the CPU? |
|
|
238 | (1) |
|
6.3.10 Is the Machine State the Same as the Thread State? |
|
|
238 | (1) |
|
6.3.11 Should I Write Exception Handlers in Assembly Language or in C? |
|
|
239 | (1) |
|
6.3.12 How Do I Avoid Doing Work in the Exception Handler? |
|
|
239 | (1) |
|
6.4 Programming for Interrupts |
|
|
239 | (4) |
|
6.4.1 Setting up Interrupts |
|
|
240 | (1) |
|
6.4.2 Interrupt Service Routines |
|
|
240 | (1) |
|
|
241 | (1) |
|
|
241 | (1) |
|
|
241 | (2) |
|
Chapter 7 Real-Time Operating Systems |
|
|
243 | (44) |
|
7.1 Debugging Techniques with an RTOS |
|
|
243 | (11) |
|
|
243 | (1) |
|
7.1.2 Multiprocess Concept |
|
|
244 | (1) |
|
7.1.3 Execution Environment |
|
|
245 | (1) |
|
|
246 | (1) |
|
|
247 | (1) |
|
7.1.6 RTOS-Aware Debugging Functionality |
|
|
248 | (2) |
|
|
250 | (1) |
|
7.1.8 Task-Aware Breakpoints |
|
|
250 | (1) |
|
|
251 | (1) |
|
7.1.10 Memory Management Units |
|
|
252 | (1) |
|
7.1.11 Multiple Processors |
|
|
253 | (1) |
|
|
254 | (1) |
|
7.2 A Debugging Solution for a Custom Real-Time Operating System |
|
|
254 | (4) |
|
7.2.1 Implementing Task-Aware Debugging |
|
|
255 | (1) |
|
7.2.2 Task-Awareness Facilities |
|
|
256 | (2) |
|
|
258 | (1) |
|
7.3 Debugging---Stack Overflows |
|
|
258 | (1) |
|
|
259 | (1) |
|
7.4 Bring in the Pros---When to Consider a Commercial RTOS |
|
|
259 | (6) |
|
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 RTOS |
|
|
262 | (1) |
|
|
263 | (2) |
|
|
265 | (6) |
|
7.5.1 Migrating from One RTOS to Another |
|
|
265 | (1) |
|
|
265 | (1) |
|
|
266 | (3) |
|
|
269 | (1) |
|
|
269 | (1) |
|
|
269 | (2) |
|
7.6 Introduction to RTOS Driver Development |
|
|
271 | (3) |
|
7.6.1 The Two Sides of a Device Driver |
|
|
272 | (1) |
|
|
272 | (1) |
|
|
272 | (1) |
|
|
273 | (1) |
|
|
274 | (1) |
|
7.7 Scheduling Algorithms and Priority Inversion |
|
|
274 | (4) |
|
|
274 | (1) |
|
7.7.2 Real-Time Requirements |
|
|
274 | (1) |
|
7.7.3 Scheduling Algorithms |
|
|
275 | (1) |
|
7.7.4 Implications for Operating Systems and Applications |
|
|
275 | (2) |
|
|
277 | (1) |
|
7.8 Time Versus Priority Scheduling |
|
|
278 | (3) |
|
|
278 | (1) |
|
|
278 | (1) |
|
7.8.3 Real World with Priority Scheduling |
|
|
279 | (1) |
|
7.8.4 Time Domain Bounded Without Relinquish |
|
|
279 | (1) |
|
7.8.5 Time Domain Bounded With Relinquish |
|
|
280 | (1) |
|
|
280 | (1) |
|
7.9 An Embedded File System |
|
|
281 | (2) |
|
7.9.1 Requirements of an Embedded File System |
|
|
282 | (1) |
|
7.9.2 MS-DOS File System Overview |
|
|
282 | (1) |
|
|
283 | (1) |
|
|
283 | (1) |
|
|
283 | (1) |
|
|
283 | (1) |
|
7.10 OSEK---An RTOS Standard |
|
|
283 | (4) |
|
|
284 | (1) |
|
|
284 | (1) |
|
|
285 | (1) |
|
|
286 | (1) |
|
|
286 | (1) |
|
|
287 | (50) |
|
|
287 | (5) |
|
|
288 | (1) |
|
|
289 | (1) |
|
|
289 | (1) |
|
8.1.4 Wi-Fi and Bluetooth |
|
|
290 | (1) |
|
|
291 | (1) |
|
8.2 Who Needs a Web Server? |
|
|
292 | (6) |
|
|
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 Capabilities |
|
|
296 | (1) |
|
8.2.5 What Else Should You Consider? |
|
|
297 | (1) |
|
|
297 | (1) |
|
|
298 | (4) |
|
|
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) |
|
|
301 | (1) |
|
|
302 | (1) |
|
8.4 IPv6---The Next Generation Internet Protocol |
|
|
302 | (7) |
|
8.4.1 Limitations of the Internet Protocol |
|
|
303 | (1) |
|
8.4.2 Introduction to IP Version 6 |
|
|
303 | (1) |
|
8.4.3 Dual Stack Eases Transition |
|
|
304 | (1) |
|
|
304 | (4) |
|
|
308 | (1) |
|
|
309 | (6) |
|
|
309 | (1) |
|
8.5.2 Theory of Operation |
|
|
310 | (4) |
|
|
314 | (1) |
|
|
315 | (3) |
|
|
315 | (2) |
|
|
317 | (1) |
|
|
317 | (1) |
|
8.6.4 Application Level Gateways |
|
|
318 | (1) |
|
8.6.5 The Private Network Address Assignment |
|
|
318 | (1) |
|
8.7 PPP---Point-to-Point Protocol |
|
|
318 | (6) |
|
|
318 | (1) |
|
|
319 | (2) |
|
|
321 | (3) |
|
|
324 | (1) |
|
|
324 | (4) |
|
|
325 | (1) |
|
|
325 | (2) |
|
|
327 | (1) |
|
|
328 | (3) |
|
|
331 | (6) |
|
8.10.1 Initializing Multicasting |
|
|
332 | (1) |
|
|
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 Android |
|
|
337 | (28) |
|
9.1 GNU Toolchain for Embedded Development: Build or Buy |
|
|
337 | (13) |
|
|
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) |
|
|
349 | (1) |
|
9.2 Introduction to Linux for Embedded Systems |
|
|
350 | (5) |
|
|
350 | (1) |
|
9.2.2 Challenges Using Open Source |
|
|
350 | (2) |
|
|
352 | (1) |
|
9.2.4 Understanding Metadata |
|
|
353 | (2) |
|
|
355 | (1) |
|
|
355 | (1) |
|
9.3 Android Architecture and Deployment |
|
|
355 | (5) |
|
|
355 | (1) |
|
9.3.2 Android Architecture |
|
|
356 | (1) |
|
9.3.3 Application Development |
|
|
357 | (2) |
|
|
359 | (1) |
|
9.3.5 Extending Android Beyond Mobile |
|
|
359 | (1) |
|
|
360 | (1) |
|
9.4 Android, MeeGo, and Embedded Linux in Vertical Markets |
|
|
360 | (5) |
|
|
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) |
|
|
363 | (2) |
|
Chapter 10 Multicore Embedded Systems |
|
|
365 | (18) |
|
10.1 Introduction to Multicore |
|
|
365 | (2) |
|
10.1.1 System Architecture |
|
|
365 | (1) |
|
|
366 | (1) |
|
|
367 | (1) |
|
10.2 Multiple Cores: Multiple Operating Systems |
|
|
367 | (7) |
|
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 Communication |
|
|
370 | (1) |
|
10.2.5 AMP Development Tools |
|
|
370 | (1) |
|
|
371 | (1) |
|
|
372 | (1) |
|
10.2.8 The Use of a Hypervisor |
|
|
373 | (1) |
|
|
374 | (1) |
|
10.3 Selecting Multiple Operating Systems for Multiple Cores |
|
|
374 | (4) |
|
|
374 | (1) |
|
|
375 | (1) |
|
|
375 | (2) |
|
|
377 | (1) |
|
|
378 | (1) |
|
10.4 CPU to CPU Communication: MCAPI |
|
|
378 | (5) |
|
|
378 | (1) |
|
|
379 | (1) |
|
|
379 | (3) |
|
|
382 | (1) |
Afterword |
|
383 | (2) |
Index |
|
385 | |