Software engineering for embedded systems methods, practical techniques, and applications
Software Engineering for Embedded Systems: Methods, Practical Techniques, and Applications, Second Edition provides the techniques and technologies in software engineering to optimally design and implement an embedded system. Written by experts with a solution focus, this encyclopedic reference give...
Otros Autores: | , , |
---|---|
Formato: | Libro electrónico |
Idioma: | Inglés |
Publicado: |
Oxford :
Elsevier
[2019]
|
Edición: | Second edition |
Materias: | |
Ver en Biblioteca Universitat Ramon Llull: | https://discovery.url.edu/permalink/34CSUC_URL/1im36ta/alma991009630595406719 |
Tabla de Contenidos:
- Front Cover
- Software Engineering for Embedded Systems
- Copyright
- Contents
- Contributors
- Acknowledgments
- 1 Software Engineering for Embedded and Real-Time Systems
- 1 Software Engineering
- 2 Embedded Systems
- 2.1 Embedded Systems Are Reactive Systems
- 3 Real-Time Systems
- 3.1 Types of Real-Time Systems-Soft and Hard
- 3.2 Differences Between Real-Time and Time-Shared Systems
- 4 Example of a Hard Real-Time System
- 4.1 Based on Signal Sample, Time to Perform Actions Before Next Sample Arrives
- 4.2 Hard Real-Time Systems
- 5 Real-Time Event Characteristics
- 5.1 Real-Time Event Categories
- 5.2 Efficient Execution and the Execution Environment
- 5.2.1 Efficiency Overview
- 5.2.2 Resource Management
- 6 Challenges in Real-Time System Design
- 6.1 Response Time
- 6.2 Recovering From Failures
- 7 The Embedded System's Software Build Process
- 8 Distributed and Multiprocessor Architectures
- 9 Software for Embedded Systems
- 9.1 Super Loop Architecture
- 9.2 Power-Saving Super Loop
- 9.3 Window Lift Embedded Design
- 10 Hardware Abstraction Layers for Embedded Systems
- 2 Software Development Process
- 1 Getting Started
- 1.1 Project Planning
- 1.2 Risk Management
- 1.3 Kicking Off the Project
- 2 Requirements
- 2.1 User Requirements
- 2.2 System Requirements
- 3 Architecture
- 3.1 Safety-Critical Elements
- 3.2 Operating Performance
- 3.3 Security
- 3.4 Reliability and Availability
- 4 Design
- 4.1 Object-Oriented Programming
- 4.1.1 System Context
- 4.1.2 Class Identification
- 4.1.3 Design Modeling
- 4.2 Real-Time Design
- 5 Implementation
- 6 Testing
- 6.1 Validation and Verification
- 6.2 Integration Testing
- 6.3 Release Testing
- 6.4 Performance Testing
- 7 Rolling It Together: Agile Development.
- 7.1 Scaling for Complexity/Organization
- 7.2 Roles
- 7.3 Keep Your Plans!
- 7.4 Meetings for Planning
- 7.4.1 Quarterly Release Planning
- 7.4.2 Sprint Planning
- 7.5 Plan for Your Unplanned
- 7.6 Documentation
- 7.6.1 Requirements vs. Acceptance Criteria
- 7.7 Go With the Flow
- 7.7.1 Agile Ceremonies Promote and Increase Flow
- 7.7.1.1 Feature Writing, Decomposition, and Grooming
- 7.7.1.2 Detailed Documents and Meetings
- 7.7.1.2.1 Sprint Backlog Grooming
- 7.7.1.2.2 Daily Scrum
- 7.7.1.2.3 Sprint Demo
- 7.7.1.2.4 Release Demo
- 7.7.1.2.5 Sprint Retro
- 7.7.2 Agile Flow Exists Within and Between Sprints
- 7.7.2.1 Within Sprints
- 7.7.2.1.1 Work Item Fields and States
- 7.7.2.1.1.1 User Story Cycle
- 7.7.2.1.1.2 How Do We Write User Stories and How Granular Should They Be?
- 7.7.2.1.2 Vertical Slices
- 7.7.2.2 Between Sprints
- 7.7.3 Product vs. Project Teams Have Different Flows
- 7.7.4 Supporting the Team's Flow
- 7.7.5 ART Flow
- 8 Advanced Topics
- 8.1 Metrics and Transparency
- 8.1.1 Metrics: Some is Better Than None
- 8.1.2 Getting Comfortable With Data
- 8.1.3 The Export vs. Live Data Paradigm
- 8.1.3.1 Inspecting and Adapting With Metrics
- 8.2 Tooling
- 8.2.1 Tooling and Metrics
- 8.3 Agile and Alignments
- 9 Conclusion
- Exercises
- References
- Further Reading
- 3 Embedded and Multicore System Architecture-Design and Optimization
- 1 Introduction
- 2 The Right Way and the Wrong Way
- 3 Understanding Requirements
- 4 Mapping the Application
- 4.1 Performance Calculations to Map the Application to Hardware
- 4.1.1 How Many Channels Can the Core Handle?
- 4.1.2 Are the I/O and Memory Capable of This Many Channels?
- 4.2 How the Estimation Results Drive Options
- 5 Helping the Compiler and Build Tools.
- 5.1 Choosing Algorithmic Components to Work With Compilers and Architectures
- 6 Power Optimization
- 4 Basic Programming Techniques
- 1 Introduction
- 2 Reference Platform Overview
- 2.1 Understanding Hardware
- 3 SDK Installation
- 3.1 Download and Installation
- 3.2 Building a Project
- 3.3 Debugging the Project
- 4 Target System Configuration and Initialization
- 4.1 System Reset
- 4.2 Clock Configuration
- 4.3 I/O Pin Configuration
- 4.4 I/O Pin Initialization
- 4.5 SDK I/O Helper Routines
- 5 Programming Examples
- 5.1 General Purpose I/O-Blinking LED
- 5.2 Basic Serial I/O-Polled UART Send/Receive
- 5.3 Overview of Interrupt Handlers
- 5.4 Basic Timer Operation-Low-Power Timer (LPTMR)
- 6 Summary
- Questions and Answers
- 5 Programming and Implementation Guidelines
- 1 Introduction
- 1.1 Principles of High-Quality Programming
- 1.1.1 Readability
- 1.1.2 Maintainability
- 1.1.3 Testability
- 1.2 What Sets Embedded Apart From General Programming
- 2 Starting the Embedded Software Project
- 2.1 Hardware Platform Input
- 2.2 Project Files/Organization
- 2.2.1 Source Files Written Locally
- 2.2.2 Source Files From Company Libraries
- 2.2.3 Libraries From Third Parties
- 2.2.4 Libraries From Compiler/Linker Toolsets
- 2.3 Team Programming Guidelines
- 2.4 Syntax Standard
- 2.4.1 Code WhiteSpace
- 2.4.2 Tabs in Source Files
- 2.4.3 Alignment Within Source
- 2.5 Safety Requirements in Source Code
- 3 Variable Structure
- 3.1 Variable Declarations
- 3.1.1 Global Variables
- 3.1.2 File-Scope Variables
- 3.1.3 Local Variables
- 3.2 Data Types
- 3.3 Definitions
- 3.3.1 Conditional Compilation
- 3.3.2 #Define
- Content Learning Exercises
- 6 Operating Systems
- 1 Foreground/Background Systems
- 2 Real-Time Kernels.
- 3 RTOS (Real-Time Operating System)
- 3.1 Critical Sections
- 3.2 Task Management
- 4 Assigning Task Priorities
- 5 Determining the Size of a Stack
- 5.1 The Idle Task
- 5.2 Priority Levels
- 5.3 The Ready List
- 6 Preemptive Scheduling
- 7 Scheduling Points
- 8 Round-Robin Scheduling
- 9 Context Switching
- 10 Interrupt Management
- 10.1 Handling CPU Interrupts
- 10.2 NonKernel-Aware Interrupt Service Routine (ISR)
- 10.3 Processors with Multiple Interrupt Priorities
- 10.4 All Interrupts Vector to a Common Location
- 10.5 Every Interrupt Vectors to a Unique Location
- 11 The Clock Tick (or System Tick)
- 11.1 Wait Lists
- 11.2 Time Management
- 12 Resource Management
- 12.1 Resource Management-Disable/Enable Interrupts
- 12.2 Resource Management-Semaphores
- 12.3 Resource Management-Notes on Semaphores
- 12.4 Resource Management-Priority Inversions
- 12.5 Resource Management-Mutual Exclusion Semaphores (Mutex)
- 12.6 Resource Management-Deadlocks (or Deadly Embrace)
- 13 Synchronization
- 13.1 Synchronization-Semaphores
- 13.2 Synchronization-Credit Tracking
- 14 Bilateral Rendez-vous
- 15 Message Passing
- 15.1 Messages
- 15.2 Message Queues
- 16 Flow Control
- 17 Clients and Servers
- 17.1 Memory Management
- 18 Summary
- 7 Open-Source Software
- 1 Linux
- 1.1 History of Linux
- 1.1.1 Reason for the Exponential Acceptance of Linux
- 1.1.2 Linux and Embedded Systems
- 1.2 How Embedded Linux is Different From Linux?
- 1.3 Major Features of Linux
- 1.3.1 Portability
- 1.3.1.1 Supported CPU Architectures
- 1.3.1.2 POSIX Compliance
- 1.3.2 Support of a Wide Variety of Peripheral Devices
- 1.3.3 Complete Network Stack Solution
- 1.3.4 Variety of Task Schedulers
- 1.3.5 Security
- 1.3.6 User Space Drivers
- 1.3.7 Endianness
- 1.3.8 Debuggability.
- 1.4 Benefits of Using Linux
- 1.4.1 Free of Cost
- 1.4.2 Time to Market
- 1.4.3 No "Vendor Lock-in"
- 1.4.4 Highly Stable Operating System
- 1.4.5 Low Maintenance
- 1.4.5.1 Supporting Software Releases After Shipping the Product
- 1.4.5.2 Keeping Your Own Drivers up to Date With the Latest Kernel
- 1.5 Linux Architecture
- 1.5.1 Linux Kernel Components
- 1.5.1.1 Device Driver Framework
- 1.5.1.2 Schedulers
- 1.5.1.3 Interrupt
- 1.5.1.4 Memory Management
- 1.5.1.5 Communication Protocol Stack
- 1.5.1.6 User Interface (UI)
- 1.6 Build Environment
- 1.6.1 Kernel Compilation
- 1.6.2 Root Filesystem
- 1.6.2.1 Yocto
- 1.7 Customizing Linux
- 1.7.1 Low Memory Footprint
- 1.7.2 Boot Performance
- 1.7.3 High Throughput Performance
- 1.7.3.1 Core Affinity
- 1.7.3.2 Interrupt Coalescing
- 1.7.3.3 User Space Mapping of Buffers
- 1.7.3.4 User Space Drivers
- 1.7.4 Latencies
- 1.8 Linux Development and its Open-Source Ecosystem
- 1.8.1 Linux Versions
- 1.8.2 Long-Term Support (LTS) Linux Version
- 1.8.3 Related Open-Source Communities
- 1.8.3.1 Linux Foundation
- 1.8.3.2 Linaro
- 1.8.4 Linux-Based Distributions
- 1.8.4.1 Android
- 1.8.4.2 Ubuntu
- 1.9 Coding Guidelines
- 1.10 Code Review in the Upstream Community
- 1.11 License
- 2 U-Boot
- 2.1 U-Boot and its Applicability to Several Types of Devices
- 2.2 Major Features of U-Boot
- 2.2.1 Multiple Boot Source Support
- 2.2.2 Shell (User Interface)
- 2.2.3 Environment Variables
- 2.2.4 Scripts
- 2.2.5 Stand-Alone Applications
- 2.2.6 Operating System Boot Commands
- 2.2.7 Autoboot
- 2.2.8 Sandbox U-Boot
- 2.3 U-Boot Directory Organization
- 2.4 U-Boot Architecture and Memory Footprint
- 2.4.1 Single-Stage Boot Loader
- 2.4.2 Two-Stage Boot Loader
- 2.5 Fast Boot Approach
- 2.6 Secure Boot.
- 2.7 Supported Architectures and Operating Systems.